Variable en condition If - Else

Bonjour à tous,

Je travaille actuellement sur l'élaboration d'une userform. Elle dispose de plusieurs combobox en cascade. Sous certaines conditions, je fais intervenir des inputbox permettant de guider l'utilisateur dans la mise à jour de la base de donnée.

Cependant, je rencontre un problème pour une des variables. Le code fonctionne très bien au début, mais plante sur la fin. Si l'utilisateur choisi de ne pas modifier le nom de sa séquence, on lui demande de la décrire et le code fonctionne jusqu'au bout. A l'inverse, s'il choisi de ne pas le faire, on lui demande aussi de la décrire, mais que je clique sur oui ou non, rien ne se passe.

J'ai l'impression que les variables que j'utilise fonctionnent très bien pour un If, mais pas pour un If - Else. A vrai dire, il y a quelque chose que je n'arrive pas à voir, je ne sais pas où la placer (Dim VariableDes7 As string), je crois que le problème vient de là. Voici une bribe du code, en espérant pouvoir bénéficier de votre aide. (j'ai conscience qu'il n'est pas très propre, mais je suis novice dans l'utilisation)

Private Sub ComboBox4_Change ()

If ComboBox4.Value = Sheets("database").Range("D7:D7") And ComboBox4.Value = "Séquence libre" Then
    TextBox1.Value = Sheets("database").Range("E7:E7")
    TextBox2.Value = Sheets("database").Range("F7:F7")
    TextBox3.Visible = True

Dim VariableTest7 As String
VariableTest7 = Range("E7")
Dim VariableFam7 As String
VariableFam7 = Range("F7")

Rep = MsgBox("Veuillez créer votre séquence à cet emplacement " & Chr(13) & Chr(13) & VariableTest7 & " - " & VariableFam7 & Chr(13) & Chr(13) & "A présent, voulez-vous la nommer ?", vbYesNo)

If Rep = vbYes Then

Range("D7") = InputBox("Veuillez renommer la séquence", "Saisie de la séquence")

Dim VariableResult7 As String
VariableResult7 = Range("D7")

Rep1 = MsgBox("Votre séquence a été renommée : " & Chr(13) & Chr(13) & VariableResult7 & Chr(13) & Chr(13) & "Voulez-vous la modifier ?", vbYesNo + vbQuestion)

If Rep1 = vbYes Then

    Range("D7") = InputBox("Veuillez à nouveau renommer la séquence (dernier essai)", "Saisie de la séquence")
    Range("H7") = InputBox("Merci de décrire à quoi sert votre séquence")

Dim VariableDes7 As String
VariableDes7 = Range("H7")

Rep2 = MsgBox("Voici votre déscription : " & Chr(13) & Chr(13) & VariableDes7 & Chr(13) & Chr(13) & "Voulez-vous la modifier ?", vbYesNo + vbQuestion)

Else: Range("D7") = VariableResult7
Range("H7") = InputBox("Merci de décrire à quoi sert votre séquence")
Rep2 = MsgBox("Voici votre déscription : " & Chr(13) & Chr(13) & VariableDes7 & Chr(13) & Chr(13) & "Voulez-vous la modifier ?", vbYesNo + vbQuestion)

If Rep2 = vbYes Then
Range("H7") = InputBox("Merci de décrire à nouveau votre séquence (dernier essai)")
MsgBox ("Votre séquence a bien été enregistrée")

Else: Range("H7") = VariableDes7
MsgBox ("Votre séquence à bien été enregistrée")

If Rep = vbNo Then
Range("D7") = "Séquence libre"

End If
End If
End If
End If

ElseIf ComboBox4.Value = Sheets("database").Range("D7:D7") Then
        TextBox1.Value = Sheets("database").Range("E7:E7")
        TextBox2.Value = Sheets("database").Range("F7:F7")
        TextBox3.Value = Sheets("database").Range("H7:H7")
        TextBox3.Visible = True
End If

End Sub

Bonjour,

j'ai jeté un oeil à ton code et j'ai essayé de revoir la façon dont c'était écrit, je me suis rendu compte que tu répetais des choses sans le faire exprès et je n'ai gardé que le nécessaire, ça donner ceci:

Private Sub ComboBox4_Change()
Dim VariableTest7 As String, VariableFam7 As String, VariableResult7 As String, VariableDes7 As String

