Listbox ne s'alimente qu'avec feuille Active

  • Initiateur de la discussion Initiateur de la discussion cathodique
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

cathodique

XLDnaute Barbatruc
Bonjour 🙂,

J'ai voulu essayé le concept d'UserInterfaceOnly. Mais je suis confronté à une difficulté.

Dans l'userform, J'ai mis une Listbox qui est alimentée à partir de la feuille "Ref".

Lorsque je lance l'userform en étant sur la feuille Ref, la listbox est alimentée.

Mais en le lançant à partir de la feuille "Menu" via le bouton, elle est vide.

Je ne parviens à trouver mon erreur. Merci de m'aider.

Bon dimanche.😉

ps: il s'agit de l'userform Produit
 

Pièces jointes

Bonjour,

Les avantages de la présentation Tableau:
-Pas besoin de spécifier la feuille
-Le tableau s'grandit automatiquement en hauteur & largeur)
-Si on ajoute une ligne, les formules sont recopiées

Pour visualiser les entête de colonnes d'une listBox.

Code:
Dim NomTableau, Nbcol
Private Sub UserForm_Initialize()
   NomTableau = "Tableau2"
   Dim Ws As Worksheet, dl As Long, Tb()
'   .Unprotect 1234
   Tb = Range(NomTableau).Value
'   .Protect 1234
   Nbcol = UBound(Tb, 2)
   Me.ListBox1.List = Tb
   Me.ListBox1.ColumnCount = Nbcol
   EnTeteListBox
'  '''''''''''''''''''''''''''''''''''''''''''''''''''
   Me.ComboBox1.List = Array("L", "KG", "U")
End Sub

Code:
 Sub EnTeteListBox()
   colVisu = Array(1, 2, 3, 4, 5, 6, 7)   ' colonnes à visualiser
   x = Me.ListBox1.Left + 8
   Y = Me.ListBox1.Top - 20
   For c = 1 To Nbcol
     Pos = Application.Match(c, colVisu, 0)
     If Not IsError(Pos) Then
       k = c
       Set Lab = Me.Controls.Add("Forms.Label.1")
       Lab.Caption = Range(NomTableau).Offset(-1).Item(1, c)
       Lab.Top = Y
       Lab.Left = x
       Lab.Height = 24
       Lab.Width = Range(NomTableau).Columns(c).Width * 1#
       x = x + Range(NomTableau).Columns(c).Width * 1
       tempcol = tempcol & Range(NomTableau).Columns(c).Width * 1# & ";"
     Else
       x = x + 0
       tempcol = tempcol & 0 & ";"
     End If
   Next c
   Me.ListBox1.ColumnWidths = tempcol
End Sub

Affichage de colonnes discontinues dans une ListBox:

http://boisgontierjacques.free.fr/fichiers/Formulaire/ListBoxMultiColonnesDiscTableau.xls

JB
 

Pièces jointes

Dernière édition:
Re

Chez moi, j'ai bien les entêtes dans la ListBox avec le code* ci-dessous
(*code de test simple,non finalisé)
VB:
Private Sub UserForm_Initialize()
Dim WS As Worksheet, Source$
Set WS = Sheets("Ref")
Source = WS.[A1].Parent.Name & "!" & WS.Range("A2", WS.Cells(Rows.Count, "G").End(xlUp)).Address
With ListBox1
.Clear
.ColumnHeads = True: .ColumnCount = 7: .RowSource = Source
End With
End Sub
Merci beaucoup. En effet, ça fonctionne bien.
 
Bonjour,

Pour visualiser les entête de colonnes d'une listBox.

Code:
Dim NomTableau, Nbcol
Private Sub UserForm_Initialize()
   NomTableau = "Tableau2"
   Dim Ws As Worksheet, dl As Long, Tb()
'   .Unprotect 1234
   Tb = Range(NomTableau).Value
'   .Protect 1234
   Nbcol = UBound(Tb, 2)
   Me.ListBox1.List = Tb
   Me.ListBox1.ColumnCount = Nbcol
   EnTeteListBox
