Boucle For If Next

pierrof

XLDnaute Occasionnel
Bonsoir tout le monde

Je voudrais à l'aide d'un code VBA réaliser une boucle me permettant de renseigner une case vide en fonction de la valeur d'une autre case, ci dessous le code faux. erreur next sans For
Merci de vos explications

Cordialement

For P = Cells.SpecialCells(xlCellTypeLastCell).Row To 2 Step -1
If Cells(P, "i").Value = "tata" And Cells(P, 10).Value = "" Then
Cells(P, 10).Value = "A"
Else
If Cells(P, "i").Value = "toto" And Cells(P, 10).Value = "" Then
Cells(P, 10).Value = "B"
Else
If Cells(P, "i").Value = "titi" And Cells(P, 10).Value = "" Then
Cells(P, 10).Value = "C"
Else
If Cells(P, "i").Value = "juju" And Cells(P, 10).Value = "" Then
Cells(P, 10).Value = "D"
Else
If Cells(P, "i").Value = "jojo" And Cells(P, 10).Value = "" Then
Cells(P, 10).Value = "E"
Else
If Cells(P, "i").Value = "gigi" And Cells(P, 10).Value = "" Then
Cells(P, 10).Value = "F"
End If
Next P
 

Dranreb

XLDnaute Barbatruc
Re : Boucle For If Next

Bonjour.
Supprimez des caractères derrière les Else jusqu'à ce qu'ils forment le mot clé ElseIf avec le If de la ligne suivante ainsi ramenée sur la même ligne.

Ou mieux faite un Select Case Cells(P, "I").Value puis Case "Toto": etc. Terninez par End Select
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Boucle For If Next

Ben ça s'écrirait comme ça :
VB:
For P = Cells.SpecialCells(xlCellTypeLastCell).Row To 2 Step -1
   If IsEmpty(Cells(P, 10).Value) Then
      Select Case Cells(P, "i").Value
         Case "tata": Cells(P, 10).Value = "A"
         Case "toto": Cells(P, 10).Value = "B"
         Case "titi": Cells(P, 10).Value = "C"
         Case "juju": Cells(P, 10).Value = "D"
         Case "jojo": Cells(P, 10).Value = "E"
         Case "gigi": Cells(P, 10).Value = "F"
         End Select
      End If
   Next P
Mais ce n'est probablement pas comme ça que je ferais. J'utiliserais un tableau et un Dictionary.
 

Dranreb

XLDnaute Barbatruc
Re : Boucle For If Next

Bonjour.
Oui, tout ce qui minimise le nombre de fois qu'on accède aux cellules est bon à prendre. C'est la construction de l'objet Range qui est couteuse en temps.
Il vaut mieux charger en une seule instruction des dizaines de milliers de cellules dans un tableau en mémoire que d'exécuter à peine une vingtaine d'instructions qui fabriquent chaque fois un objet Range représentant une seule cellule.
Une boucle ensuite sur les éléments du tableau n'est nullement pénalisante. Sauf s'il y a plusieurs boucles imbriquées.
Il y a aussi le système With Range(…): .FormulaR1C1 = "=…": .Value = .Value: End With qui minimise ce nombre d'accès.
Des Cells(…) dans une boucle c'est vraiment le pire. Même un For Each Cel In Range(…) est très légèrement préférable car au moins comme ça il ne fabrique qu'une seule fois l'objet Range qui représente toute la plage.
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
362

Statistiques des forums

Discussions
314 222
Messages
2 107 481
Membres
109 838
dernier inscrit
Mouh41