Tableau VBA
Hello le forum,
J'ai un tableau de donnée sur 5000 lignes.
Parmi ces 5000 lignes je dois tester 2 colonnes.
La première, je dois tester si le contenu est vide ou non.
La seconde je dois tester si un "D" est présent.
Jusque là tout va bien.
Dans la première colonne j'ai des noms tel que "JÉRÔME TOTO"
Ensuite je dois faire un tableau de synthèse à 2 colonnes avec en colone 1 le NOM => JEROME TOTO puis en colonne 2 le NOMBRE => c'est le nombre de fois que j'ai trouvé JEROME TOTO dans mes 5000 lignes.
Mon idée :
=> Une fois les 2 testes effectués j'alimente un tableau VBA (tableau1) avec le nom et ça sur mes 5000 lignes.
=> Puis créer un autre tableau VBA (tableau2) avec uniquement les valeurs uniques du tableau1
=> Pour finir compter pour chaque NOM du tableau2 le nombre de fois où il apparait dans le tableau1
Mais je n'arrive pas à m'en sortir sur cette manipulation ....
J'ai essayé avec plusieurs dictionnaires à la place des tableaux mais je n'y arrive pas non plus ...
Pouvez-vous m'aider svp ? Merci par avance
Voila mon essai :
Public Sub Demmarrages_Semaine()
Const FL_Visu_S As Byte = 5
Const Col_Visu_S As Byte = 1
Const Nom_F_Osc As String = "OSCAR"
Const Nom_Col_Resp_Clo As String = "RESP_CLOSING"
Dim F_Osc As Worksheet
Dim La_Semaine As String
Dim i As Integer
Dim DL_Osc As Integer
Dim z As Integer
Dim y As Byte
Dim j As Byte
Dim Der_Col_Osc As Byte
Dim Col_Osc_S As Byte
Dim Col_Resp_Clo As Byte
Dim Tab_OSCAR()
Dim Dico_Manager_Global
Dim Tab_Resp() As String
Set F_Osc = Sheets(Nom_F_Osc)
With F_Osc.Cells
.EntireColumn.Hidden = False
.EntireRow.Hidden = False
With F_Osc
On Error Resume Next
.ShowAllData
End With
End With
DL_Osc = F_Osc.Range("H6").End(xlDown).Row
Der_Col_Osc = F_Osc.Cells(FL_Visu_S, Columns.Count).End(xlToLeft).Column
ReDim Tab_OSCAR(DL_Osc, Der_Col_Osc)
''On affecte les valeurs de l'onglet "OSCAR" au tableau
For i = 4 To DL_Osc
For j = 1 To Der_Col_Osc
Tab_OSCAR(i, j) = F_Osc.Cells(i + 2, j).Value
Next j
Next i
y = FL_Visu_S + 1
Col_Resp_Clo = F_Osc.Rows(FL_Visu_S).Find(what:=Nom_Col_Resp_Clo, LookAt:=xlWhole).Column
j = 3
i = 3
'Set Dico_Manager_Global = CreateObject("Scripting.Dictionary")
Do
La_Semaine = Cells(y, Col_Visu_S)
Col_Osc_S = F_Osc.Rows(FL_Visu_S).Find(what:=La_Semaine, LookAt:=xlWhole).Column
z = 1
For i = 4 To UBound(Tab_OSCAR)
If Tab_OSCAR(i, Col_Resp_Clo) <> "" And Tab_OSCAR(i, Col_Osc_S) = "D" Then
Tab_Resp(z) = Tab_OSCAR(i, Col_Resp_Clo).Value
z = z + 1
Debug.Print Tab_Resp(z)
' Dico_Manager_Global.Add z, Tab_OSCAR(i, Col_Resp_Clo)
' Debug.Print Dico_Manager_Global.Item(Tab_OSCAR(i, Col_Resp_Clo))
End If
y = y + 1
'z = z + 1
Next
'y = y + 1
j = j + 3
Loop Until Cells(y, Col_Visu_S) = ""
MsgBox "terminé"
End Sub
Hello gmb,
Il manque un petit teste pour que ce soit parfait
Mais dans l'idée c'est ce que je voulais. Merci à toi.
Une petite question, je comprends pas trop la nuance entre la "keys" et les "items" d'un dico ...
Tu saurais m'expliquer stp ?
R@g
Quand tu écris :je comprends pas trop la nuance entre la "keys" et les "items" d'un dico ...
For i = 1 To 10
MonDico(Range("A" & i)) = ""
Next i
Tu envoie dans le dictionnaire « MonDico » des noms qui prennent les valeurs des cellules A1 à A10. Et si on retrouve plusieurs fois la même valeur dans cette plage de cellules, le nom correspondant ne sera qu’une seule fois dans le dictionnaire. L’ensemble de ces noms sont les « keys ».
Si maintenant on écrit :
For i = 1 To 10
MonDico(Range("A" & i)) = i
Next i
A chaque nom qu’on a mis dans le dictionnaire, on a associé une valeur (ici, le numéro de la ligne de la plage). Ces valeurs sont les « items »
OK ?
Bye !
Je vois par contre pourquoi dans ce bout de code on a la clé et l'item ? A quoi ça sert de faire ça en fait ?
'création de la Clé et de sa Valeur
Cle = 68100
Valeur = "Mulhouse"
'vérification si la Clé n'est pas déjà présente dans le Dictionnaire
If Not MonDico.Exists(Cle) Then
'ajout de la paire Clé + Valeur dans le Dictionnaire
MonDico.Add Cle, Valeur
End If
ça mar merci gmb