Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2019 remplir un combobox ou une listbox sous condition

fanfan38

XLDnaute Barbatruc
Bonjour
je coince
Avec additem c'est beaucoup trop long
J'avais donc pensé à un dico ou un tableau ou à power query mais c'est pas mon fort...
le but; choisir avec le combobox3 N ou N-1
afficher ou dans le combobox1 ou dans la listbox
la colonne P ayant ce choix ainsi que la colonne U et la colonne AB correspondante … mais sans doublon de la colonne U
Merci
je suis passé par cjoint car trop volumineux pour le site
 
Solution
Salut Fanfan,
Une voie via le SQL :
Mettre le code ci-dessous dans un Module
Code:
Function Get_Table(Table As Object) As String
    With Table
        Get_Table = "[" & .Worksheet.Name & "$" & .ListObject.Range.Address(False, False) & "]"
    End With
End Function
Public Function Get_Fields(Target As Variant, Select_String As String, Optional Column_Widths As String = "-1") As Boolean
    Dim Source_Folder As ADODB.Connection
    Dim Source_Filtre As ADODB.Recordset
    Sql_Driver = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
                    "DBQ=" & ThisWorkbook.FullName & ";READONLY=FALSE"

    On Error Resume Next
    Set Source_Folder = New ADODB.Connection
        Source_Folder.Open Sql_Driver...

fanch55

XLDnaute Barbatruc
Salut Fanfan,
Une voie via le SQL :
Mettre le code ci-dessous dans un Module
Code:
Function Get_Table(Table As Object) As String
    With Table
        Get_Table = "[" & .Worksheet.Name & "$" & .ListObject.Range.Address(False, False) & "]"
    End With
End Function
Public Function Get_Fields(Target As Variant, Select_String As String, Optional Column_Widths As String = "-1") As Boolean
    Dim Source_Folder As ADODB.Connection
    Dim Source_Filtre As ADODB.Recordset
    Sql_Driver = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
                    "DBQ=" & ThisWorkbook.FullName & ";READONLY=FALSE"

    On Error Resume Next
    Set Source_Folder = New ADODB.Connection
        Source_Folder.Open Sql_Driver
        Set Source_Filtre = New ADODB.Recordset
            Source_Filtre.CursorLocation = adUseClient
                Source_Filtre.ActiveConnection = Source_Folder
                Source_Filtre.Open Select_String
                If Err = 0 Then
                    If Source_Filtre.EOF Then
                       Get_Fields = False
                    Else
                        Get_Fields = True
                        Select Case TypeName(Target)
                        Case "ListBox"  ' Retour dans une Listbox
                            With Target
                                .Clear
                                .ColumnCount = Source_Filtre.Fields.Count
                                .ColumnWidths = Column_Widths
                                .Column = Source_Filtre.GetRows
                            End With
                         Case "Range"   ' une plage de cellules (cas d'un tableau excel)
                            With Target
                                If Not .ListObject.DataBodyRange Is Nothing _
                                Then .ListObject.DataBodyRange.Delete
                                .CopyFromRecordset Source_Filtre
                            End With
                         Case Else      ' Retour dans une variable tableau
                            Target = Source_Filtre.GetRows
                        End Select
                    End If
                Else
                    MsgBox "Erreur " & Err().Number & vbLf & Err().Description
                End If
               Source_Filtre.Close
           Set Source_Filtre = Nothing
        Source_Folder.Close
    Set Source_Folder = Nothing

End Function
puis modifier le code de ton Userform
VB:
Private Sub ComboBox3_Change() 'exo
  If Me.ComboBox3.ListIndex = -1 Then Exit Sub
    x = Get_Fields(ListBox1, _
        "Select Distinct  `Exo Audit`,Red3,`3-CR-ACTIF-PASSIF` from " & Get_Table([Mabase]) & _
        " Where `Exo Audit`='" & Me.ComboBox3 & "'")
  Me.CommandButton2.Visible = True
End Sub
Références à mettre dans le VBE :
 

Dranreb

XLDnaute Barbatruc
Début de code dans l'UserForm :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées, CA As ControlsAssociés, TLgn() As Long, LCou&, TVL()
Private Sub UserForm_Initialize()
   Set CL = Création.ComboBoxLiées: CL.Plage Feuil3
   Set CA = Création.ControlsAssociés: Set CA.Colonnes = CL.Colonnes
   CL.Add ComboBox3, "Exo Audit"
   CL.Add ComboBox1, "Red3"
   CA.Add TextBox1, "? etc."
   …
   CL.LMaxDropBtn = 25
   CL.CouleurSympa
   CL.Actualiser
   End Sub
Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
   LCou = 0
   If NbrLgn = 0 Then ListBox1.ListIndex = -1: ListBox1.Clear
   End Sub
Private Sub CL_Résultat(Lignes() As Long)
   Dim TLBx(), LL&, TDon(), LD&
   TLgn = Lignes
   TDon = CL.PlgTablo.Value
   ReDim TLBx(1 To UBound(TLgn), 1 To 3)
   For LL = 1 To UBound(TLgn)
      LD = TLgn(LL)
      TLBx(LL, 1) = TDon(LD, 1)
      TLBx(LL, 2) = TDon(LD, 2)
      TLBx(LL, 3) = TDon(LD, 3)
      Next LL
   ListBox1.ListIndex = -1
   ListBox1.List = TLBx
   End Sub
Private Sub ListBox1_Click()
   LCou = TLgn(ListBox1.ListIndex - 1)
   TVL = CL.Lignes(LCou).Range.Value
   CL.ValeursDepuis TVL
   CA.VAleursDepuis TVL
   End Sub
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…