With Sheets("database")
    If ComboBox4 = .Range("D7") And ComboBox4 = "Séquence libre" Then
        'affectations de valeurs
        TextBox1 = .Range("E7")
        TextBox2 = .Range("F7")
        TextBox3.Visible = True
        VariableTest7 = Range("E7")
        VariableFam7 = Range("F7")

        Rep = MsgBox("Veuillez créer votre séquence à cet emplacement " & Chr(13) & Chr(13) & VariableTest7 & " - " & VariableFam7 & Chr(13) & Chr(13) & "A présent, voulez-vous la nommer ?", vbYesNo)
        If Rep = vbYes Then
            Range("D7") = InputBox("Veuillez renommer la séquence", "Saisie de la séquence")
            VariableResult7 = Range("D7")

            'modif séquence
            Rep1 = MsgBox("Votre séquence a été renommée : " & Chr(13) & Chr(13) & VariableResult7 & Chr(13) & Chr(13) & "Voulez-vous la modifier ?", vbYesNo + vbQuestion)
            If Rep1 = vbYes Then
                Range("D7") = InputBox("Veuillez à nouveau renommer la séquence (dernier essai)", "Saisie de la séquence")
            End If
            Range("H7") = InputBox("Merci de décrire à quoi sert votre séquence")

            'modif description
            Rep2 = MsgBox("Voici votre description : " & Chr(13) & Chr(13) & VariableDes7 & Chr(13) & Chr(13) & "Voulez-vous la modifier ?", vbYesNo + vbQuestion)

            If Rep2 = vbYes Then
                Range("H7") = InputBox("Merci de décrire à nouveau votre séquence (dernier essai)")
                MsgBox ("Votre séquence a bien été enregistrée")
            End If

        ElseIf Rep = vbNo Then
            Range("D7") = "Séquence libre"
        End If
    ElseIf ComboBox4.Value = .Range("D7") Then
        'affectation de valeurs
        TextBox1.Value = .Range("E7")
        TextBox2.Value = .Range("F7")
        TextBox3.Value = .Range("H7")
        TextBox3.Visible = True
    End If
End With
End Sub

Est-ce que ça marcherait comme ça?

Bonjour, salut Ausecour,

Une proposition complémentaire concernant la saisie : plutôt que de demander 3 fois dans 3 variables (par ailleurs on évite de déclarer les variables en cours de procédure), ne serait-il pas judicieux d'utiliser une boucle ? Quelque chose du genre :

Do
    NomSeq = InputBox("Veuillez renommer la séquence", "Saisie de la séquence", NomSeq)
    Rep = MsgBox("Votre séquence a été renommée : " & Chr(13) & Chr(13) & NomSeq & Chr(13) & Chr(13) & "Voulez-vous la modifier ?", vbYesNo + vbQuestion)
Loop While Rep = vbYes
Range("D7") = NomSeq
MsgBox ("Votre séquence a bien été enregistrée")

Salut AuSecour, Salut Pedro,

En effet, je ne connais pas les écritures simplifiées

Pour tout dire, je pensais que les variables devaient être placées à un endroit précis pour fonctionner sur une condition.

AuSecour, ton code fonctionne à merveille !!! Je te remercie d'avoir pris le temps de le retravailler, et de l'avoir retourné prêt à l'emploi. Juste une chose surprenante, la "VariableDes7" ne s'affiche pas dans la MsgBox, tout à l'air pourtant clean, je ne comprend pas. Si non, c'est vrai qu'en voyant ton code, je me rend compte que je me répète pas mal, mais ça va venir !

Pedro, l'idée de la loop m'a l'air super et beaucoup plus compacte. Néanmoins, le problème serait à mon sens, qu'il y a une centaine de ligne avec "Séquence libre". Je suis donc obligé de définir les range pour chacune d'entres elles... Au risque de copier des informations saisies au mauvais endroit (d'où les 7 en fin de variables, correspondant à la ligne), Enfin, j'imagine que ça doit être possible, mais mon niveau ne me le permet pas.

Je sais que ça va vous sembler archaïque, mais je vais faire du copier coller pour toutes les lignes

Merci à vous deux en tout cas !

Juste une chose surprenante, la "VariableDes7" ne s'affiche pas dans la MsgBox, tout à l'air pourtant clean, je ne comprend pas.

Cette variable n'est définie nulle part, puisque l'InputBox de la ligne précédente stocke directement le résultat dans une cellule.

