UserForm remplit automatiquement

Résolu
Bonjour,

Je bute sur un problème concernant la génération automatique d'un UserForm
J'ai une liste de chantier avec:
"X"(selon si le chantier est sélectionné ou non), Numéro, Nom, Adresse, Budget. (Avec la possibilité d'avoir plusieurs lignes (plusieurs chantiers) avec le même numéro)
J'ai déjà créé un UserForm permettant de taper un Numéro de chantier et de le récupérer dans une variable NumChantier

A partir de ce Numéro, je souhaiterai créer automatiquement un UserForm m'affichant la liste de chaque chantier possédant ce Numéro, avec, devant chaque nom, une "CheckBox" me permettant de sélectionner/désélectionner le chantier.

Ainsi, si UN seul chantier correspond au Numéro tapé, j'aurai un UserForm avec 1 CheckBox et 1 TextBox (me permettant de valider ou non la sélection du dit chantier), mais si j'ai 20 chantiers avec ce Numéro, j'aurai un UserForm avec 20 CheckBox et 20 TextBox (me permettant d'en sélectionner/désélectionner 1 ou plusieurs)

J'espère avoir été clair

Merci d'avance

3 réponses

  1. Modérateur
    Bonjour,

    Plutôt que d'utiliser x textbox et x checkbox, pourquoi ne pas utiliser une listbox multiselect?
    0
    1. Effectivemennt, cela pourrai également fonctionné.
      Il faudrai que j'essaie d'alimenter la ListBox Multiselect avec les valeurs de mon tableau. A travailler ! Merci
      0
    2. Modérateur
      Un exemple tout simple, mais efficace.
      0
    3. Trop cool ! j'adapte ça à mon problème !
      Merci beaucoup
      0
    4. @pijakuUne dernière chose:
      Même si je n'ai pas bien compris comment marche la variable "valeurs", j'aimerai savoir, une fois un certain nombre d'items de la liste sélectionnés, comment faire le chemin inverse, c'est à dire par exemple, mettre en sur-brillant rouge les lignes donc j'ai sélectionné les items?
      0
  2. Modérateur
    Si j'ai bien compris ta seconde question, tout se passe dans le CommandButton_Click :
    Private Sub CommandButton1_Click()
        Dim i As Integer, Valeurs As String, Cpt As Integer
        'pour i = 0, la ligne correspondante est la ligne 2 dans le classeur
        'donc pour "colorier" les lignes, il suffit de colorer les lignes i+2
        'il convient toutefois, avant de colorer, de "décolorer" tout
        Columns(1).Cells.Interior.ColorIndex = xlNone
        For i = 0 To ListBox1.ListCount - 1
            If ListBox1.Selected(i) = True Then
                Valeurs = Valeurs & vbCrLf & ListBox1.List(i) & " - " & ListBox1.List(i, 1)
                Cpt = Cpt + 1
                '"coloration"
                Cells(i + 2, 1).Interior.ColorIndex = 3
            End If
        Next i
        Valeurs = "Vous avez sélectionnés " & Cpt & " Chantiers : " & Valeurs
        MsgBox Valeurs
    End Sub


    Pour la variable Valeurs, il s'agit d'un String, une chaîne de caractères.
    vbcrlf est le caractère pour passer à la ligne,
    ListBox1.List(i) est la première colonne de ma listbox
    ListBox1.List(i, 1) la seconde colonne.
    On cherche à cumuler les lignes dans une même variablme, donc il faut conserver sa valeur et y ajouter les nouvelles valeurs.
    Du coup, Valeurs = Valeurs (anciennes lignes déjà rentrés) + vbcrlf (passage à la ligne) + ListBox1.List(i) & " - " & ListBox1.List(i, 1) (nouvelles données).

    Au premier passage, ce code va faire un passage à la ligne puis entrer les premières valeurs. Cela nous convient car on peut ajouter sur cette première "ligne" vide le message "Vous avez sélectionnés " blablabla.

    C'est + clair?

    Ne pas oublier, là c'est un bête exemple, de référencer la feuille contenant les données. En effet, puisque tu es dans un UserForm, il convient de le préciser pour le cas ou l'utilisateur aurait une autre feuille sélectionnée...
    Dans ce cas, privilégier l'écriture suivante :
    Private Sub CommandButton1_Click()
        Dim i As Integer, Valeurs As String, Cpt As Integer
        'pour i = 0, la ligne correspondante est la ligne 2 dans le classeur
        'donc pour "colorier" les lignes, il suffit de colorer les lignes i+2
        'il convient toutefois, avant de colorer, de "décolorer" tout
    With Sheets(1)
        . Columns(1).Cells.Interior.ColorIndex = xlNone
        For i = 0 To ListBox1.ListCount - 1
            If ListBox1.Selected(i) = True Then
                Valeurs = Valeurs & vbCrLf & ListBox1.List(i) & " - " & ListBox1.List(i, 1)
                Cpt = Cpt + 1
                '"coloration"
                .Cells(i + 2, 1).Interior.ColorIndex = 3
            End If
        Next i
        Valeurs = "Vous avez sélectionnés " & Cpt & " Chantiers : " & Valeurs
        MsgBox Valeurs
    End With
    End Sub

    A noter : en cas d'utilisation de With End With, il convient de rapprocher les objets concernés en plaçant un point devant.
    Ainsi :
    Sheets(1).Range("A1")

    devient
    With Sheets(1)
    .Range("A1")
    End With

    🎼 Cordialement,
    Franck 🎶
    0
    1. Re-bonjour
      Merci pour toutes ces explications et ces précisions.
      Entre temps, j'ai trouver une solution à mon problème.

      Etant donné quand j'ai une colonne (dans mon tableau et dans ma List.Multiselect) où les valeurs sont uniques, j'ai fait ceci:


      Dim i As Integer, Valeurs As String, Cpt As Integer, ref As String
      For i = 0 To ListBox1.ListCount - 1
      If ListBox1.Selected(i) = True Then
      'Création d'une variable ref pour stocker la valeur unique dans la colonne 3 de ma list, et la rechercher dans mon tableau
      ref = Me.ListBox1.List(i, 3)
      Cells.Find(What:=ref, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
      :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
      False, SearchFormat:=False).Activate

      ActiveCell.Select
      ActiveCell.EntireRow.Select

      With Selection.Interior.ColorIndex = 3
      End with
      ...
      End if


      J'arrive au résultat que je voulais avec cette méthode, mais je garde la tienne au cas où!

      Merci encore !
      0
      1. Modérateur
        Essaie en remplaçant :
        Cells.Find(What:=ref, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
                        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                        False, SearchFormat:=False).Activate
        
                    ActiveCell.Select
                    ActiveCell.EntireRow.Select
        
                        With Selection.Interior.ColorIndex = 3

        par :
        Cells.Find(What:=ref, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
                        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                        False, SearchFormat:=False).EntireRow.Interior.ColorIndex = 3
        0
      2. Super ! Ça marche nickel merci !
        0
      3. Modérateur
        @tiibo58000de rien.
        A+
        0