Microsoft 365 Userform filtre listbox

lesoldat9

XLDnaute Occasionnel
Bonjour à tous,

Une fois de plus je me tourne vers vous la team Excel,
j'aurai besoin aujourd'hui de filtrer ma listbox avec 3 ou 1 barre de recherche textbox selon mon besoin.

Je vous joins un fichier test.
 

Pièces jointes

  • Gestion stock (1).xlsm
    22.1 KB · Affichages: 12
Solution
Le classeur a le Vbe protégé .
Mais je vois quand même le problème.
Certaines colonnes de la table ont un espace dans leur nom
Dans ce cas modifier le code pour en tenir compte en encadrant ces noms par des crochets :
VB:
    If TextBox3 <> "" Then Where_String = Where_String & IIf(Where_String = "", "", " and ") & " [Ref Palette]='" & TextBox3 & "' "
( éviter de laisser des espaces en fin de champs aussi )

fanch55

XLDnaute Barbatruc
Le code ci-dessous va afficher le fichier supposé de ton classeur,
Peux tu me dire ce qu'il affiche ? ( nota: je suis absent ce jeudi après-midi )
VB:
Public Function Get_Fields( _
        Target As Variant, _
        ByVal Select_String As String, _
        Optional ByVal Select_Base As String, _
        Optional Header As Boolean = False, _
        Optional Column_Widths As String = "-1") As Boolean
       
    Dim Base        As Object
    Dim Requete     As Object
   
    If InStr(1, ThisWorkbook.FullName, "https:", vbTextCompare) Then
        Fname = Environ("OneDrive")
        T = Split(ThisWorkbook.FullName, "/")
        For i = 4 To UBound(T)
            Fname = Fname & "\" & T(i)
        Next
    Else
        Fname = ThisWorkbook.FullName
    End If
    MsgBox "Fname=" & Fname

    Sql_Driver = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
                 "DBQ=" & Fname & ";READONLY=FALSE"
    If Select_Base = "" Then Select_Base = Sql_Driver
   
    On Error Resume Next
   
    Set Base = CreateObject("ADODB.Connection")
        Base.CursorLocation = 3 ' ne pas utiliser adUseClient ou adUseServer sinon renseigner les références vb
        Base.Open Select_Base
        Set Requete = CreateObject("ADODB.recordset")
            Requete.Open Select_String, Base
            Select Case True
            Case Err <> 0
                Get_Fields = False
                MsgBox "Erreur " & Err().Number & vbLf & Err().Description
            Case Requete.State = 0 ' Fermé <-- Update ou insert ou delete ( pas de retour ) "
                Get_Fields = True
            Case Requete.RecordCount = 0
                Get_Fields = False
            Case Else
                Get_Fields = True
                Select Case TypeName(Target)
                Case "ListBox", "ComboBox" ' Retour dans une Listbox
                    With Target
                        .Clear
                        .ColumnCount = Requete.Fields.Count
                        .ColumnWidths = Column_Widths
                        .Column = Requete.GetRows
                    End With
                 Case "Range"   ' une plage de cellules ou tableau excel
                        If Target.ListObject Is Nothing Then
                            If Header Then
                                For i = 0 To Requete.Fields.Count - 1
                                    Cells(Target.Row, Target.Column + i).Value = Requete.Fields(i).Name
                                    Cells(Target.Row, Target.Column + i).Interior.Color = 13553360
                                    Cells(Target.Row, Target.Column + i).Borders.LineStyle = xlDouble
                                Next
                                Set Target = Target.Offset(1)
                            End If
                        Else
                            If Not Target.ListObject.DataBodyRange Is Nothing _
                            Then Target.ListObject.DataBodyRange.Delete
                        End If
                        Target.CopyFromRecordset Requete
                 Case Else      ' Retour dans une variable tableau
                    Target = Requete.GetRows
                End Select
            End Select
            If Requete.State > 0 Then Requete.Close
        Set Requete = Nothing
        Base.Close
    Set Base = Nothing

