Excel UserForm aide

CedricG62 Messages postés 40 Statut Membre -  
cs_Le Pivert Messages postés 8437 Statut Contributeur -
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

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    corriger ceci:

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


    --@+ Le Pivert
    0
  2. CedricG62 Messages postés 40 Statut Membre
     
    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. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      C'est normal que cela ne fonctionne pas!

      Remplace ta ListBox par une ComboBox et cela fonctionnera!
      0
    2. CedricG62 Messages postés 40 Statut Membre > cs_Le Pivert Messages postés 8437 Statut Contributeur
       
      J'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. cs_Le Pivert Messages postés 8437 Statut Contributeur 730 > CedricG62 Messages postés 40 Statut Membre
       
      Comme ceci:

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


      @+ Le Pivert
      0
    4. CedricG62 Messages postés 40 Statut Membre > cs_Le Pivert Messages postés 8437 Statut Contributeur
       
      Merci ç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. cs_Le Pivert Messages postés 8437 Statut Contributeur 730 > CedricG62 Messages postés 40 Statut Membre
       
      Si 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
  3. CedricG62 Messages postés 40 Statut Membre
     
    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. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
      1. CedricG62 Messages postés 40 Statut Membre > cs_Le Pivert Messages postés 8437 Statut Contributeur
         
        Bonjour,

        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
      2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730 > CedricG62 Messages postés 40 Statut Membre
         
        La 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
      3. CedricG62 Messages postés 40 Statut Membre > cs_Le Pivert Messages postés 8437 Statut Contributeur
         
        La 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
      4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730 > CedricG62 Messages postés 40 Statut Membre
         
        Il 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
  4. CedricG62 Messages postés 40 Statut Membre
     
    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. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Pour sélectionner toute la feuille :

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


      @+
      0
      1. CedricG62 Messages postés 40 Statut Membre > cs_Le Pivert Messages postés 8437 Statut Contributeur
         
        Bonjour,
        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