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 :
1612204613606.png
 

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

Statistiques des forums

Discussions
312 331
Messages
2 087 358
Membres
103 528
dernier inscrit
hplus