End Function
 
Dernière édition:

lesoldat9

XLDnaute Occasionnel
Bonjour
Désolé pour ce retour tardif j'avais pas vu ton retour.
ci joint ce que la formule affiche.
Le code ci-dessous va afficher le fichier supposé de ton classeur,
Peux tu me dire ce qu'il affiche ? ( nota: je suis absent ce jeudi après-midi )
VB:
Public Function Get_Fields( _
        Target As Variant, _
        ByVal Select_String As String, _
        Optional ByVal Select_Base As String, _
        Optional Header As Boolean = False, _
        Optional Column_Widths As String = "-1") As Boolean
      
    Dim Base        As Object
    Dim Requete     As Object
  
    If InStr(1, ThisWorkbook.FullName, "https:", vbTextCompare) Then
        Fname = Environ("OneDrive")
        T = Split(ThisWorkbook.FullName, "/")
        For i = 4 To UBound(T)
            Fname = Fname & "\" & T(i)
        Next
    Else
        Fname = ThisWorkbook.FullName
    End If
    MsgBox "Fname=" & Fname

    Sql_Driver = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
                 "DBQ=" & Fname & ";READONLY=FALSE"
    If Select_Base = "" Then Select_Base = Sql_Driver
  
    On Error Resume Next
  
    Set Base = CreateObject("ADODB.Connection")
        Base.CursorLocation = 3 ' ne pas utiliser adUseClient ou adUseServer sinon renseigner les références vb
        Base.Open Select_Base
        Set Requete = CreateObject("ADODB.recordset")
            Requete.Open Select_String, Base
            Select Case True
            Case Err <> 0
                Get_Fields = False
                MsgBox "Erreur " & Err().Number & vbLf & Err().Description
            Case Requete.State = 0 ' Fermé <-- Update ou insert ou delete ( pas de retour ) "
                Get_Fields = True
            Case Requete.RecordCount = 0
                Get_Fields = False
            Case Else
                Get_Fields = True
                Select Case TypeName(Target)
                Case "ListBox", "ComboBox" ' Retour dans une Listbox
                    With Target
                        .Clear
                        .ColumnCount = Requete.Fields.Count
                        .ColumnWidths = Column_Widths
                        .Column = Requete.GetRows
                    End With
                 Case "Range"   ' une plage de cellules ou tableau excel
                        If Target.ListObject Is Nothing Then
                            If Header Then
                                For i = 0 To Requete.Fields.Count - 1
                                    Cells(Target.Row, Target.Column + i).Value = Requete.Fields(i).Name
                                    Cells(Target.Row, Target.Column + i).Interior.Color = 13553360
                                    Cells(Target.Row, Target.Column + i).Borders.LineStyle = xlDouble
                                Next
                                Set Target = Target.Offset(1)
                            End If
                        Else
                            If Not Target.ListObject.DataBodyRange Is Nothing _
                            Then Target.ListObject.DataBodyRange.Delete
                        End If
                        Target.CopyFromRecordset Requete
                 Case Else      ' Retour dans une variable tableau
                    Target = Requete.GetRows
                End Select
            End Select
            If Requete.State > 0 Then Requete.Close
        Set Requete = Nothing
        Base.Close
    Set Base = Nothing

End Function
 

Pièces jointes

  • Capture2.JPG
    Capture2.JPG
    63.2 KB · Affichages: 8

fanch55

XLDnaute Barbatruc
Ok,
Peux-tu exécuter ce bout de code dans ton vbe et me dire ce qu'il affiche ?
VB:
Sub OneFolder()
    Msgbox ">>" & Environ("Onedrive") & "<<"
End sub

Si rien n'est affiché, c'est que ce n'est pas un serveur Onedrive mais un Sharepoint online et là il faudra trouver une autre solution avec quelqu'un d'autre car je ne suis pas sous office 365 .
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 248
Messages
2 086 593
Membres
103 249
dernier inscrit
solo