'  '''''''''''''''''''''''''''''''''''''''''''''''''''
   Me.ComboBox1.List = Array("L", "KG", "U")
End Sub
Code:
 Sub EnTeteListBox()
   colVisu = Array(1, 2, 3, 4, 5, 6, 7)   ' colonnes à visualiser
   x = Me.ListBox1.Left + 8
   Y = Me.ListBox1.Top - 20
   For c = 1 To Nbcol
     Pos = Application.Match(c, colVisu, 0)
     If Not IsError(Pos) Then
       k = c
       Set Lab = Me.Controls.Add("Forms.Label.1")
       Lab.Caption = Range(NomTableau).Offset(-1).Item(1, c)
       Lab.Top = Y
       Lab.Left = x
       Lab.Height = 24
       Lab.Width = Range(NomTableau).Columns(c).Width * 1#
       x = x + Range(NomTableau).Columns(c).Width * 1
       tempcol = tempcol & Range(NomTableau).Columns(c).Width * 1# & ";"
     Else
       x = x + 0
       tempcol = tempcol & 0 & ";"
     End If
   Next c
   Me.ListBox1.ColumnWidths = tempcol
End Sub



JB

Y a pas photo, c'est parfait exactement le résultat espéré.
Merci beaucoup. ça va vraiment me permettre d'avancer.

Bonne fin d'après midi à toutes et à tous.
 
@BOISGONTIER : Très très gentil de ta part. Mais je voudrais tout de même comprendre ces 3 lignes ci-dessous. Notamment, la multiplication pourquoi le 1 seul et le 1#, quelle différence?

VB:
Lab.Width = Range(NomTableau).Columns(c).Width * 1#
       x = x + Range(NomTableau).Columns(c).Width * 1
       tempcol = tempcol & Range(NomTableau).Columns(c).Width * 1# & ";"
Avec mes remerciements anticipés.
 
>Lab.Width = Range(NomTableau).Columns(c).Width * 1#
x = x + Range(NomTableau).Columns(c).Width * 1
tempcol = tempcol & Range(NomTableau).Columns(c).Width * 1# & ";"

On donne aux colonnes de la ListBox la largeur des colonnes du tableau.
1 est un facteur d'ajustement. Le # est ajouté par VB (double précision)

Pour visualiser une ListBox avec des colonnes discontinues:

Code:
Dim NomTableau, ColVisu()
Private Sub UserForm_Initialize()
    NomTableau = "Tableau1"
    ColVisu = Array(1, 2, 4, 7)          ' colonnes à visualiser
    TblBD = Range(NomTableau).Value
    '-- en têtes de colonne ListBox
    Me.ListBox1.ColumnCount = UBound(ColVisu) + 1
    EnteteListBox
    Dim Tbl: ReDim Tbl(1 To UBound(TblBD), 1 To UBound(ColVisu) + 1)
    j = 0
    For Each k In ColVisu
        j = j + 1
        For i = 1 To UBound(TblBD)
           Tbl(i, j) = TblBD(i, k)
        Next i
    Next k
    ListBox1.List = Tbl
End Sub


Sub EnteteListBox()
    x = Me.ListBox1.Left + 8
    Y = Me.ListBox1.Top - 12
    For Each c In ColVisu
      Set Lab = Me.Controls.Add("Forms.Label.1")
      Lab.Caption = Range(NomTableau).Offset(-1).Item(1, c)
      Lab.Top = Y
      Lab.Left = x
      Lab.Height = 24
      Lab.Width = Range(NomTableau).Columns(c).Width * 1#
      x = x + Range(NomTableau).Columns(c).Width * 1
      tempCol = tempCol & Range(NomTableau).Columns(c).Width * 1# & ";"
    Next
    tempCol = Left(tempCol, Len(tempCol) - 1)
    Me.ListBox1.ColumnWidths = tempCol
End Sub

JB
 

Pièces jointes

Dernière édition:
Bon_jour
Bonjour,
Les avantages de la présentation Tableau:
-Pas besoin de spécifier la feuille
-Le tableau s'grandit automatiquement en hauteur & largeur)
-Si on ajoute une ligne, les formules sont recopiées
Merci JB 🙂.
Que c'est difficile de faire passer des nouveautés (encore qu'avant on disposait de l'outil Table) !

