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

VBA - textbox et listbox

jeanyves31

XLDnaute Nouveau
Bonjour

je suis en train d'essayé de créer un formulaire de saisie.
J'ai créer un TEXTBOX dans lequel je tape 1 lettre, ce qui provoque l'affichage dans ma LISTBOX de la liste de tout mes article qui commencent par a. Idem si je tape une seconde, etc
Ce code n'est pas de moi, je l'ai trouver sur des forums.
Ce que je voudrais c'est que ma LISTBOX, si le TEXTBOX est vide affiche l'ensemble de mes Articles, et la ça coince.....
voici le code qui fonctionne...
VB:
Private Sub TextBox1_Change()
Dim Plage As Range, Cell As Range
Dim Recherche$, Adresse$, Ligne&, C As Object
'ListBox1.Clear
Recherche = TextBox1.Value
Range("b2").Select
Ligne = Sheets("BD_Article").Range("b2" & "65536").End(xlUp).Row
Set Plage = Sheets("BD_Article").Range("b" & "2:" & "b" & Ligne)
With Plage
Set C = .Find(Recherche)
If Not C Is Nothing Then
    Adresse = C.Address
    Do
         If UCase(Recherche) = UCase(Left(C, Len(Recherche))) Then
            With ListBox1
                .AddItem C '
                .List(.ListCount - 1, 1) = C.Row  'Ajout mDF
            End With
         End If
        Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Adresse
End If
End With
End Sub

Private Sub UserForm_Activate()
    Label1.Caption = Worksheets("Saisie_Facture").Range(RTrim("m2")).Value
    Label2.Caption = "Date de la facture :" & Worksheets("Saisie_Facture").Range("K2").Value
    Label3.Caption = "N°: " & Worksheets("Saisie_Facture").Range("l2").Value
    Label8.Caption = "Montant de la facture: " & Format(Val(Replace(Worksheets("Saisie_Facture").Range("o2").Value, ",", ".")), "#,##0.00")

    With Sheets("Saisie_Facture").Range("a2")
    ListBox2.RowSource = Range(.Cells, .End(xlDown)(1, 7)).Address(external:=True)
    End With
    ListBox2.ListIndex = -1
End Sub

Et voici ce que j'ai ajouter pour que ma LISTBOX affiche tout mes articles
Code:
Private Sub UserForm_Initialize()
    InitList
    
End Sub


Sub InitList()
    With Sheets("BD_Article").Range("b2")
    ListBox1.RowSource = Range(.Cells, .End(xlDown)(1, 7)).Address(external:=True)
    End With
    ListBox1.ListIndex = 1
 
End Sub
Mais ca ne fonctionne pas....
si quelqu'un peut me donner quelques indications....

Merci
Jean Yves
 

jeanyves31

XLDnaute Nouveau
Merci pour ton fichier, je vais "essayé" de l'adapter à mon fichier, c'est exactement ce que je souhaitais
petite question, moi j'utilise un tableau structuré pour mes données, est ce que ce code est valable?
Merci
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonjour,

Exemple avec un tableau dynamique structuré nommé Tableau1

VB:
Dim f, TblBD(), NbCol
Option Compare Text
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Set Rng = [tableau1]
  TblBD = Rng.Value
  For i = 1 To UBound(TblBD): TblBD(i, 4) = Format(TblBD(i, 4), "0.00 €"): Next i
  NbCol = UBound(TblBD, 2)
  Me.ListBox1.List = TblBD
  Me.ListBox1.ColumnCount = NbCol
  Me.ListBox1.ColumnWidths = "50;30;100;50"
End Sub

Private Sub TextBox1_Change()
  ColRecherche = 3
  clé = "*" & Me.TextBox1 & "*"
  Dim Tbl()
  For i = 1 To UBound(TblBD)
    If TblBD(i, ColRecherche) Like clé Then
        n = n + 1: ReDim Preserve Tbl(1 To UBound(TblBD, 2), 1 To n)
        For k = 1 To UBound(TblBD, 2): Tbl(k, n) = TblBD(i, k): Next k
     End If
  Next i
  If n > 0 Then Me.ListBox1.Column = Tbl Else Me.ListBox1.List = TblBD
End Sub

Boisgontier
 

Pièces jointes

  • Copie de FiltreTextbox1.xlsm
    32.4 KB · Affichages: 123
Dernière édition:

jeanyves31

XLDnaute Nouveau
Merci Boisgontier pour ton aide, et tes fichiers ca ma bien aidé....

Petite question supplémentaire...
Grace à mon userform, je rempli mon tableau Achats. grace à ce code:

VB:
Private Sub CommandButton1_Click()
    With Sheets("Achats").ListObjects("tbl_Achats")
        .ListRows.Add alwaysinsert:=True
        .ListColumns("N_Fac").DataBodyRange(.ListRows.Count) = txt_NumFacture.Value
        .ListColumns("Date").DataBodyRange(.ListRows.Count) = TextBox4.Value
        .ListColumns("Fournisseur").DataBodyRange(.ListRows.Count) = ComboBox2.Value
        .ListColumns("Article").DataBodyRange(.ListRows.Count) = TextBox5.Value
        .ListColumns("Qte").DataBodyRange(.ListRows.Count) = TextBox2.Value
        .ListColumns("Prix UHT").DataBodyRange(.ListRows.Count) = TextBox3.Value
    End With
End Sub

Ca fonctionne, tout est copier dans mon tableau. MAIS, j'affiche la commande en cours dans un listbox, mais pour qu'il soit à jour il faut que je quitte mon userform, et le relance...

J'ai essayé avec:

Code:
ThisWorkbook.RefreshAll
Mais ca ne fonctionne pas....une autre idée?
Merci
Jean Yves
 
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…