Code prend 1 heure pour afficher les resultats

cedric_hiss

XLDnaute Junior
Bonjour a tous ,

je viens de terminer un code qui contient 13 sub routine je leur fait appel par un module voila le code prend 1 heure pour analyser 16000 lignes en gros je fait une comparaison ligne par ligne de 4 colonnes et autre 4 colonnes et j'affiche les resultats dans autres colonnes voila le ficher sur le quelle je travaille compar-test.xlsm
si vous pouvez m'aider a trouver une solution et merci .
 

cedric_hiss

XLDnaute Junior
Re : Code prend 1 heure pour afficher les resultats

non sur le fichier avec 16000 lignes enfaite tout marche tres bien sauf le changement de features il affiche toutes les features meme celles ou il n y a pas de changement est ce qu'il est possible de n afficher que les features qui ont changés ?
 

thebenoit59

XLDnaute Accro
Re : Code prend 1 heure pour afficher les resultats

A ce moment il faut savoir quoi faire, quand il y a une différence de features.
Que cela signifie t'il ? Qu'un feature à été supprimé sans être remplacé ? Un feature a été ajouté ? Si c'est le cas c'est faisable.
 

thebenoit59

XLDnaute Accro
Re : Code prend 1 heure pour afficher les resultats

Certains features se nomment juste Old ou New, ce qui ne doit pas correspondre à grand chose pour toi, mais bon c'est ton fichier qui est ainsi.

Tu peux essayer le code suivant :

Code:
Option Explicit
Option Base 1

Sub Comparatif_Release()
Dim t1, t2, c, c2, temp, temp2
Dim d(1 To 8) As Object
Dim i&, j&, l&, l2&
Dim f As Worksheet

'On place les données dans deux tableaux.
Set f = Sheets("Sheet1")
With f
    l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
    t1 = .Range("a3:e" & l).Value
    t2 = .Range("g3:k" & l).Value
End With

'Nous créons les dictionnaires.
For i = 1 To 8
    Set d(i) = CreateObject("Scripting.Dictionary")
Next i

'Nous réalisons un index par communauté.
For i = LBound(t1) To UBound(t1)
    d(1)(t1(i, 1) & ":" & t1(i, 2)) = d(1)(t1(i, 1) & ":" & t1(i, 2)) & i & ":"
    d(2)(t2(i, 1) & ":" & t2(i, 2)) = d(2)(t2(i, 1) & ":" & t2(i, 2)) & i & ":"
Next i

'Nous vérifions si les communautés existent dans les deux dictionnaires.
'S'il n'existe pas dans d(2), c'est une suppression
For Each c In d(1).Keys
    If Not d(2).exists(c) Then
        d(4)(c) = d(1)(c)
    Else: d(3)(c) = ""
    End If
Next c

'S'il n'existe pas dans d(1), c'est un ajout
For Each c In d(2).Keys
    If Not d(1).exists(c) Then
        d(5)(c) = d(2)(c)
    Else: d(3)(c) = ""
    End If
Next c

'Nous allons commencer à extraire les valeurs.
j = 3

'On extrait les communautés supprimées.
For Each c In d(4)
'Nous créons un tableau temporaire, reprenant les lignes à analyser.
    temp = Split(d(1)(c), ":")
        d(6)(t1(temp(0), 1) & ":" & t1(temp(0), 1) & ":" & "Deleted Community") = d(6)(t1(temp(0), 1) & ":" & t1(temp(0), 1) & ":" & "Deleted Community") & "Old Rank :" & t1(temp(0), 5)
        For i = LBound(temp) To UBound(temp) - 1
            Debug.Print t1(temp(i), 1)
            l = temp(i)
            d(6)(t1(l, 1) & ":" & t1(l, 1) & ":" & "Deleted Community") = d(6)(t1(l, 1) & ":" & t1(l, 1) & ":" & "Deleted Community") & Chr(10) & "Old Features :" & t1(l, 3)
        Next i
Next c

'On extrait les communautés supprimées.
For Each c In d(5)
'Nous créons un tableau temporaire, reprenant les lignes à analyser.
    temp = Split(d(2)(c), ":")
        d(6)(t2(temp(0), 1) & ":" & t2(temp(0), 1) & ":" & "New Community") = d(6)(t2(temp(0), 1) & ":" & t2(temp(0), 1) & ":" & "New Community") & "New Rank :" & t2(temp(0), 5)
        For i = LBound(temp) To UBound(temp) - 1
            Debug.Print t2(temp(i), 1)
            l = temp(i)
            d(6)(t2(l, 1) & ":" & t2(l, 1) & ":" & "New Community") = d(6)(t2(l, 1) & ":" & t2(l, 1) & ":" & "New Community") & Chr(10) & "Old Features :" & t2(l, 3)
        Next i
Next c

