Ah, c'est mieux.
Manque toujours l'indentation qui m'est si chère (jamais content le vieux.)
Et ce qui est bien plus grave, ni tes colonnes (lignes 15 à 19), ni tes cellules et ta ligne (ligne 31) ne sont préfixées par la feuille concernée. Dans le cas de la ligne 31, c'est même un gros bug !
C'est pourquoi je préfère faire des
For Each comme dans ton premier exemple.
Autre chose, supprimer au fur et à mesure tes lignes est très consommateur de ressource.
On peut le faire en une seule fois.
Dans ton dernier code, on ne compare que les valeurs de la colonne 4 à celles de la colonne 3. Est-ce fait exprès ?
' // J'aime !
Option Explicit
Sub CmistesDMO()
Dim Class1 As Workbook
Dim Class2 As Workbook
Dim FeuilleClass1 As Worksheet
Dim FeuilleClass2 As Worksheet
Dim PlageClass2 As Range
Dim PlageClass1 As Range
Dim CellClass1 As Range
Dim CellClass2 As Range
Dim a_supprimer As Range
Set Class1 = Workbooks.Open("C:\Documents\Fichier1.xls")
Set Class2 = Workbooks.Open("C:\Documents\Fichier2.xls", ReadOnly:=True)
Set FeuilleClass1 = Class1.Worksheets(1)
Set FeuilleClass2 = Class2.Worksheets(1)
' // Supprimer l'ensemble des colonnes inutiles
' // C'est juste pour te montrer ;-)
' // Regarde quand-même comment ça marche !
Union( _
FeuilleClass1.Columns("W"), _
FeuilleClass1.Columns("U"), _
FeuilleClass1.Columns("L"), _
FeuilleClass1.Columns("G"), _
FeuilleClass1.Columns("E:B")).Delete
Set PlageClass1 = FeuilleClass1.Range("A1").CurrentRegion.Offset(1, 0).Columns(4)
Set PlageClass2 = FeuilleClass2.Range("A1").CurrentRegion.Offset(1, 0).Columns(3)
'Comparaison
For Each CellClass1 In PlageClass1
For Each CellClass2 In PlageClass2
If CellClass2.Cells(i, 4).Value <> CellClass2.Value Then
' // On accumule les lignes à supprimer
Set a_supprimer = Union(a_supprimer, CellClass1.EntireRow)
End If
Next
' // Pour savoir où on en est
Application.StatusBar = "Progression : " & (CellClass1.Row * 100 / PlageClass1.Count) & "%"
Next
Application.StatusBar = False
' / Et on supprime pour de bon
a_supprimer.Delete
Class2.Close
End Sub
Bon, à la ligne 44, il y a un problème, VBA ne sait pas faire l'union avec un truc vide.
Il faut donc distinguer ce cas.
' // On accumule les lignes à supprimer
If a_supprimer Is Nothing Then
Set a_supprimer = CellClass1.EntireRow
Else
Set a_supprimer = Union(a_supprimer, CellClass1.EntireRow)
End If
Le gain ne sera pas forcément énorme, mais c'est déjà ça.