[XL-2016] code erroné sur boucle colonne pour effacement ligne

bonjour,

J'ai a partir d'aide sur internet, fait un peux de code (je précise, je suis débutant).

Dans mon fichier EXCEL, j'ai un ensemble de colonnes remplies. Mon but est qu'à chaque cellule de la colonne E à partir de la ligne 7, un test soit réalisé qui compte le nombre de caractères (chaine alpha-numérique). Si le nombre de caractères, est strictement différent de 6 ou null (cellule vide), la ligne est effacée.

Mais mon code ne fonctionne pas. Rien ne ce passe. J'ai pas non plus de message d'erreur.

Je laisse ci dessous le code.

Pourriez vous me dire ce qu'il ne vas pas ?

Option Explicit
Dim FL1 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, DerLig As Long, Var As Variant
Sub VerifierNombres()

'procéder au test et indiquer des actions à effectuer
If IsNumeric(Var) = True Then
    'code si expression est numérique

      If Len(Var) <> 6 Then
        Rows(NoLig & ":" & NoLig).Delete

        End If
Else
    'code si expression n'est pas numérique

End If

End Sub
Sub scan_colonne_E()

 Dim DerLig As Long
    'Instance de la feuille qui permet d'utiliser FL1 partout dans
    'le code à la place du nom de la feuille
    Set FL1 = Worksheets("Resultat")

    'Détermination de la dernière ligne renseignée de la feuille de calculs
    DerLig = Split(FL1.UsedRange.Address, "$")(4)

    'Fixe le N° de la colonne à lire
    NoCol = 5

    'Utilisation du N° de ligne dans une boucle For ... Next
    For NoLig = 7 To DerLig Step -1
        Var = FL1.Cells(NoLig, NoCol)
        VerifierNombres

    Next
    Set FL1 = Nothing
End Sub

Bonjour et bienvenue,

Il y a une instruction au moins qui paraît surprenante:

For NoLig = 7 To DerLig Step -1

... impliquerait que le nombre de lignes utilisées en feuille "Résultat" soit strictement inférieur à 7

Pour éviter toute surprise et permettre -éventuellement- à ceux qui le souhaiteraient de faire une proposition différente, un exemple des données figurant dans ton fichier serait sans aucun doute utile

Bonjour,

ceci serait déjà mieux

For NoLig = DerLig To 7  Step -1

merci grâce a votre modification gros changements. les instructions commences à passer enfin. Effectivement mon scan pour les lignes était pas bon.

Par contre maintenant j'ai un stop avec une incompatibilité de type au niveau de l'instruction

Rows(NoLig & ":" & NoLig).Delete

Bonjour,

    For NoLig = 7 To DerLig Step -1
        Var = FL1.Cells(NoLig, NoCol)
        VerifierNombres
    Next

Avec ça, tu n'as aucune chance d'entrer dans ta boucle !

A part ça, il y aurait beaucoup de points à revoir dans le code.

  • dualité de ta variable DerLig en variable locale et variable niveau module,
  • la nécessité de variables niveau module n'est pas patente, et on ferait bien de s'en passer, et passer les éléments nécessaires par arguments à la procédure appelée,
  • la définition de DerLig serait plus fiablement définie de façon plus classique, et sur la colonne testée,
  • et si on entre dans les détails, inutile de tester si une expression renvoyant une valeur booléenne renvoie Vrai ou Faux, c'est un pléonasme en langage courant, et cela fait faire un calcul supplémentaire à VBA...
  • un certain nombre de petits détails peuvent encore être revus, mais ne nous apesantissons pas !

Règle déjà ta syntaxe de boucle !

Ton problème suivant :

1) Rows(NoLig).Delete suffirait (et il serait mieux que Rows soit qualifiée).

2) Cela semble confirmer que le choix d'une variable module comme variable de boucle n'ait pas les effets voulus...

En fait tu ferais mieux de fusionner tes 2 procédures, cela t'éliminera des problèmes.