Pedro, l'idée de la loop m'a l'air super et beaucoup plus compacte. Néanmoins, le problème serait à mon sens, qu'il y a une centaine de ligne avec "Séquence libre". Je suis donc obligé de définir les range pour chacune d'entres elles... Au risque de copier des informations saisies au mauvais endroit (d'où les 7 en fin de variables, correspondant à la ligne), Enfin, j'imagine que ça doit être possible, mais mon niveau ne me le permet pas.

Non, tu t'embarques encore dans un truc compliqué alors qu'une variable correspondant à ton numéro de ligne ferais l'affaire (éventuellement associée à une boucle). Exemple :

Lig = 7 
Range("D" & Lig) = NomSeq 'équivaut à : Range("D7") = NomSeq

Dans une boucle :

For Lig = 7 To 100 '<-- 100 peut-être remplacé par une variable correspondant à la dernière ligne 
    NomSeq = InputBox("Saisir machin") '...
    Range("D" & Lig) = NomSeq 
Next Lig

PS : si besoin, n'hésite pas à consulter les cours VBA du site (ils sont clairs et concis je trouve).

Bonjour,

Comme discuté avec AuSecour, il est préférable que je dépose mon fichier ici. Je pense que cela facilitera la compréhension ! Il a été modifié par soucis de confidentialité.

Comme cité précédemment, j'ai essayé de faire des copier-coller du code de AuSecour, mais celui-ci s’enchaîne avec les lignes suivante. J'ai pensé utilisé la commande Exit Sub, mais comment faire pour reprendre le Sub après ça ? Comment faire pour que le code de AuSecour se stoppe une fois la nouvelle séquence enregistrée ? (vous retrouverez ma question tout en bas du code).

Merci par avance de vos retours.

UP -> Fichier test et explication au dessus. Merci par avance de vos retour

Bonjour,

je viens de regarder rapidement la totalité de ton code, et il est très long, je souhaiterais savoir ce qu'est censé faire le code qui se trouve après celui que tu as copié, parce que j'ai l'impression que c'est la même chose que ce qui est fait par le mien, après j'ai regardé brèvement en pensant que tu sauras m'expliquer la fonction de ce bout de code qui se trouve là

Tu peux me renseigner?

Bonjour Ausecour,

En effet, le code est le même, seule les variables et les cellules de destination changent. Je pensais faire des copier coller de ton code en modifiant les variables et les destinations, de sortes à ce que:

Si l'utilisateur sélectionne dans la combobox 4 une "séquence libre" (par exemple celle en D7), on lui propose la modification, et cette dernière s'implémente en D7.

Si l'utilisateur sélectionne dans la combobox 4 une "séquence libre" (par exemple celle en D9), on lui propose la modification, et cette dernière s'implémente en D9.

Et ce avec un arrêt entre les deux. J'aurai du mal à le définir en d'autres termes.

Autrement-dit, cela permet de mettre à jour la base de donnée (à des emplacements exacts), en fonction de la sélection de l'utilisateur.

Je pense que tu comprendras ce que je veux faire si tu lances l'userform, puis sélection de:

Service 1

Zone 1

Machine 1

Séquence libre (la première - celle qui se trouve en réalité en D7)

-> Après avoir rempli ce qui est demandé, le deuxième bout de code s’enchaîne. L'implémentation fonctionne en D7 et en D8. Mais je souhaiterais que les deux codes ne s’enchaînent pas.

Bonjour,

désolé pour le temps de réponse... je suis à la masse sur beaucoup de sujets ces dernières semaines, j'essaye de me mettre à jour mais j'ai le symptôme du : si je me penche sur le sujet mais qu'il prend trop de temps, je n'aurai plus la notification et donc je l'oublierai, dans le doute je ne regarde pas le dernier message avant d'être 100% sûr d'avoir le temps de traiter, du coup je reporte de nombreuses fois et au final 5 jours passent...

De ce que tu me dis, ce n'est pas en écrivant le code de la façon dont tu le fais qu'on va s'en sortir, en clair tu as le même code mais juste avec des paramètres qui changent, ils sont variables, ce qui veut dire qu'il faut au début du programme avec des tests pour définir les valeurs de ces paramètres, puis enfin faire le corps du programme

De ce que je vois, tu veux pouvoir modifier ta base de données avec un formulaire où tu remplis des informations comme le service, la zone etc... tu remplis ensuite deux valeurs puis tu cliques sur actualiser, ensuite la macro doit trouver la ligne correspondante et la modifier avec les valeurs que tu as mis, c'est bien ça? Parce que si c'est juste ça il faudrait mieux que je reparte depuis zéro pour te faire un code propre

