4
votes

VBA imbriqué IF dans Excel

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.


3 commentaires

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 par ELSEIF et à la fin, gardez juste un EndIF . Supprimez le reste des End 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.


5 Réponses :


4
votes

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


1 commentaires

Pour clarifier, la solution ne constitue pas une instruction imbriquée. "Nested" si les instructions ne sont pas nécessaires dans ce cas.



3
votes

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 >


0 commentaires

4
votes

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


0 commentaires

11
votes

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


3 commentaires

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



3
votes

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


0 commentaires