Soft7777777 | Bonjour,
Je viens de m'inspirer d'un code arrangé selon les besoins recherchés.
En gros, j'ai 2 feuilles dans le même workbook Excel que je compare.
La comparaison a pour objectif de détecter les similitudes et différences des lignes.
Les 2 fichier ont la même organisation (colonnes) mais les lignes ne sont pas dans le même ordre d'apparition.
Résultats:
Si ligne trouvée alors celle ci apparait en vert sur une feuille et sur l'autre message indiquant "Trouvé" Si la ligne n'est pas trouvée, la première cellule est en rouge + message "non trouvé" + coloration en orange de la dernière cellule non trouvée.
Problème:
Le fichiers comportent parfois + de 300 000 lignes et le temps est très très long (environ 1h)
Je suis pas très habitué au VBA donc je ne vois pas pourquoi cette lenteur d'autant que j'utilise des tableaux pour la comparaison.
A L'AIDE SVP.
Code :
- Sub Comparaison()
-
- Dim nbLigneAIA As Long
- Dim nbLigneCRI As Long
-
- ' ------------ Compteurs de boucles - - - - - - - - - - - -
-
- Dim i As Long
- Dim j As Long
- Dim nbCol As Integer
-
- Dim e_AIA As Long
- Dim e_CRI As Long
-
- ' ------------ Booléens - - - - - - - - - - - -
- Dim Y As Boolean
-
-
- Dim WbA As Workbook, WbN As Workbook
- Dim WsA As Worksheet, WsN As Worksheet
- ' ------------ Initialisation Workbook et Sheets - - - - - - - - - - - -
- Set WbA = Workbooks("Automatisation_RQT_V3.xlsm" )
- Set WbN = Workbooks("Automatisation_RQT_V3.xlsm" )
- Set WbData = Workbooks("Automatisation_RQT_V3.xlsm" )
- Set WsA = WbA.Worksheets("Req_AIA" )
- Set WsN = WbN.Worksheets("Req_CRI" )
- ' ------------ Détermination des tailles des 2 fichiers - - - - - - - - - - - -
- With Sheets("Req_AIA" )
- nbLigneAIA = .Range("B" & .Rows.Count).End(xlUp).Row
- End With
- With Sheets("Req_CRI" )
- nbLigneCRI = .Range("B" & .Rows.Count).End(xlUp).Row
- End With
-
- 'L 'utilisateur choisit le nombre de colonnes à comparer
- nbCol = Workbooks("Automatisation_RQT_V3.xlsm" ).Sheets("Donnees" ).Range("B1" ).Value + 1
-
- ' ------------ Tableaux - - - - - - - - - - - -
- Dim TabloAIA() As Variant
- Dim TabloCRI() As Variant
- ' Initialisation des booléens
- Y = False
- TabloAIA() = WsA.Range("B2:Q" & nbLigneAIA)
- TabloCRI() = WsN.Range("B2:Q" & nbLigneCRI)
- 'TabloAIA() = WsA.Range(Cells(1, 1), Cells(nbLigneAIA, nbCol + 1))
- 'TabloCRI() = WsN.Range(Cells(1, 1), Cells(nbLigneCRI, nbCol + 1))
- 'Détermination des absents
- For i = 2 To nbLigneAIA
- Y = False
- For j = 2 To nbLigneCRI
-
- ' Tester si la ligne n'a pas déjà été trouvée avant
- 'If WsN.Cells(j, nbCol + 1) <> "Trouvé" Then
- If TabloCRI(j - 1, nbCol) <> "Trouvé" Then
- If TabloAIA(i - 1, 1) = TabloCRI(j - 1, 1) Then
- 'Si égalité alors on pose un drapeau
- Y = True
- WsA.Cells(i, 2).Interior.ColorIndex = 4
-
- 'et on vérifie la ligne si c'est une égalité stricte
- For k = 3 To nbCol
- ' Si égalité alors on colorie la cellule en vert
- 'If WsA.Cells(i, k) = WsN.Cells(j, k) Then
- If TabloAIA(i - 1, k - 1) = TabloCRI(j - 1, k - 1) Then
- WsA.Cells(i, k).Interior.ColorIndex = 4
-
- Else
- 'Si la cellule en cours n'est pas déjà en vert alors on la met en orange (Eviter l'écrasement de couleur = indiquer la bonne cellule manquante)
-
- If WsA.Cells(i, k).Interior.ColorIndex <> 4 Then
- 'Ys = True
- 'et on colore en orange
- WsA.Cells(i, k).Interior.ColorIndex = 45
- Y = False
- Exit For
- End If
-
- End If
-
- Next
- End If
- 'Si on trouve la ligne on sort immédiatement du 2 ieme For (éviter de parcours le reste pour rien)
- If Y Then Exit For
- End If
-
- Next
-
-
- If Y = True Then
- 'Marquer dans le fichier CRI les lignes trouvées pour éviter de laisser passer les doublons
- 'WsN.Cells(j, nbCol + 1) = "Trouvé"
- TabloCRI(j - 1, nbCol) = "Trouvé"
- Else
- 'Si pas trouvé alors on colorie la ligne AIA en rouge
- WsA.Range("B" & i).Interior.ColorIndex = 3
- 'WsA.Cells(i, nbCol + 1) = "Non Trouvé"
- TabloAIA(i - 1, nbCol) = "Non Trouvé"
- End If
- Y = False
- Next
- 'MAJ des états dans les feuilles
- For e_AIA = 1 To nbLigneAIA - 1
- WsA.Cells(e_AIA + 1, nbCol + 1) = TabloAIA(e_AIA, nbCol)
- Next
- For e_CRI = 1 To nbLigneCRI - 1
- WsN.Cells(e_CRI + 1, nbCol + 1) = TabloCRI(e_CRI, nbCol)
- Next
-
-
- Erase TabloAIA
- Erase TabloCRI
- Set WbA = Nothing
- Set WbN = Nothing
- Set WsA = Nothing
- Set WsN = Nothing
- End Sub
|
|