Par contre j'ai un peu peur en voyant ta base de données, j'ai l'impression que tu as des doublons sur tes variables de "recherche" (celles qui servent à identifier la ligne à modifier), comment comptes-tu t'y prendre pour savoir quelle ligne modifier?

Je remets en question la solution que je t'ai donné car il semble que ton besoin puisse changer, si ton besoin est mal exprimé la solution que je fournirai ne sera pas vraiment adaptée voir bancale, plus je saurai précisément ce que tu comptes faire avec ce formulaire, plus je pourrai te conseiller et t'apporter une solution précise également

Ausecour,

De ce que je vois, tu veux pouvoir modifier ta base de données avec un formulaire où tu remplis des informations comme le service, la zone etc... tu remplis ensuite deux valeurs puis tu cliques sur actualiser, ensuite la macro doit trouver la ligne correspondante et la modifier avec les valeurs que tu as mis, c'est bien ça? Parce que si c'est juste ça il faudrait mieux que je reparte depuis zéro pour te faire un code propre

C'est exactement ça mais uniquement pour les cases contenant "séquence libre". Et une fois la base de donnée modifiée, en cliquant sur le bouton "actualiser le guide", l'utilisateur devrait normalement retrouver les valeurs qu'il a saisi et les informations les concernant (3 TextBox / Image).

Cela-dit, s'il y avait la possibilité de modifier le contenu de n'importe qu'elle cellule en colonne D et H en fonction de la sélection (exemple Test 1 - 2... (Séquence "non libre")), ça serait encore mieux (grâce à un bouton par exemple) mais je doute que ce soit réalisable, ou alors trop fastidieux. Enfin, la première idée serait tout de même très bien.

Par contre j'ai un peu peur en voyant ta base de données, j'ai l'impression que tu as des doublons sur tes variables de "recherche" (celles qui servent à identifier la ligne à modifier), comment comptes-tu t'y prendre pour savoir quelle ligne modifier?

Je te joins un nouveau fichier afin d'éviter les doublons En effet, j'ai du tout remplacer par des numéros par soucis de confidentialité, et il est vrai que je n'ai pas fait attention à éviter les doublons. Ce fichier était à l'origine pour faciliter la compréhension, je n'imaginais pas que tout le code serait à refaire

Je remets en question la solution que je t'ai donné car il semble que ton besoin puisse changer, si ton besoin est mal exprimé la solution que je fournirai ne sera pas vraiment adaptée voir bancale, plus je saurai précisément ce que tu comptes faire avec ce formulaire, plus je pourrai te conseiller et t'apporter une solution précise également

La solution était adaptée, je n'ai malheureusement pas su la dupliquer sur l'intégralité du classeur (cf: nos deux messages précédents).

Pour faire bref, ce fichier est un guide pour les utilisateurs. Ces derniers doivent effectuer des tests automatisés sur machine assez régulièrement. Afin de lancer le bon test, l'utilisateur sélectionne son service, la zone, le test, et le formulaire le renvoi à une correspondance qu'il devra sélectionner sur le pupitre de la machine (c'est le début du code que j'avais écrit, je pense que tu comprendras à la lecture / voir utilisation)

Par ailleurs, la création de test est aussi possible (dans une certaine limite, dû à l'espace de stockage). Si une personne habilité souhaite créer un nouveau test, elle sélectionnera son service, la zone, machine, et enfin une "séquence libre". C'est la que le code que tu m'avais envoyé intervenait. Mais je n'arrivais pas à le dupliquer pour toute les cases du classeur où il était noté "séquence libre" (cf: mon message précédent).

J'espère avoir été le plus clair possible. Même un bout de code pour deux trois lignes me conviendrait, je pense que je saurai l'adapter (du moins j'espère). Cependant, j'imagine que le code que j'ai fait peut se résumer en beaucoup moins de ligne (je serai intéressé de découvrir comment ).

Merci par avance

Fichier retiré

Bonjour,

je tiens tout d'abord à m'excuser de ma longue absence sur le forum, j'ai laissé plusieurs sujets à l'abandon... Est-ce que tu as pu avoir de l'aider sur ton sujet grâce à un autre forum ou bien je t'ai complètement bloqué? Si ta demande tien toujours, je peux essayer de me reprencher dessus avant je pense de quitter le forum un moment...

Vraiment désolé pour la gêne occasionnée

Rechercher des sujets similaires à "variable condition else"