'On va comparer les communautés encore présentes.
'Nous allons créer deux tableaux pour reprendre les valeurs à comparer.
'1ère étape, nous enregistrons les lignes à analyser.
For Each c In d(3).Keys
    temp = Split(d(1)(c), ":")
    temp2 = Split(d(2)(c), ":")
    'Nous comparons les rangs.
    If t1(temp(0), 5) <> t2(temp2(0), 5) Then d(6)(t1(temp(0), 1) & ":" & t1(temp(0), 2) & ":" & "Rank") = "Old Rank :" & t1(temp(0), 5) & ", New Rank :" & t2(temp2(0), 5) & " Change percentage : " & Round((t2(temp2(0), 4) / t1(temp(0), 4) - 1) * 100, 2) & "%"
    'Nous ajoutons tous les features des deux tableaux.
    For i = LBound(temp) To UBound(temp) - 1
        l = temp(i)
        d(7)(t1(l, 3)) = ""
    Next i
    For i = LBound(temp2) To UBound(temp2) - 1
        l2 = temp2(i)
        d(8)(t2(l2, 3)) = ""
    Next i
    For Each c2 In d(7).Keys
        If Not d(8).exists(c2) Then d(6)(c & ":" & "Features deleted") = d(6)(c & ":" & "Features deleted") & c2 & ", "
    Next c2
    For Each c2 In d(8).Keys
        If Not d(7).exists(c2) Then d(6)(c & ":" & "Features added") = d(6)(c & ":" & "Features added") & c2 & ", "
    Next c2
Next c

'On ajoute les valeurs à la feuille.
For Each c In d(6)
    Cells(j, "N").Resize(, 3).Value = Split(c, ":")
    Cells(j, "Q").Value = d(6)(c)
    j = j + 1
Next c

End Sub

Un jour quelqu'un le simplifiera un maximum ...
Je fais avec le peu de connaissances en matières de tableau et dictionnaires à ma disposition.
 

cedric_hiss

XLDnaute Junior
Re : Code prend 1 heure pour afficher les resultats

oui merci , mais pourquoi il affiche toutes les communautés avec features : old , deleted on peut pas just les supprimer cela ou bien ne pas les afficher ? et afficher que celle ou il y a le changement ?
 

cedric_hiss

XLDnaute Junior
Re : Code prend 1 heure pour afficher les resultats

Bonjour thebenoit59 ,

je pense que vous pouvez pas m'aider parce que je vous ai demandé trop je vous remerci de tout mon coeur , et est ce que vous me permetter de chercher la solution ailleur avec votre code ??
 

thebenoit59

XLDnaute Accro
Re : Code prend 1 heure pour afficher les resultats

Bonjour Cedric.

La création des dictionnaires était mal placée pour deux d'entre eux.
Essaye avec le code ci-dessous :

Code:
Option Explicit
Option Base 1

Sub Comparatif_Release()
Dim t1, t2, c, c2, temp, temp2
Dim d(1 To 8) As Object
Dim i&, j&, l&, l2&
Dim f As Worksheet

'On place les données dans deux tableaux.
Set f = Sheets("Sheet1")
With f
    l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
    t1 = .Range("a3:e" & l).Value
    t2 = .Range("g3:k" & l).Value
End With

'Nous créons les dictionnaires.
For i = 1 To 6
    Set d(i) = CreateObject("Scripting.Dictionary")
Next i

'Nous réalisons un index par communauté.
For i = LBound(t1) To UBound(t1)
    d(1)(t1(i, 1) & ":" & t1(i, 2)) = d(1)(t1(i, 1) & ":" & t1(i, 2)) & i & ":"
    d(2)(t2(i, 1) & ":" & t2(i, 2)) = d(2)(t2(i, 1) & ":" & t2(i, 2)) & i & ":"
Next i

'Nous vérifions si les communautés existent dans les deux dictionnaires.
'S'il n'existe pas dans d(2), c'est une suppression
For Each c In d(1).Keys
    If Not d(2).exists(c) Then
        d(4)(c) = d(1)(c)
    Else: d(3)(c) = ""
    End If
Next c

'S'il n'existe pas dans d(1), c'est un ajout
For Each c In d(2).Keys
    If Not d(1).exists(c) Then
        d(5)(c) = d(2)(c)
    Else: d(3)(c) = ""
    End If
Next c

'Nous allons commencer à extraire les valeurs.
j = 3

'On extrait les communautés supprimées.
For Each c In d(4)
'Nous créons un tableau temporaire, reprenant les lignes à analyser.
    temp = Split(d(1)(c), ":")
        d(6)(t1(temp(0), 1) & ":" & t1(temp(0), 1) & ":" & "Deleted Community") = d(6)(t1(temp(0), 1) & ":" & t1(temp(0), 1) & ":" & "Deleted Community") & "Old Rank :" & t1(temp(0), 5)
        For i = LBound(temp) To UBound(temp) - 1
            Debug.Print t1(temp(i), 1)
            l = temp(i)
            d(6)(t1(l, 1) & ":" & t1(l, 1) & ":" & "Deleted Community") = d(6)(t1(l, 1) & ":" & t1(l, 1) & ":" & "Deleted Community") & Chr(10) & "Old Features :" & t1(l, 3)
        Next i
Next c

