Excel UserForm aide

Bonjour,

Je voulais faire un msgbox et sélectionner un choix dans une liste mais en cherchant j'ai vu qu'il fallait faire avec un userform.
N'en ayant jamais fait, j'ai repris un code que j'ai trouvé et fait quelques modifications pour essayer d'avoir ce que je veux mais ça ne fonctionne pas :

Private Sub ComboBox1_Change()
Dliz = Cells(Rows.Count, 4).End(xlUp).Row + 1
Dlie = InputBox("Nom description", "Insérer nouvelle description")
If ComboBox1.ListIndex >= 0 Then
    Me.Hide
    MsgBox ("Vous avez répondu " & ComboBox1.Value)
Sheets("Formules").Select
Range("D", Dliz) = Dlie
Range("E", Dliz) = ComboBox1.Value
Sheets("Copier_coller").Select
End If
End Sub

Private Sub UserForm_Initialize()
Reponse = Array("Bolts_Nuts_Washers", "Components", "HILTI", "Plate", "Profiles", "Round_Square_bars", "Rubber", "Standard_accessories", "Tube", "Tube_accessories")
ComboBox1.List = Reponse
End Sub


Je veux avoir 1 msgbox pour rentrer un valeur qui ira à la suite dans la colonne D de la feuille "Formules" et la valeur sélectionné dans la liste de choix avec le userform ira à la suite dans la colonne E.

Merci de votre aide,

Cédric

4 réponses

Résumé de la discussion

