Boucle de condition

Résolu
Jono -  
Jono92600 Messages postés 78 Statut Membre -
Bonjour,

C'est ma première fois sur ce site, j'espère y trouvé ma réponse.
Depuis plus de 3 jours, je bloque sur une condition.

J'ai un tableau Excel, j'aimerai mettre plusieurs conditions sur une ligne entière choisie par un Combobox.

La condition est :
si la ligne 1 = "" alors
ligne 3 = "Blabla"
si ligne ligne 1 <> "" alors
on passe à la ligne 2
si ligne 2 = "" alors
ligne 3 = "bbbbb"
sinon on passe à la ligne 4
si la ligne 5 = "" alors
ligne 7 = "Blabla"
si ligne ligne 5 <> "" alors
on passe à la ligne 6
si ligne 6 = "" alors
ligne 7 = "bbbbb"

En vous remerciant de votre réponse.

Merci.

15 réponses

  1. bahbah
     
    beaucoup de blabla et rien de précis ni de vraiment clair.
    Tu espères vraiment une réponse !!!!!!!!!
    0
  2. Jono92600 Messages postés 78 Statut Membre
     
    Bonjour,

    Pour te répondre Bahbah.

    J'aimerai pouvoir mettre une condition sur mon tableau Excel. J'ai plusieurs colonnes (A,B,C,D,E et F).

    Si la 1ere ligne de la colonne A est vide alors sur cette même ligne de la colonne G = Toto
    Si la 1ere ligne de la colonne A est remplie alors on passe à la colonne B de la même ligne

    Si la 1ere ligne de la colonne B est vide alors sur cette même ligne de la colonne G = Paul
    Si la 1ere ligne de la colonne B est remplie alors on passe à la colonne C de la même ligne

    Si la 1ere ligne de la colonne C est vide alors sur cette même ligne de la colonne G = Piere
    Si la 1ere ligne de la colonne C est remplie alors on passe à la colonne D de la même ligne

    Si la 1ere ligne de la colonne D est vide alors sur cette même ligne de la colonne G = Andre
    Si la 1ere ligne de la colonne D est remplie alors on passe à la colonne E de la même ligne

    Si la 1ere ligne de la colonne E est vide alors sur cette même ligne de la colonne G = Bobo
    Si la 1ere ligne de la colonne E est remplie alors on passe à la colonne F de la même ligne

    Si la 1ere ligne de la colonne F est vide alors sur cette même ligne de la colonne G = JoJo
    Si la 1ere ligne de la colonne F est remplie alors sur cette même ligne de la colonne G = Terminer

    En vous remerciant d'avance de votre réponse.

    Cdt
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,

      Sauf incompréhension de ma part, il ne s'agit pas d'une "boucle de conditions", mais bel et bien de tests If, ElseIf, ElseIf...
      Essaye quelque chose comme :
      If Range("A1") = "" Then
          Range("G1") = "Toto"
      ElseIf Range("B1") = "" Then
          Range("G1") = "Paul"
      ElseIf Range("C1") = "" Then
         Range("G1") = "Piere"
      '.....
      ElseIf Range("F1") = "" Then
         Range("G1") = "Jojo"
      Else
         Range("G1") = "Terminer"
      End If
      0
      1. Jono92600 Messages postés 78 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bonjour,

        Tous d'abord merci pour la réponse.

        C'est exactement ça mais, je veux que les condition s'applique sur les colonnes entières (A,B,C,D,E et F).

        Merci
        0
      2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Jono92600 Messages postés 78 Statut Membre
         
        Alors, il faut boucler sur toutes les lignes :
        Dim i As Long
        For i = 1 To 100
          If Range("A" & i) = "" Then
            Range("G" & i) = "Toto"
          ElseIf Range("B" & i) = "" Then
            Range("G" & i) = "Paul"
          ElseIf Range("C" & i) = "" Then
           Range("G" & i) = "Piere"
          '.....
          ElseIf Range("F" & i) = "" Then
           Range("G" & i) = "Jojo"
          Else
           Range("G" & i) = "Terminer"
          End If
        Next

        Ou, si tu as beaucoup de lignes concernées, passer par une variable tableau.
        0
    2. Jono92600 Messages postés 78 Statut Membre
       
      j'ai exactement fait le même code sa fonctionne mais, quand je lance la macro ma colonne G prend en compte les lignes vides. Ce tableau se remplira au fur et à mesure dans le temps. Donc, l'idéal pour moi est d'appliquer le code que sur les colonnes et lignes remplis.

      Merci.

      Mon code adapté a mon tableau :


      Dim i As Long

      For i = 1 To 100

      If Range("E3" & i) = "" Then
      Range("AD3" & i) = "Date d'envoie d'offre"
      ElseIf Range("F3" & i) = "" Then
      Range("AD3" & i) = "Il faut envoyer l'offre"
      ElseIf Range("H3" & i) = "" Then
      Range("AD3" & i) = "Attente de l'AAO"
      ElseIf Range("I3" & i) = "" Then
      Range("AD3" & i) = "Attente de m'AAO"
      ElseIf Range("K3" & i) = "" Then
      Range("AD3" & i) = "AAO reçu"
      ElseIf Range("L3" & i) = "" Then
      Range("AD3" & i) = "Essais planifiés"
      ElseIf Range("N3" & i) = "" Then
      Range("AD3" & i) = "Essais en cours"
      ElseIf Range("O3" & i) = "" Then
      Range("AD3" & i) = "Fin des essais"
      ElseIf Range("Q3" & i) = "" Then
      Range("AD3" & i) = "Il faut envoyer le rapport intermédiare"
      ElseIf Range("R3" & i) = "" Then
      Range("AD3" & i) = "Il faut envoyer le rapport intermédiare"
      ElseIf Range("T3" & i) = "" Then
      Range("AD3" & i) = "Il faut envoyer le rapport final"
      ElseIf Range("U3" & i) = "" Then
      Range("AD3" & i) = "Rapport final à envoyer"
      Else
      Range("AD3" & i) = "Rapport final envoyé"

      End If

      La colonne "AD" représente mon résultat

      Merci de votre aide.
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Jono92600 Messages postés 78 Statut Membre
         
        Relis toi, relis ton code, et pose nous une question compréhensible.
        0
  3. Jono92600 Messages postés 78 Statut Membre
     
    Pour être plus compréhensible, je vais partir de votre exemple.
    Dans ce dode :

    Dim i As Long
    For i = 1 To 100
    If Range("A" & i) = "" Then
    Range("G" & i) = "Toto"
    ElseIf Range("B" & i) = "" Then
    Range("G" & i) = "Paul"
    ElseIf Range("C" & i) = "" Then
    Range("G" & i) = "Piere"
    '.....
    ElseIf Range("F" & i) = "" Then
    Range("G" & i) = "Jojo"
    Else
    Range("G" & i) = "Terminer"
    End If
    Next

    Quand j'applique le code sur mon tableau, dans la colonne "G" toutes les lignes de cette colonne sont remplies.

    Je veux que le code s'applique sur la colonne "G" mais qu'avec les lignes remplies dan le tableau.

    J'espère être compris cette fois :) .

    C'est dommage qu'on ne puisse pas mettre des Pj.

    Merci.
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      J'espère être compris cette fois :)
      Non, pas davantage.

      Pour joindre un fichier sur les forums de ccm il faut :
      > se rendre sur le site : https://www.cjoint.com/
      > cliquer sur "Parcourir"
      > rechercher le fichier
      > cliquer sur "Ouvrir"
      > cliquer sur "Créer le lien Cjoint"
      > copier le lien
      > revenir ici le coller dans une réponse
      0
      1. Jono92600 Messages postés 78 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        0
      2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Jono92600 Messages postés 78 Statut Membre
         
        Désolé, mais je ne comprends pas mieux.
        Dis nous exactement ce que tu veux avec des mots simples.
        0
      3. Jono92600 Messages postés 78 Statut Membre > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Quand j'applique votre code ma colonne "AD" n'est pas bien renseigné, il y a des lignes qui sont sautées.

        Je veux que le code s’exécute uniquement sur les lignes remplis. par exemple de la ligne 3 à la dernière ligne renseignée (exemple ligne 8).

        Mais que à l'avenir quand je vais rajouter une nouvelle ligne, le code s’exécute sur cette nouvelle ligne aussi.
        0
  4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bon.
    Alors...
    Dim PremLig As Long
    Dim DL As Long
    Dim i As Long
    'dernière ligne colonne A
    DL = Range("A" & Rows.Count).End(xlUp).Row 
    'première ligne à traiter :
    PremLig = 3
    'Boucle :
    For i = PremLig To DL
        If Range("E" & i) = "" Then 
            Range("AD" & i) = "Date d'envoi d'offre" 
        ElseIf Range("F" & i) = "" Then 
            Range("AD" & i) = "Il faut envoyer l'offre" 
        ElseIf Range("H" & i) = "" Then 
            Range("AD" & i) = "Attente de l'AAO" 
        ElseIf Range("I" & i) = "" Then 
            Range("AD" & i) = "Attente de l'AAO" 
        ElseIf Range("K" & i) = "" Then 
            Range("AD" & i) = "AAO reçu" 
        ElseIf Range("L" & i) = "" Then 
            Range("AD" & i) = "Essais planifiés" 
        ElseIf Range("N" & i) = "" Then 
            Range("AD" & i) = "Essais en cours" 
        ElseIf Range("O" & i) = "" Then 
            Range("AD" & i) = "Fin des essais" 
        ElseIf Range("Q" & i) = "" Then 
            Range("AD" & i) = "Il faut envoyer le rapport intermédiaire" 
        ElseIf Range("R" & i) = "" Then 
            Range("AD" & i) = "Il faut envoyer le rapport intermédiaire" 
        ElseIf Range("T" & i) = "" Then 
            Range("AD" & i) = "Il faut envoyer le rapport final" 
        ElseIf Range("U" & i) = "" Then 
            Range("AD" & i) = "Rapport final à envoyer" 
        Else 
            Range("AD" & i) = "Rapport final envoyé" 
        End If 
    Next i 


    N'ajoutes pas de chiffre. Range("AD" & i) pour i de 3 à 8 va te donner successivement :
    Range("AD3")
    Range("AD4")
    Range("AD5)
    Range("AD6")
    Range("AD7")
    Range("AD8")
    Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Jono92600 Messages postés 78 Statut Membre
     
    C'est parfait le code fonctionne à merveille. Je vous en suis très très reconnaissant.

    C'est supers.

    Merci beacoup.
    0
  7. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Voici une autre méthode :
    Sub conditionV2()
    Dim PremLig As Long, DL As Long, i As Long, j As Long
    Dim Cols As Variant, Texte As Variant
    
    'dernière ligne colonne A
    DL = Range("A" & Rows.Count).End(xlUp).Row
    'première ligne à traiter :
    PremLig = 3
    'array des colonnes à traiter
    Cols = Array("E", "F", "H", "I", "K", "L", "N", "O", "Q", "R", "T", "U")
    'texte à saisir selon colonne
    Texte = Array("Date d'envoi d'offre", "Il faut envoyer l'offre", _
        "Attente de l'AAO", "Attente de l'AAO", "AAO reçu", _
        "Essais planifiés", "Essais en cours", "Fin des essais", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport intermédiaire", _
        "Il faut envoyer le rapport final", "Rapport final à envoyer", _
        "Rapport final envoyé")
    'Boucle :
    For i = PremLig To DL
        'double boucle
        For j = LBound(Cols) To UBound(Cols)
            If Range(Cols(j) & i) = "" Then Range("AD" & i) = Texte(j): Exit For
        Next j
        If Range("AD" & i) = "" Then Range("AD" & i) = Texte(UBound(Texte))
    Next i
    End Sub

    Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
    0
  8. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Ou encore, si et seulement si les colonnes E, F, H, I, K, L, N, O, Q, R, T et U sont complétées systématiquement dans cet ordre.

    Sub Macro_1()
    Dim Texte, NBVal As Integer, PL As Integer, DL As Long, L As Long
    
        'première ligne à traiter :
        PL = 3
        'dernière ligne colonne A
        DL = Range("A" & Rows.Count).End(xlUp).Row
        Texte = Array("Date d'envoi d'offre", "Il faut envoyer l'offre", _
            "Attente de l'AAO", "Attente de l'AAO", "AAO reçu", _
            "Essais planifiés", "Essais en cours", "Fin des essais", _
            "Il faut envoyer le rapport intermédiaire", _
            "Il faut envoyer le rapport intermédiaire", _
            "Il faut envoyer le rapport final", "Rapport final à envoyer", _
            "Rapport final envoyé")
        For L = PL To DL
            Range("AD" & L) = Texte(WorksheetFunction.CountA(Intersect(Rows(L), Range("E:F,H:I,K:L,N:O,Q:R,T:U"))))
        Next L
    End Sub

    0
    1. Jono92600 Messages postés 78 Statut Membre
       
      Bonjour,

      C'est supers sympa de m'aider. Je voulais vous envoyer mon fichier presque fini pour que vous me donniez votre avis mais le lien ne fonctionne pas avec le réseau de mon travail dommage.

      Il me reste encore quelques petits trucs à faire et sa sera fini.

      Merci.
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Jono92600 Messages postés 78 Statut Membre
       
      Tu peux toujours copier/Coller tous tes codes VBA ici que j'y regarde.
      0
    3. Jono92600 Messages postés 78 Statut Membre > Jono92600 Messages postés 78 Statut Membre
       
      Dommage le lien ne fonctionne pas. Il y a trop de trop de code. Je voulais vous montrer le résultat final.
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > Jono92600 Messages postés 78 Statut Membre
       
      le lien fonctionne ... maintenant !
      0
  9. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Par ordre :
    UserForm Accueil.
    Changer
    aa = Feuil4.Range("D3:D10000")

    par
    aa = Feuil4.Range("D3:D" & Feuil4.Range("D" & Rows.Count).End(xlUp).Row) 

    Le reste est OK
    0
    1. Jono92600 Messages postés 78 Statut Membre
       
      Merci beaucoup c'est super cool.
      0
  10. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Userform Resultats :
    Lorsque tu places en début de procédure :
    Application.ScreenUpdating = False

    remet sa valeur à True en fin de procédure avant le End Sub :
    Application.ScreenUpdating = True


    Private Sub VALIDER_Click() :
    remplace :
    If Trim(Me.ComboBox1) = "" Or Trim(Me.ComboBox1) = "" Then

    par :
    If Trim(Me.ComboBox1) = "" Then

    supprime la ligne inutile :
    no_ligne = Range("A3")

    Lors du transfert de date d'un textbox dans la feuille, il ne faut pas utiliser Format (cf ce sujet par exemple). Tu risques d'avoir des inversions jour-mois. Utilise CDate :
    remplace donc :
    Cells(no_ligne, 5) = Format(TextBox6.Value, "mm/dd/yyyy")

    par :
    Cells(no_ligne, 5) = CDate(TextBox6.Value)

    idem pour :
    Cells(no_ligne, 6) = Format(TextBox7.Value, "mm/dd/yyyy")
    0
  11. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Userform SplashScreen :

    Remplace ta procédure Private Sub UserForm_Activate() par ce code :
    Private Sub UserForm_Activate()
    Dim Cpt As Byte
    
        Do
            Application.Wait (Now + TimeValue("00:00:01"))
            With SplashScreen
                .Label4.Caption = SplashScreen.Label4.Caption + "."
                .Repaint
            End With
            Cpt = Cpt + 1
        Loop While Cpt < 3
        
        Application.Wait (Now + TimeValue("00:00:01"))
        Unload SplashScreen
        Accueil.Show
    End Sub

    Et d'ailleurs, il est ou ton Label4, je ne le vois pas...
    0
    1. Jono92600 Messages postés 78 Statut Membre
       
      Le Label4, je l'avais supprimé
      0
  12. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Userform1 :
    Si ça fonctionne bien, je ne vois pas de grossière erreur.
    Sauf :
    ta variable Début ne sert à rien.
    Il faut typer tes variables :
    Dim début, nLigneTxt, n, f

    deviendrait :
    Dim début As Long, nLigneTxt As Long, n As Long, f As Worksheet

    0
  13. Jono92600 Messages postés 78 Statut Membre
     
    J'ai fais toute les modifications.

    Si, je veux que dans les TextBox de mon Userform1 n'accepte que des dates, comment je fais ?
    0
  14. Jono92600 Messages postés 78 Statut Membre
     
    Car le but est de faire un calcule entre la date prévue et la date de réalisation.

    Si la date prévue est > Aujourd'hui et la la date de réaliser est vide alors
    Je mais dans la colonne AJ "A FAIRE" avec la couleur orange.

    Si Date prévue < Aujourd'hui et Réaliser est vide alors
    Je mais dans la colonne AJ "EN RETARD" avec la couleur rouge.

    Si Date prévue <> Aujourd'hui et Réaliser est vide alors
    Je mais dans la colonne AJ "FAIT" avec la couleur vert.

    Est-ce que c'est possible ?

    Si j'arrive à avoir sa, je rajouterais une colonne dans mon Userform1.

    SVP
    0
  15. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Pour les dates, il s'agit d'un autre sujet.
    Il convient donc de créer une nouvelle discussion sur le forum.
    Mais avant cela, je te recommande cette lecture.

    0
  16. Jono92600 Messages postés 78 Statut Membre
     
    Très bien, je vais voir le lien.

    Merci énormément.
    0