XL 2013 VBA de suppression

sirine10

XLDnaute Nouveau
Bonjour tout le monde,
j'ai un gros problème avec ma VBA car elle met beaucoup beaucoup trop de temps à s’exécuter. Sa fonction est :
( j'ai deux feuilles excel, la 1er contient des données de chiffres de colonne A à E; et la 2eme feuilles des donnée de chiffres de colonne A à C )
de supprimer tout les lignes de la feuille 1 qui contient les 3 chiffres des 3 colonnes de la feuille 2, puis de passer à la suivant ligne de la feuille 2.
j'ai aussi remarquer que lorsque dans la feuille 1 il n'y a pas présence des conditions de la feuille 2 alors au lieu de terminer directement l'execution car rien à supprimer elle se met à buger.
La feuille 1 contient 100 000 lignes
la feuille 2 contient 4 000 lignes
si quelqu'un aurait une solution à mon problemme je lui en serrais reconnaissant merci !
bonne journée à tous

Voici ma macro :
Dim i As Integer, j As Long
Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual

Application.DisplayStatusBar = False

Application.EnableEvents = False

With Sheets("Feuil2")

For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row

For j = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1

If WorksheetFunction.CountIf(Range("A" & j & ":E" & j), .Range("A" & i)) > 0 And WorksheetFunction.CountIf(Range("A" & j & ":E" & j), .Range("B" & i)) > 0 And WorksheetFunction.CountIf(Range("A" & j & ":E" & j), .Range("C" & i)) > 0 Then

Rows(j).EntireRow.Delete

End If

Next j

Next i

End With

Application.ScreenUpdating = True

Application.Calculation = xlCalculationManual

Application.DisplayStatusBar = True

Application.EnableEvents = True
End Sub
 

sirine10

XLDnaute Nouveau
oui je vous explique :
dans la feuille 1 il y a des valeurs allant de colonnes A à E
dans la feuille 2 il y a des valeurs allant de A à C
pour chaque ligne de la feuille 2 si par exemple la deuxième ligne : 2 , 11 et 27 si c'est 3 chiffres apparaissent dans 3 des 5 colonnes de la feuille 1 alors supprimer la ligne de la feuille 1
puis passer à la prochaine ligne de la feuille 2
a+ :)
 

cp4

XLDnaute Barbatruc
oui je vous explique :
dans la feuille 1 il y a des valeurs allant de colonnes A à E
dans la feuille 2 il y a des valeurs allant de A à C
pour chaque ligne de la feuille 2 si par exemple la deuxième ligne : 2 , 11 et 27 si c'est 3 chiffres apparaissent dans 3 des 5 colonnes de la feuille 1 alors supprimer la ligne de la feuille 1
puis passer à la prochaine ligne de la feuille 2
a+ :)
Déjà est-ce que ton code fonctionne?

Si j'ai bien compris le process: on récupère la valeur de A2 et on passe en revue les 5 colonnes de la ligne "scannée, si la valeur est trouvée on passe à la seconde valeur, puis à la 3ème.
si les 3 valeurs sont trouvées peu importe dans quelle colonne ou bien dans la même colonne, on supprime la ligne.
 

sirine10

XLDnaute Nouveau
oui il fonctionne mais il est vraiment trop lent,
on prend les valeurs des 3 colonnes de la ligne numéro 2 : 2 et 11 et 27 puis on passe en revue toute les lignes la feuille 1 et si il y a une ligne qui comporte ces 3 chiffres alors on supprime cette ligne ( de la feuille 1 )
col A col B col C col D col E
1 2 11 27 30
2 8 9 11 27
2
8 27 11 25
2 11 30 31 32
Donc ici les 3 première lignes devront être supprimé, pas la dernière car il ne comporte pas les 3 conditions il manque le 27.
il faut a chaque fois que les 3 chiffres des 3 colonnes de la feuille 2 sont présentes sinon on ne supprime pas la ligne.

et dès que j'ai fini de nettoyer totalement et que je relance la macro il bug au lieu de s’arrêter car il n'y a rien à supprimer
 

dg62

XLDnaute Barbatruc
Bonjour
Pouvez-vous tester ce code ?

VB:
Sub teste()
Dim i As Integer, j As Long


Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayStatusBar = False
Application.EnableEvents = False
Dim T1 As Variant
Dim T2 As Variant
T1 = Range("tableau1").Value 'feuil 2
T2 = Range("tableau2").Value 'feuil 1

efface = 0
     For i = 1 To UBound(T1)
    
        For j = UBound(T2) To 2 Step -1
        a = T1(i, 1)
        b = T1(i, 2)
        c = T1(i, 3)
        
        For x = 1 To 4
         If T2(j, x) = a Then efface = efface + 1
         If T2(j, x) = b Then efface = efface + 1
         If T2(j, x) = c Then efface = efface + 1
        
        Next x
        If efface >= 3 Then
        ThisWorkbook.Worksheets("feuil1").Rows(j).Delete
        End If
        efface = 0
        Next j
            
     Next i
    

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayStatusBar = True
Application.EnableEvents = True

End Sub
 

Discussions similaires

Réponses
4
Affichages
453

Statistiques des forums

Discussions
315 098
Messages
2 116 198
Membres
112 681
dernier inscrit
romain38