'On extrait les communautés supprimées.
For Each c In d(5)
'Nous créons un tableau temporaire, reprenant les lignes à analyser.
    temp = Split(d(2)(c), ":")
        d(6)(t2(temp(0), 1) & ":" & t2(temp(0), 1) & ":" & "New Community") = d(6)(t2(temp(0), 1) & ":" & t2(temp(0), 1) & ":" & "New Community") & "New Rank :" & t2(temp(0), 5)
        For i = LBound(temp) To UBound(temp) - 1
            Debug.Print t2(temp(i), 1)
            l = temp(i)
            d(6)(t2(l, 1) & ":" & t2(l, 1) & ":" & "New Community") = d(6)(t2(l, 1) & ":" & t2(l, 1) & ":" & "New Community") & Chr(10) & "Old Features :" & t2(l, 3)
        Next i
Next c

'On va comparer les communautés encore présentes.
'Nous allons créer deux tableaux pour reprendre les valeurs à comparer.
'1ère étape, nous enregistrons les lignes à analyser.
For Each c In d(3).Keys
    temp = Split(d(1)(c), ":")
    temp2 = Split(d(2)(c), ":")
    'Nous comparons les rangs.
    If t1(temp(0), 5) <> t2(temp2(0), 5) Then d(6)(t1(temp(0), 1) & ":" & t1(temp(0), 2) & ":" & "Rank") = "Old Rank :" & t1(temp(0), 5) & ", New Rank :" & t2(temp2(0), 5) & " Change percentage : " & Round((t2(temp2(0), 4) / t1(temp(0), 4) - 1) * 100, 2) & "%"
    'Nous ajoutons tous les features des deux tableaux.
    Set d(7) = CreateObject("Scripting.Dictionary")
    For i = LBound(temp) To UBound(temp) - 1
        l = temp(i)
        d(7)(t1(l, 3)) = ""
    Next i
    Set d(8) = CreateObject("Scripting.Dictionary")
    For i = LBound(temp2) To UBound(temp2) - 1
        l2 = temp2(i)
        d(8)(t2(l2, 3)) = ""
    Next i
    For Each c2 In d(7).Keys
        If Not d(8).exists(c2) Then d(6)(c & ":" & "Features deleted") = d(6)(c & ":" & "Features deleted") & c2 & ", "
    Next c2
    For Each c2 In d(8).Keys
        If Not d(7).exists(c2) Then d(6)(c & ":" & "Features added") = d(6)(c & ":" & "Features added") & c2 & ", "
    Next c2
Next c

'On ajoute les valeurs à la feuille.
For Each c In d(6)
    Cells(j, "N").Resize(, 3).Value = Split(c, ":")
    Cells(j, "Q").Value = d(6)(c)
    j = j + 1
Next c

End Sub
 

cedric_hiss

XLDnaute Junior
Re : Code prend 1 heure pour afficher les resultats

salut the benoit59 et merci d avoir repondu , enfaite le problem reste le meme et je pense pas que je vais y arriver a le resoudre tout seul lool , en faite pour cette partie la du code , pourquoi on affiche toutes les features des deux tableau ,
'Nous ajoutons tous les features des deux tableaux.
Set d(7) = CreateObject("Scripting.Dictionary")
For i = LBound(temp) To UBound(temp) - 1
l = temp(i)
d(7)(t1(l, 3)) = ""
Next i
Set d(8) = CreateObject("Scripting.Dictionary")
For i = LBound(temp2) To UBound(temp2) - 1
l2 = temp2(i)
d(8)(t2(l2, 3)) = ""
Next i
For Each c2 In d(7).Keys
If Not d(8).exists(c2) Then d(6)(c & ":" & "Features deleted") = d(6)(c & ":" & "Features deleted") & c2 & ", "
Next c2
For Each c2 In d(8).Keys
If Not d(7).exists(c2) Then d(6)(c & ":" & "Features added") = d(6)(c & ":" & "Features added") & c2 & ", "
Next c2
Next c

'On ajoute les valeurs à la feuille.
For Each c In d(6)
Cells(j, "N").Resize(, 3).Value = Split(c, ":")
Cells(j, "Q").Value = d(6)(c)
j = j + 1
Next c

End Sub

est ce que c'est possible d afficher seulement les features qui ont changé et les autres qui n ont pas change on les affiche pas dans le resultat ??
 

thebenoit59

XLDnaute Accro
Re : Code prend 1 heure pour afficher les resultats

Je ne comprends plus rien ...
Dans le dernier exemple, on vérifie si les features existe dans le tableau 1 ET le tableau 2, puis inversement. Si ce n'est pas le cas on le signale dans la colonne Results.
 

cedric_hiss

XLDnaute Junior
Re : Code prend 1 heure pour afficher les resultats

excusez moi c'est ma faute au lieux de copier le nouveau code que vous m'avez fournis j'ai copié l ancien , j'ai testé ce nouveau ca marche tres bien je vous remercie thebenoit59 pour votre aide et votre temps , merci 1000 fois .
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 545
Messages
2 089 453
Membres
104 169
dernier inscrit
alain_geremy