Dictionary
Bonjour a tous,
me voila bloqué, je souhaiterai mettre le score de mes équipes en feuil2 or il y a des doublons et avec "Scripting.dictionary" le score n'est affiché que sur le deuxième doublons. Je ne vois pas quel modification faire a mon code pouvez-vous m'aidez?
(J'utilise les dictionnaires et les tableaux pour optimiser le temps d'exécution car dans le fichier original il y a beaucoup plus de données)
voici ci-joint le fichier avec mon code que je vous remet ici
Sub score()
Dim ligne As Long, ligne1 As Long, c As Long, i As Long, L As Long, dico
Set dico = CreateObject("Scripting.Dictionary")
Workbooks("Classeur1.xlsm").Sheets("feuil1").Rows("1:1").AutoFilter
Workbooks("Classeur1.xlsm").Worksheets("feuil1").AutoFilter.Sort.SortFields.Clear
Workbooks("Classeur1.xlsm").Worksheets("feuil1").AutoFilter.Sort.SortFields.Add Key _
:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With Workbooks("Classeur1.xlsm").Worksheets("feuil1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("Classeur1.xlsm").Sheets("feuil1").Rows("1:1").AutoFilter
ligne = Workbooks("Classeur1.xlsm").Sheets("feuil1").Range("C1").End(xlDown).Row
ReDim T_site(ligne, 7)
With Workbooks("Classeur1.xlsm").Sheets("feuil1")
L = 1
For i = 2 To ligne
T_site(L, 0) = .Range("D" & i).Value 'otm
T_site(L, 1) = .Range("B" & i).Value & " - " & .Range("C" & i).Value
L = L + 1
Next i
End With
Workbooks("Classeur1.xlsm").Sheets("feuil2").Rows("1:1").AutoFilter
Workbooks("Classeur1.xlsm").Worksheets("feuil2").AutoFilter.Sort.SortFields.Clear
Workbooks("Classeur1.xlsm").Worksheets("feuil2").AutoFilter.Sort.SortFields.Add Key:= _
Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With Workbooks("Classeur1.xlsm").Worksheets("feuil2").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Workbooks("Classeur1.xlsm").Sheets("feuil2").Rows("1:1").AutoFilter
ligne1 = Workbooks("Classeur1.xlsm").Sheets("feuil2").Range("A1").End(xlDown).Row
ReDim T_d(ligne1, 0)
Workbooks("Classeur1.xlsm").Sheets("feuil2").Activate
L = 1
For i = 2 To ligne1
T_d(L, 0) = Range("B" & i).Value & " - " & Range("C" & i).Value
L = L + 1
Next i
ReDim F(UBound(T_d), 6)
For i = 1 To UBound(T_d)
dico.Item(T_d(i, 0)) = i
Next
For i = 1 To UBound(T_site)
If dico.exists(T_site(i, 1)) Then
Range("D" & dico(T_site(i, 1)) + 1).Value = T_site(i, 0)
End If: Next i
Erase T_site
Erase T_d
End Sub
Merci par avance
Bonjour,
Vous devriez expliquer précisément ce que vous voulez obtenir; le résultat souhaité dans le classeur aurait été un plus !
A+
Bonjour AlgoPlus,
Navré si ce n'est pas clair, je vous ai mis dans la feuille2: en colonne D ce que je souhaite, et en colonne E je que j'obtiens.
J'aimerai faire cela avec un dictionnaire pour que le temps d'exécution soit au plus optimale
en espèrent être plus clair.
Désolé, je ne comprends pas la logique qui :
- pour la team1 qui n'a qu'un score dans un seul sport donne en résultat deux lignes identiques avec scores identiques pour ce sport + deux lignes sans score dans des sport différents...
- pour la team10 qui possède deux ligne rugby avec des scores différents donne une seule ligne en karaté sans score
pas vérifié les autres lignes.
Une explication sur l'attribution des numéros (colonne A) serait un plus.
A+
Edit: utiliser un dictionnaire pour gagner du temps, pourquoi pas , mais on pourrait gagner du temps sur les tableaux (array) utilisés en les "chargeant" directement par une plage, plutôt que par une boucle sur cette plage...
merci pour ta réponse, j'ai trouvé la solution
cdl