VBA Excel - Pb d'actualisation boucle for

Résolu
saian-sugus Messages postés 35 Statut Membre -  
saian-sugus Messages postés 35 Statut Membre -
Bonjour,

J'ai créé un programme qui m'efface une ligne sous tel ou tel condition en VBA, et qui me met la ligne en rouge si l'intérieur de la cellule est inconnu. Lorsque le programme efface une ligne, il descendra automatiquement une ligne trop bas, et mettra donc la première ligne vide en rouge, ainsi de suite s'il y a plusieurs effacements. J'ai pensé à mettre un nb_lignes = nb_lignes -1 mais le programme ne prend pas en compte cette info, la boucle étant lancée.

Mon code:

For d = 2 To nb_lignes 'Si la filière est égale à XY alors supprimer la ligne
    If Cells(d, 6) = "Educateur/trice social-e" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "Animateur/trice socioculturel-le" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "Assistant-e social-e" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "Maître-sse socioprofessionnel-le" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "Education de la petite enfance" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "Soins infirmiers CRS" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "Aide soignant-e" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "ES Tourisme" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
    ElseIf Cells(d, 6) = "Economie d'entreprise" Then
    ElseIf Cells(d, 6) = "Travail social" Then
    ElseIf Cells(d, 6) = "Soins infirmiers" Then
    ElseIf Cells(d, 6) = "Physiothérapie" Then
    ElseIf Cells(d, 6) = "Technologie du vivant" Then
    ElseIf Cells(d, 6) = "Technologies du vivant" Then
    ElseIf Cells(d, 6) = "Systèmes industriels" Then
    ElseIf Cells(d, 6) = "Tourisme" Then
    ElseIf Cells(d, 6) = "Informatique de gestion" Then
    ElseIf Cells(d, 6).Value Like "*MAS*" Then
    ElseIf Cells(d, 6).Value Like "*DAS*" Then
    ElseIf Cells(d, 6).Value Like "*CAS*" Then
    ElseIf Cells(d, 6).Value Like "*FC*" Then
    ElseIf Cells(d, 6).Value Like "*Infogest*" Then
    Else
    Range("A" & d, "H" & d).Interior.Color = RGB(255, 0, 0)
    End If
Next d


Exemple:
Je lance le programme avec nb_lignes pour 170
Il efface trois lignes, nb_lignes sera de 167

--> le programme ne tiendra pas compte du nouveau chiffre de nb_lignes et ira jusqu'à 170..

Que faire? Merci d'avance
Configuration: Windows XP
Internet Explorer 7.0
A voir également:

3 réponses

eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
 
Bonjour,

Si tu effaces la ligne 2 c'est la ligne 3 qui devient 2...
Dans ce cas il faut toujours partir du bas :
For d = nb_lignes to 2 step -1
et plus de pb...

eric

PS: désolé macgawel je ne t'avais pas lu jusqu'au bout la 1ère fois...
2
saian-sugus Messages postés 35 Statut Membre
 
Merci eriiic et macgawel,

en effet je n'avais pas du tout pensé à cette solution, parfait :)

Je vais mettre cela à jour, bonne journée !
0
macgawel Messages postés 676 Statut Membre 89
 
Bonjour.

C'est normal : VBA - comme la plupart des langages de programmation (en fait, tous ceux que je connais) "calcule" la boucle avant de la parcourir.
En gros :
1. Il regarde la boucle FOR, et voit qu'il doit donner les valeurs 2 à nb_lignes=170 à d.
2. Ensuite, même si tu diminues la valeur de nb_lignes, il est trop tard...

Une solution :
Utiliser une boucle WHILE, et incrémenter la valeur de d "manuellement" (attention, je ne maîtrise pas le VBA, il y a peut-être des erreurs).
d = 2
WHILE d <= nb_lignes
   IF Cells(d, 6) = "Educateur/trice social-e" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
        d = d - 1
        nb_lignes = nb_lignes - 1
   End IF
   ...
   d = d+1
End WHILE


Mais en général, pour éviter ce genre de problème on part du "haut" :
FOR d = nb_lignes to 2 step -1 'Voir la syntaxe exacte pour aller en descendant...
   IF Cells(d, 6) = "Educateur/trice social-e" Then
        Range("A" & d).Select
        Selection.EntireRow.Delete
   End IF
   ...
end FOR

De cette manière, quand tu supprimes une ligne, il passe à la précédente et ça ne devrait plus poser de problème :
Tu supprimes la ligne 150, puis tu passes à la ligne 149 qui n'a pas changé.

J'espère avoir été clair...

0
yahya_44 Messages postés 2 Statut Membre
 
salut
j v savoir
comment j peut sortit de compilation avec un botton
merci
-1