Formule matricielle en VBA... ou pas...

Fchris

XLDnaute Occasionnel
Bonjour à tous,

Je viens vers vous afin de tenter de résoudre une problématique qui se pose à moi.

Dans le fichier joint, deux onglets. Le premier, "base simple" sont les données brutes telles que je les reçois.

Colonne B nommée Matricule, colonne D nommée Dates. J'ai autant de ligne par matricule que d'interventions réalisées.

J'ai créé un second onglet "Filtre", sans doublon de matricules. La formule matricielle suivante
{=SOMME(SI(Matricule=$B2;1/NB.SI.ENS(Matricule;$B2;Dates;Dates)))}
me permet d'obtenir le nombre de jours réels d'intervention. Plusieurs intervention le même jour = 1 jour d'intervention.

Pour des besoins d'automatisation des traitements, j'ai besoin de retranscrire tout ceci sous vba.

J'ai tenté de la façon suivante, mais sans résultat :

Sub Macro1()
Dim Mat As Range
Dim Dt As Range

Set Mat = Range("B1:B574")
Set Dt = Range("F1:F574")

Range("E2").Value = Application.WorksheetFunction.SumIfs(Mat = Range("B2"), 1 / (Application.WorksheetFunction.CountIfs(Mat, Range("B2"), Dt, Dt)))

End Sub

Merci par avance de votre aide.
 

Pièces jointes

  • Calculer les vacations.xlsm
    42 KB · Affichages: 39

Fchris

XLDnaute Occasionnel
Bonjour Pierrejean,

Merci beaucoup, c'est parfait comme toujours ;)

C'est à dire surpris du temps d'exécution ? dans le bon sens ? car chez moi c'est ultra rapide, aucune latence. Après avoir supprimer les formules matricielles qui étaient restées dans le tableau et se recalculaient en même temps que l'exécution de la macro...

Merci encore
 

Fchris

XLDnaute Occasionnel
Pierrejean,

Désolé de te déranger à nouveau, mais j'ai un petit soucis avec la macro.

Je l'ai copiée dans un autre module sur un autre classeur en adaptant les noms de feuilles ainsi que les plages de cellules à mon besoin, mais j'obtiens le message d'erreur suivant :

Variable non définie "tablo="

Il y a quelque chose qui m'échappe car je n'ai rien changé entre ton code d'origine et sa copie... et je ne vois nulle part de définition de variable

Edit : je viens de trouver l'origine du problème, j'ai copié le code dans un module avec un option explicit... Je l'ai mis dans un module à part et cela fonctionne à merveille :)
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Bonjour à tous.

Essai avec un autre code :
VB:
Sub test()
Dim i&, j&, k&, h&, d, s, p(), r()
  p = Worksheets("base simple").Range("matricule").Resize(, 4).Offset(, -1).Value
  h = UBound(p)
  ReDim q(1 To h, 2)
  For i = 2 To h: q(i, 0) = p(i, 2): q(i, 1) = i: q(i, 2) = p(i, 2) & Right$(String$(6, "0") & CLng(p(i, 4)), 6): Next
  For i = 2 To h - 1
    s = q(i, 2): d = q(i, 1)
    For j = i + 1 To h
      If s > q(j, 2) Then q(i, 2) = q(j, 2): q(j, 2) = s: s = q(i, 0): q(i, 0) = q(j, 0): q(j, 0) = s: s = q(i, 2): q(i, 1) = q(j, 1): q(j, 1) = d: d = q(i, 1)
    Next
  Next
  s = ""
  ReDim r(1 To 3, k)
  r(1, 0) = p(1, 1): r(2, 0) = p(1, 2): r(3, 0) = "Nombre de jours"
  For i = 2 To h
    If s = p(q(i, 1), 2) Then
      If d <> p(q(i, 1), 4) Then r(3, k) = r(3, k) + 1: d = p(q(i, 1), 4)
    Else
      s = p(q(i, 1), 2): d = p(q(i, 1), 4)
      k = k + 1
      ReDim Preserve r(1 To 3, k)
      r(1, k) = p(q(i, 1), 1): r(2, k) = p(q(i, 1), 2): r(3, k) = 1
    End If
  Next
  For i = 2 To k - 1
    s = r(2, i)
    For j = i + 1 To k
      If s > r(2, j) Then r(2, i) = r(2, j): r(2, j) = s: s = r(1, i): r(1, i) = r(1, j): r(1, j) = s: s = r(3, i): r(3, i) = r(3, j): r(3, j) = s: s = r(2, i)
    Next
  Next
  With Worksheets("Filtre").Range("A1"): .CurrentRegion.ClearContents: .Resize(k + 1, 3).Value = WorksheetFunction.Transpose(r): End With
End Sub
L'onglet base simple n'a pas besoin d'être préalablement ordonné.

Bonne journée.


ℝOGER2327
#8463


Jeudi 26 Décervelage 144 (Escrime - Vacuation)
4 Pluviôse An CCXXV, 5,9228h - perce-neige
2017-W04-1T14:12:53Z
 

Pièces jointes

  • Copie de Calculer les vacations.xlsm
    46.7 KB · Affichages: 48

Statistiques des forums

Discussions
314 655
Messages
2 111 604
Membres
111 217
dernier inscrit
aladinkabeya2