Si imbriqués

Résolu
Bonjour,



je souhaite faire une fonction de si imbriqués mais j'en ai plus que 7 donc ce n'est pas possible sur Excel c'est trop long. je souhaite donc passer sur VBA mais je suis débutant.

j'ai des cases de E9 à P9 et je souhaite que la case E5 prenne l'une des valeurs de E9 à P9 : la dernière non vide !

si P9 est vide alors E5 = O9
si O9 est vide alors E5 =N9
si N9 est vide alors E5= M9
... jusqu'à E5= E9
et si E9 est vide inscrire erreur.

mon essai pas très glorieux donne ça :

Sub Si_imbriquées()

Dim numera As Integer

If Range("P9") = "" Then numero = Range("O9")
ElseIf Range("O9") = "" Then numero = Range("N9")
ElseIf Range("N9") = "" Then numero = Range("M9")
ElseIf Range("M9") = "" Then numero = Range("L9")
ElseIf Range("L9") = "" Then numero = Range("K9")

ElseIf Range("K9") = "" Then numero = Range("J9")
ElseIf Range("J9") = "" Then numero = Range("I9")
ElseIf Range("I9") = "" Then numero = Range("H9")

ElseIf Range("H9") = "" Then numero = Range("G9")
ElseIf Range("G9") = "" Then numero = Range("F9")
Else: numero = Range("E9")
End If
End Sub

merci

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Bonjour,

    Essaye avec Range(...).Value et pas besoin de ":" après ton dernier "else"
    Et pour que si ça marche, plutôt que des "ElseIf", je pense qu'il faut que tu imbriques tes "if" comme ça :
    If ... then
    If then
    [...]
    End if
    End if

    Car le but est de trouver la première case non-vide si j'ai bien compris ?
    1. Modérateur
      Bon, j'ai simulé un peu. En respectant la structure que tu as imaginée, ton code aura cette allure-là :
      Sub Si_imbriques()

      If Range("P9").Value = "" Then
      If Range("O9").Value = "" Then
      If Range("N9").Value = "" Then
      If Range("M9").Value = "" Then
      Range("E5").Value = Range("L9").Value
      Else
      Range("E5").Value = Range("M9").Value
      End If
      Else

      Range("E5").Value = Range("N9").Value

      End If
      Else

      Range("E5").Value = Range("O9").Value

      End If

      Else

      Range("E5").Value = Range("P9").Value

      End If

      End Sub

      Tu noteras qu'une variable "numéro" est inutile.
      Il manquait principalement le "qu'est-ce qui se passe si la case n'est pas vide ?"
      Je ne suis pas allé jusqu'au bout car tu vois que c'est un peu long à taper... aussi je suis tenté de te proposer ce code qui simplifie beaucoup l'écriture :
      Sub Si_imbriques()

      For I = 0 To 11

      If Cells(9, 16 - I).Value <> "" Then

      Range("E5").Value = Cells(9, 16 - I).Value
      Exit For

      End If

      Next

      End Sub


      Le principe :
      La boucle For va tourner 12 fois maximum (car de P à E ça fait 12 colonnes), la valeur I initialisée à 0 va augmenter de 1 à chaque relance de la boucle.

      Cells(9,16) fait référence à la cellule de la 9ème ligne et de la 16ème colonne, soit P9.
      A chaque tour, elle fera référence à la colonne précédente vu qu'on y retranche I.
      Dès qu'elle tombe sur une valeur, E5 prend cette valeur et on sort de la boucle avant qu'elle n'ait fait ses 12 tours.
  2. ah oui c'est bcp plus court comme tu me le proposes et en plus ça marche!

    je sais pas si jarriverai a le refaire mais c'est parfait!

    merci mille fois !

    Ce qui me pose pb c'est plus le language j'ai fait du turbo pascal avt donc je comprends le principe mais utiliser les bons termes c'est le plus compliqué !
    1. Modérateur
      C'est pour ça que j'ai tenté d'expliquer le principe de ce code :)
      Mais c'est certain qu'il faut avoir l'esprit algorithmique pour être à l'aise dans cette façon de penser (merci les cours de C).
      Pour ce qui est des syntaxes, tu peux utiliser ce site https://www.excel-pratique.com/fr/vba/couleurs.php
      Personnellement j'en abuse.

      N'oublie pas de cliquer sur le bouton signalant que le problème est résolu !