Une fois de plus
je propose une solution avec l'outil Tableau !

Nota : il ya encore beaucoup à faire dans ce fichier.
 

Pièces jointes

@BOISGONTIER : tous mes remerciements pour tes explications. Là, j'ai compris que l'on ajuste la largeur des colonnes de la listbox par rapport à la largeur des colonnes de la feuille. Pour la suite de mon petit projet, je ne maîtrise pas la manipulation des tableaux structurés d'excel en vba. Je t'avoue que j'hésite à l'utiliser. Je vais devoir mis mettre sérieusement.

Encore merci. Bonne soirée.
 
Bon_jour

Merci JB 🙂.
Que c'est difficile de faire passer des nouveautés (encore qu'avant on disposait de l'outil Table) !

Une fois de plus
je propose une solution avec l'outil Tableau !

Nota : il ya encore beaucoup à faire dans ce fichier.
Bonsoir Si...🙂,
J'avoue qu'avec un tableau classique ça me va et m'intéresse. Cependant, ton code plante en cliquant sur l'entête de colonne dans la listbox.
Alors que faire dans ce cas, pour éviter ce plantage.

Encore merci.😉

Bonne soirée.
 
Re
Bonsoir Si...🙂,
J'avoue qu'avec un tableau classique ça me va et m'intéresse. Cependant...
Tu peux continuer à rouler en "deuche" mais je préfère "Zoé". Bien sûr, tout dépend de l'usage que l'on veut en faire.😎
Pour ceux qui ne sauraient comment éviter le message d'erreur, il suffit d'ajouter un simple test dans la macro Private Sub Lt_Mo… : If l < 0 Then Exit Sub

Nota : l < 0 correspond à l = -1 (ancienne version que l'on trouve dans les macros proposées)
 
Voici un problème récurrent d'affichage dans une ListBox où sont filtrés les enregistrements et les colonnes affichées.
Il n'utilise pas la présentation Tableau mais est facilement adaptable (il y a 2 instructions à supprimer)

http://boisgontierjacques.free.fr/fichiers/Formulaire/FormFiltreListboxEntete.xls

Des entêtes simples mais qui ne fonctionnent que pour des ListBox issus de Ranges mais pas d'Arrays():

http://boisgontierjacques.free.fr/fichiers/Formulaire/ListboxEnteteSimple.xls
http://boisgontierjacques.free.fr/fichiers/Formulaire/ListboxEnteteSimpleTableau.xls


jb
 

Pièces jointes

Dernière édition:
Re

Tu peux continuer à rouler en "deuche" mais je préfère "Zoé". Bien sûr, tout dépend de l'usage que l'on veut en faire.😎
Pour ceux qui ne sauraient comment éviter le message d'erreur, il suffit d'ajouter un simple test dans la macro Private Sub Lt_Mo… : If l < 0 Then Exit Sub

Nota : l < 0 correspond à l = -1 (ancienne version que l'on trouve dans les macros proposées)
Bonjour Si...😉,
Je suis pas encore équipé de détecteur de radar, alors je me contente de la "Deuche".
Merci beaucoup pour ton aide et ton astuce.
Bonne journée.😀
 
Voici un problème récurrent d'affichage dans une ListBox où sont filtrés les enregistrements et les colonnes affichées.
Il n'utilise pas la présentation Tableau mais est facilement adaptable (il y a 2 instructions à supprimer)

http://boisgontierjacques.free.fr/fichiers/Formulaire/FormFiltreListboxEntete.xls

jb
Bonjour JB🙂,
Merci beaucoup. Je me mets aux tableaux structurés car il semble qu'ils sont très pratiques.
ça va me prendre un peu de temps, pour gagner en efficacité.

Bonne journée.😀
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
825
Réponses
12
Affichages
1 K
Réponses
4
Affichages
887
Réponses
0
Affichages
710
Réponses
0
Affichages
1 K
Retour