On cherche à utiliser un MsgBox pour saisir une valeur et un UserForm avec une ComboBox pour enregistrer la sélection dans les colonnes D et E de la feuille Formules. Plusieurs échanges suggèrent d'utiliser InputBox pour la valeur et d'effectuer les écritures avec le code lié au changement de ComboBox, tout en déclarant les variables et en vérifiant ListIndex. La meilleure réponse rapporte que cela peut fonctionner selon l'environnement et renvoie vers des ressources externes pour déboguer des erreurs d'exécution, soulignant l'importance d'un exemple de fichier pratique.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour,

    corriger ceci:

    Range("D" & Dliz) = Dlie
    Range("E" & Dliz) = ComboBox1.Value


    --@+ Le Pivert
    0
    1. Bonjour,

      J'ai une erreur d'objet
      Je crois avoir fais quelque chose de basique "titre + liste déroulante", est ce possible d'ajouter un bouton de validation une fois un nom dans la liste sélectionné ?

      Ci-joint mon fichier : https://www.cjoint.com/c/LEFg1oYxe8k

      Merci à vous,
      0
      1. Contributeur
        C'est normal que cela ne fonctionne pas!

        Remplace ta ListBox par une ComboBox et cela fonctionnera!
        0
      2. @cs_Le PivertJ'ai réussi du coup à faire apparaitre ce que je veux (même si inputbox arrive après combobox ce que je ne comprends pas car la commande est avant...)
        Mais là n'est pas vraiment mon problème ahah
        Je veux que ces 2 valeurs viennent se remplir à la suite d'un tableau (colonne D et E de la feuille Formules) mais à la fin de la macro, il n'y avait rien de nouveau :/
        0
      3. Contributeur
        @CedricG62Comme ceci:

        Sheets("Formules").Range("D" & Dliz) = Dlie
        Sheets("Formules").Range("E" & Dliz) = ComboBox1.Value


        @+ Le Pivert
        0
      4. @cs_Le PivertMerci ça fonctionne :)
        Est ce possible d'ajouter un test : si l'inputbox saisie existe déjà dans la colonne D, alors arrêter la macro et ne pas demander la combobox ? (car là la macro me demande d'abord la combobox et je peux également rentrer des doublons...)

        Ensuite, j'ai un bouton validé sur le userform de ma combobox mais il ne fonctionne pas car dès que je sélectionne un choix dans la liste, je passe directement à la suite sans avoir besoin de valider mon choix. Comment puis je faire pour valider mon choix avec ce bouton ?
        0
      5. Contributeur
        @CedricG62Si tu veux un bouton, il faut supprimer la macro Private Sub ComboBox1_Change()

        Tu mets ceci à la place:

        Option Explicit
        Private Sub CommandButton1_Click()
        Dim Dliz, Dlie
        Dim Trouve As Range
        Dliz = Cells(Rows.Count, 4).End(xlUp).Row + 1
        Dlie = InputBox("Nom description", "Insérer nouvelle description")
        Set Trouve = Sheets("Formules").Columns(4).Cells.Find(what:=Dlie, LookAt:=xlWhole)
        'traitement de l'erreur possible : Si on ne trouve rien :
        If Trouve Is Nothing Then
            'ici, traitement pour le cas où la valeur n'est pas trouvée
            If ComboBox1.ListIndex >= 0 Then
            Me.Hide
            MsgBox ("Vous avez répondu " & ComboBox1.Value)
        With Sheets("Formules")
        .Range("D" & Dliz) = Dlie
        .Range("E" & Dliz) = ComboBox1.Value
        End With
        End If
        Else
        MsgBox "Valeur presente: " & Trouve.Address
            Exit Sub
        End If
        Sheets("Copier_coller").Select
        End Sub
        Private Sub UserForm_Initialize()
        Dim Reponse
        Reponse = Array("Bolts_Nuts_Washers", "Components", "HILTI", "Plate", "Profiles", "Round_Square_bars", "Rubber", "Standard_accessories", "Tube", "Tube_accessories")
        ComboBox1.List = Reponse
        ComboBox1.ListIndex = 0
        End Sub
        
        


        Voilà

        @+ Le Pivert
        0
    2. Bonjour,

      Merci pour le lien, il est très utile !

      Néanmoins, j'aurais encore besoin de vos lumières...
      J'ai fais un dernier UserForm pour mon fichier voici le code :
      Option Explicit
      Private Sub Validation_Click()
      Dim Dlig, Dcol
      Dim Trouve As Range
      ' Tableau10 = Bolts_Nuts_Washers (N° colonne 1 )
      ' Tableau11 = Components (N° colonne 9 )
      ' Tableau12 = HILTI (N° colonne 17 )
      ' Tableau13 = Plate (N° colonne 25 )
      ' Tableau14 = Profiles (N° colonne 33 )
      ' Tableau15 = Round_Square_bars (N° colonne 41 )
      ' Tableau16 = Rubber (N° colonne 49 )
      ' Tableau17 = Standard_accessories (N° colonne 57 )
      ' Tableau18 = Tube (N° colonne 65 )
      ' Tableau19 = Tube_accessories (N° colonne 73 )
      ' Tableau3 = Anchors_standards (N° colonne 81 )
      ' Tableau4 = Grating (N° colonne 89)
      ' Tableau5 = Grating-Component (N° colonne 97 )
      ' Tableau6 = Grating-Fixations (N° colonne 105 )
      ' Tableau7 = Grating-Option (N° colonne 113 )
      If ComboBox1 = "Bolts_Nuts_Washers" Then
          Dcol = 1
          Else
          If ComboBox1 = "Components" Then
              Dcol = 9
              Else
              If ComboBox1 = "HILTI" Then
                  Dcol = 17
                  Else
                  If ComboBox1 = "Plate" Then
                      Dcol = 25
                      Else
                      If ComboBox1 = "Profiles" Then
                          Dcol = 33
                          Else
                          If ComboBox1 = "Round_Square_bars" Then
                              Dcol = 41
                              Else
                              If ComboBox1 = "Rubber" Then
                                  Dcol = 49
                                  Else
                                  If ComboBox1 = "Standard_accessories" Then
                                      Dcol = 57
                                      Else
                                      If ComboBox1 = "Tube" Then
                                          Dcol = 65
                                          Else
                                          If ComboBox1 = "Tube_accessories" Then
                                              Dcol = 73
                                              Else
                                              If ComboBox1 = "Anchors_standards" Then
                                                  Dcol = 81
                                                  Else
                                                  If ComboBox1 = "Grating" Then
                                                      Dcol = 89
                                                      Else
                                                      If ComboBox1 = "Grating-Component" Then
                                                          Dcol = 97
                                                          Else
                                                          If ComboBox1 = "Grating-Fixations" Then
                                                              Dcol = 105
                                                              Else
                                                              If ComboBox1 = "Grating-Option" Then
                                                                  Dcol = 113
      Dlig = Worksheets("Liste IENET").Cells(Rows.Count, Dcol).End(xlUp).Row + 1
      Set Trouve = Sheets("Liste IENET").Columns(Dcol).Cells.Find(what:=Dlig, LookAt:=xlWhole)
      With Sheets("Liste IENET")
      .Range(Dcol + 1 & Dlig) = TextBox1  'apparement Excel n'aime pas comment j'ai défini ces lignes là
      .Range(Dcol + 2 & Dlig) = TextBox2
      .Range(Dcol + 3 & Dlig) = TextBox3
      .Range(Dcol + 4 & Dlig) = TextBox4
      .Range(Dcol + 5 & Dlig) = TextBox5
      .Range(Dcol + 6 & Dlig) = TextBox6
      End With
      
                                                              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 If
          End If
      End If
      Sheets("Copier_coller").Select
      End Sub
      Private Sub UserForm_Initialize()
      Dim Reponse
      'Reponse = Liste_type (défini directement dans le combobox)
      'ComboBox1.List = Reponse
      ComboBox1.ListIndex = 0
      End Sub

      Pourquoi ma ligne avec les TextBox est elle surligné en jaune ? j'ai oublié des guillemets à un endroit ?
      Et également n'y a t il pas une autre solution pour éviter toute la cascade de IF ? (avec un recherche H dans ma feuille pour retrouver le N° de colonne correspondant au ComboBox choisi par exemple)

      Merci encore

      Cédric
      0
      1. Contributeur
        avec un recherche H dans ma feuille pour retrouver le N° de colonne correspondant au ComboBox choisi par exemple)

        https://www.developpez.net/forums/d1551029/logiciels/microsoft-office/excel/macros-vba-excel/retrouver-numero-d-colonne-d-apres-entete/

        ce qui donne ceci:

        Private Sub ComboBox1_Change()
        Dim Recherche As Range
        Dim NumeroColonne As Integer
        Set Recherche = Rows(1).Find(ComboBox1.Value, LookIn:=xlValues, LookAt:=xlWhole)
        If Not Recherche Is Nothing Then
           NumeroColonne = Recherche.Column
           Dcol = NumeroColonne
        Else
           MsgBox "La colonne n'a pas été trouvée"
        End If
        End Sub


        Pourquoi ma ligne avec les TextBox est elle surligné en jaune ?

        mettre ceci:

        .Cells(Dlig,  Dcol + 1 ) = TextBox1


        Voilà
        0
      2. @cs_Le PivertBonjour,

        Je n'ai pas eu l'occasion de retravailler dessus avant d'où ma réponse un peu tardive...

        Lorsque je lance la macro, il n'aime pas la façon dont j'ai écrit cette ligne (il l'a met en erreur)
        Dlig = Worksheets("Liste IENET").Cells(Rows.Count, Dcol).End(xlUp).Row + 1


        Ci-dessous mon fichier si ça peut plus vous aider :
        https://www.cjoint.com/c/LFnhvK7lTZk

        Merci,

        Cédric
        0
      3. Contributeur
        @CedricG62La variable Dcol n'est pas déclarée!

        Il faut mettre Option Explicit en début de module pour forcer la déclaration des variables comme ceci:

        Option Explicit
        Dim Dcol As Long
        Private Sub ComboBox1_Change()
        Dim Recherche As Range
        Dim NumeroColonne As Integer
        Sheets("Liste IENET").Activate
        Set Recherche = Rows(2).Find(ComboBox1.Value, LookIn:=xlValues, LookAt:=xlWhole)
        If Not Recherche Is Nothing Then
           NumeroColonne = Recherche.Column
           Dcol = NumeroColonne
        Else
           MsgBox "La colonne n'a pas été trouvée"
        End If
        End Sub
        Private Sub Validation_Click()
        Dim Dlig
        Dim Trouve As Range
        Dlig = Worksheets("Liste IENET").Cells(Rows.Count, Dcol).End(xlUp).Row + 1
        Set Trouve = Sheets("Liste IENET").Columns(Dcol).Cells.Find(what:=Dlig, LookAt:=xlWhole)
        With Sheets("Liste IENET")
        .Cells(Dlig, Dcol + 1) = TextBox1
        .Cells(Dlig, Dcol + 2) = TextBox2
        .Cells(Dlig, Dcol + 3) = TextBox3
        .Cells(Dlig, Dcol + 4) = TextBox4
        .Cells(Dlig, Dcol + 5) = TextBox5
        .Cells(Dlig, Dcol + 6) = TextBox6
        End With
        Sheets("Copier_coller").Select
        End Sub
        


        voilà

        @+
        1
      4. @cs_Le PivertLa macro tourne par contre rien ne vient s'afficher à la suite dans les tableaux...
        J'ai également ajouté cette ligne là dans le "with" :
        .Cells(Dlig, Dcol) = ComboBox1.Value

        Il faut aussi définir la variable "ComboBox1.Value" comme pour "Dcol" ?
        0
      5. Contributeur
        @CedricG62Il faut aussi définir la variable "ComboBox1.Value" comme pour "Dcol" ?

        NON ce n'est pas une variable

        Si tu avais mis cela tu aurais vu où se situait l'erreur:

        With Sheets("Liste IENET")
        .Cells(Dlig, Dcol + 1) = TextBox1
        MsgBox TextBox1
        MsgBox Dlig
        MsgBox Dcol + 1


        Il y a la ligne 500 qui est remplie.

        Il suffit de l'effacer et tout rentre dans l'ordre

        @+
        0
    3. Je t'embête beaucoup ahah mais tu m'aide énormément...

      Je veux faire deux dernière macro pour mon fichier :
      La première qui va copier coller en valeur les données de la feuille "IENET" dans un nouveau classeur que la macro crée elle même, j'ai fais un petit essai et j'ai déjà une erreur :
      Private Sub CommandButton3_Click()
      Sheets("IENET").Select
      Cells.Select        '(cette commande là est détecté quand on fait l'enregistrement de macro 
                'mais quand on lance la macro, elle passe en erreur sur cette ligne....)
      'Range("A1:AB10000").Select         (j'ai testé la sélection comme ça mais ça ne fonctionne pas)
      Selection.Copy
      Workbooks.Add.SaveAs Filename:="Fichier importation dans IENET"
      Workbooks("Fichier importation dans IENET.xlsx").Activate
      Range("A1").Select
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
          :=False, Transpose:=False
      End Sub


      Et la seconde, qui va rester plus basique pour faire un onglet explicatif de comment mon fichier fonctionne où là je vais juste avoir des cases à cocher pour cacher/afficher des lignes avec des infos dessus donc je ne devrais pas avoir trop de problème :)
      0
      1. Contributeur
        Pour sélectionner toute la feuille :

        Sheets("IENET").Activate
        ActiveSheet.Cells.Select


        @+
        0
      2. @cs_Le PivertBonjour,
        En effet, les valeurs saisies étaient envoyés sur les lignes 500+ maintenant ça fonctionne bien :)
        Il ne reste que le copier coller qui ne copie colle pas en valeur et donc créer des erreurs mais ce n'est plus du tout le même sujet !
        Je vous remercie pour toute l'aide que vous m'avais apporté
        Bonne continuation à vous,
        Cédric
        0