Problème avec le "Or" en VBA et rapidité. Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
S
Simon_Lbb
Membre fidèle
Membre fidèle
Messages : 151
Inscrit le : 13 juin 2019
Version d'Excel : 2013

Message par Simon_Lbb » 30 juin 2019, 16:08

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
test.xlsx
(28.59 Kio) Téléchargé 3 fois
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'174
Appréciations reçues : 377
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 30 juin 2019, 16:22

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é.
S
Simon_Lbb
Membre fidèle
Membre fidèle
Messages : 151
Inscrit le : 13 juin 2019
Version d'Excel : 2013

Message par Simon_Lbb » 30 juin 2019, 16:26

Top merci ça fonctionne parfaitement.

Et pour la rapidité est-ce que tu sais quelle est la méthode la plus rapide ?
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 9'174
Appréciations reçues : 377
Inscrit le : 16 juin 2013
Version d'Excel : 365 UK Windows 10

Message par h2so4 » 30 juin 2019, 16:27

bonjour,

faire un filtre et supprimer toutes les lignes sélectionnées.
Avatar du membre
Jean-Eric
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'433
Appréciations reçues : 674
Inscrit le : 27 août 2012
Version d'Excel : 365 Personnel

Message par Jean-Eric » 30 juin 2019, 16:57

Bonjour,
Une autre proposition (rapidité accrue), mais comme suggéré par h2so4, le filtre serait plus adapté.
Cdlt.
test.xlsm
(15.17 Kio) Téléchargé 1 fois
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
Jean-Eric

Je ne réponds pas aux M.P. non sollicités.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message