Problème avec le "Or" en VBA et rapidité

Bonjour à tous,

Je suis entrain de créer un programme pour supprimer les lignes où les cellules de la colonne J valent "1" ou "2" ou "3" .... "6".

Autrement dit, j'aimerais ne garder que les lignes où les valeurs des cellules J sont 0 ou 7 ou 8 ou 9.

J'ai fait ce programme :

Sub Macro21()

'

Macro21 Macro

'

Dim nombredelignes As Integer

nombredelignes = Range("B" & Rows.Count).End(xlUp).Row

'Insertion de la colonne en A

Worksheets("Feuil1").Columns(1).Insert

'On insere la date du jour dans la colonne A

For i = 1 To nombredelignes

Cells(i, 1).Value = "=today()"

If Cells(i, 10) = 1 Or Cells(i, 10) = 2 Or Cells(i, 10) = 3 Or Cells(i, 10) = 4 Or Cells(i, 10) = 5 Or Cells(i, 10) = 6 Then

Cells(i, 10).EntireRow.Delete

End If

Next i

End Sub

Cependant, il ne supprime qu'un chiffre sur deux et je ne comprends pas pourquoi.

De plus, si j'ai des milliers de lignes, pensez vous qu'il est plus rapide de faire comme cela ou de filtrer et de supprimer toutes les lignes présentes.

Merci d'avance pour votre aide. Si je n'ai pas été assez clair n'hésitez pas à me le dire.

Simon

4test.xlsx (28.59 Ko)

bonjour,

une proposition de correction

Sub Macro21()
'
    'Macro21 Macro

    '
    Dim nombredelignes As Integer
    nombredelignes = Range("B" & Rows.Count).End(xlUp).Row

    'Insertion de la colonne en A
    Worksheets("Feuil1").Columns(1).Insert

    'On insere la date du jour dans la colonne A
    For i = nombredelignes To 1 Step -1
        Cells(i, 1).Value = Date

        If Cells(i, 10) >= 1 And Cells(i, 10) <= 6 Then
            Cells(i, 10).EntireRow.Delete
        End If

    Next i

End Sub

le problème ne vient pas du or, mais de la manière dont tu supprimes tes lignes dans une boucle for.

quand tu supprimes la ligne i, la ligne i+1 devient la ligne i, puis tu arrives au next i qui incrémente i, tu as donc sauté une ligne. pour éviter ce problème, une manière de faire est de parcourir la liste à l'envers de la ligne au numéro le plus élevé à la ligne au numéro le moins élevé.

Top merci ça fonctionne parfaitement.

Et pour la rapidité est-ce que tu sais quelle est la méthode la plus rapide ?

bonjour,

faire un filtre et supprimer toutes les lignes sélectionnées.

Bonjour,

Une autre proposition (rapidité accrue), mais comme suggéré par h2so4, le filtre serait plus adapté.

Cdlt.

1test.xlsm (15.17 Ko)
Public Sub XXX()
Dim lastRow As Long, lRow As Long, rng As Range
    Application.ScreenUpdating = False
    With ActiveSheet
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        For lRow = 1 To lastRow
            Select Case .Cells(lRow, 9).Value
                Case 0, 7 To 9:
                Case Else:
                    If rng Is Nothing Then
                        Set rng = .Cells(lRow, 1)
                    Else
                        Set rng = Union(rng, .Cells(lRow, 1))
                    End If
            End Select
        Next lRow
        If Not rng Is Nothing Then rng.EntireRow.Delete
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        .Columns(1).Insert
        .Cells(1).Resize(lastRow).Value = Date
    End With
End Sub
Rechercher des sujets similaires à "probleme vba rapidite"