Cordialement.

Bonjour domcoool, MFerrand, U-Milité,Thev,

Je profite de la présence des pros pour me prêter à l'exercice :

Sub Supprime()

Dim i As Long, dl As Long

 dl = Range("A" & Rows.Count).End(xlUp).Row

   For i = 7 To dl

   Application.ScreenUpdating = False

    If IsNumeric(Range("E" & i)) And Len(Range("E" & i)) <> 6 Then
       Rows(i).EntireRow.Delete
    End If

   Next i

End Sub

Est-ce correct ?

Cordialement,

Salut xorsankukai, MFerrand, thev (par ordre inverse d'apparition )

Je profite de la présence des pros

C'est malin plus personne n'ose répondre après ça

Comme thev le préconisait, en cas de suppression de lignes à l'intérieur d'une boucle, il faut commencer par la dernière et "remonter" vers le début.

A la relecture, il y a une ambiguïté : le contenu est un nombre ou du texte ?

Si on ne se base que sur le nombre de caractères il serait sans doute préférable de n'agir qu'en fonction de ce critère en forçant la conversion en texte (CStr)...

C'est un point à clarifier.

j'ai les deux en nombres et textes. J'ai aussi quelques cellules vides

Re,

Comme thev le préconisait, en cas de suppression de lignes à l'intérieur d'une boucle, il faut commencer par la dernière et "remonter" vers le début.

Sub Supprime()

Dim i As Long, dl As Long

 dl = Range("A" & Rows.Count).End(xlUp).Row

   For i = dl To 7 Step -1

   Application.ScreenUpdating = False

    If IsNumeric(Range("E" & i)) And Len(Range("E" & i)) <> 6 Then
       Rows(i).EntireRow.Delete
    End If

   Next i

End Sub
6classeur1.xlsm (19.87 Ko)

EDIT:

j'ai les deux en nombres et textes. J'ai aussi quelques cellules vides

6classeur1.xlsm (19.87 Ko)

Re,

Je ferais ceci, sous réserve qu'il soit justifié que l'on ait des valeurs de type différent (nombre ou texte) dans la même colonne, ce qui me chiffonne...

Sub scan_colonne_E()
    Dim dL&, i&
    With Worksheets("Resultat")
        dL = .Range("E" & .Rows.Count).End(xlUp).Row
        Application.ScreenUpdating = False
        For i = dL To 7 Step -1
            If .Cells(i, 5) <> "" Then
                If Len(CStr(.Cells(i, 5))) <> 6 Then .Rows(i).Delete
            End If
        Next i
    End With
End Sub

Si le nombre de lignes à supprimer est important, mieux vaudrait utiliser une méthode permettant la suppression en une fois en fin de procédure...

Cordialement.

Re,

@MFerrand: pas trop mon genre de couper les cheveux en quatre ... donc c'est juste pour comprendre (et puis, c'est pas pour moi, c'est pour xorsankukai ... et l'édification des foules à venir ) pourquoi tester que la cellule n'est pas vide ... si on vérifie ensuite que le nombre de caractères est bien 6 (le premier test serait plus rapide?)

merci à tous mon code fonctionne grace à vos explications, j'ai compris pk j'avais faux.

J'ai même réutilisé vos exemples dans un autres fichier pour un autre type de variable. Ca fonctionne.

Merci bcp

@U.Milité : J'avais cru comprendre qu'on ne supprimait pas les lignes où la cellule était vide, d'où la codition destinée à écarter les cellules vides de la suppression, mais si on doit les supprimer comme celles dont le nombre de caractères est différent de 6, cette condition doit effectivement disparaître.

Cordialement.

@MFerrand: j'en étais resté à la demande de départ, en ce qui me concerne (mais tu as peut-être raison ... tout dépend comment on l'interprète )

Si le nombre de caractères, est strictement différent de 6 ou null (cellule vide), la ligne est effacée

Rechercher des sujets similaires à "2016 code errone boucle colonne effacement ligne"