Je suis relativement nouveau dans VBA. J'essaie d'écrire un code pour les IF imbriquées dans VBA. J'ai le code suivant, mais la sortie est fausse. Comment puis-je faire fonctionner la fonction if imbriquée?
Private Sub CommandButton1_Click() If Range("H2") = 1 Then Range("X3") = "$CT$10:$CT$150" If Range("H2") = 2 Then Range("X3") = "$CZ$10:$CZ$150" If Range("H2") = 3 Then Range("X3") = "$DF$10:$DF$150" If Range("H2") = 4 Then Range("X3") = "$DL$10:$DL$150" If Range("H2") = 5 Then Range("X3") = "$DR$10:$DR$150" If Range("H2") = 6 Then Range("X3") = "$DX$10:$DX$150" If Range("H2") = 7 Then Range("X3") = "$ED$10:$ED$150" If Range("H2") = 8 Then Range("X3") = "$EJ$10:$EJ$150" If Range("H2") = 9 Then Range("X3") = "$EP$10:$EP$150" If Range("H2") = 10 Then Range("X3") = "$EV$10:$EV$150" If Range("H2") = 11 Then Range("X3") = "$FB$10:$FH$150" If Range("H2") = 12 Then Range("X3") = "$FH$10:$FH$150" End If End If End If End If End If End If End If End If End If End If End If End If End Sub
Le code ne fonctionne en quelque sorte que si H2 = 1. Sinon, il ne fonctionne pas.
5 Réponses :
La syntaxe de l'instruction IF-THEN-ELSE dans Microsoft Excel est:
If condition_1 Then result_1 ElseIf condition_2 Then result_2 ... ElseIf condition_n Then result_n Else result_else End If
Pour clarifier, la solution ne constitue pas une instruction imbriquée. "Nested" si les instructions ne sont pas nécessaires dans ce cas.
Vous imbriquez les instructions if afin de travailler le code, elles doivent toutes être vraies, ce qui est impossible. Vous devriez le formater comme ceci:
If Range("H2") = 1 Then Range("X3") = "$CT$10:$CT$150" ElseIf Range("H2") = 2 Then Range("X3") = "$CZ$10:$CZ$150" ElseIf Range("H2") = 3 Then Range("X3") = "$DF$10:$DF$150" ... End If
Cependant, dans votre situation, je vous conseillerais d'utiliser une casse de sélection
pour rendre le code plus propre et plus facile à lire. P >
Pour quelque chose comme ça, j'aime utiliser Select Case:
Private Sub CommandButton1_Click() With Worksheets("Sheet1") ' change to your sheet Select Case .Range("H2") Case 1 .Range("X3") = "$CT$10:$CT$150" Case 2 .Range("X3") = "$CZ$10:$CZ$150" '... The rest Case Else .Range("X3") = "" End Select End With End Sub
Prenez du recul - vous avez une distance définie entre chaque colonne, en fonction de la valeur de H2
.
Vous n'avez pas besoin de IF
ou Sélectionnez Cas
, juste quelques arithmétiques rapides:
Sub t() Dim startCol As Long, tmpCol As Long startCol = 98 ' This is the `CT` Column With Worksheets("Sheet1") ' Change as needed tmpCol = startCol + 6 * (.Range("H2").Value - 1) Dim rng As Range Set rng = .Range(.Cells(10, tmpCol), .Cells(150, tmpCol)) .Range("X3").Value = rng.Address End With End Sub
Bon sang, vous et vos modèles. :)
@ScottCraner - Autant j'aime les longues déclarations Select Case
/ If
, vous devez aimer un bon modèle quand ça marche !
Je pense que c'est la meilleure solution. +1
Vos observations sont des entiers consécutifs. Mettez-le simplement dans un tableau:
Private Sub CommandButton1_Click() Dim addresses As Variant addresses = Array("$CT$10:$CT$150", "$CZ$10:$CZ$150", "$DF$10:$DF$150", "$DL$10:$DL$150", _ "$DR$10:$DR$150", "$DX$10:$DX$150", "$ED$10:$ED$150", "$ED$10:$ED$150", _ "$EJ$10:$EJ$150", "$EP$10:$EP$150", "$EV$10:$EV$150", "$FB$10:$FH$150", "$FH$10:$FH$150") Range("X3").Value = addresses(Range("H2").Value - 1) End Sub
Utilisez
Select Case
. Le problème est que vous imbriquez les Ifs donc il ne testera les autres que si H2 = 1 si H2 <> 1, il ne testera même pas les autres car ils sont à l'intérieur du premier if.Sauf le premier
IF
, remplacez tous les autres IF parELSEIF
et à la fin, gardez juste unEndIF
. Supprimez le reste desEnd Ifs
SI n'est pas une fonction, c'est un mot-clé, le retour de Range n'est pas un entier, définissez des points d'arrêt sur les zones que vous souhaitez vérifier puis utilisez le débogueur pour examiner les plages.