bouton option affichage dans une listeBox des feuilles ayant le même nom

Geely

XLDnaute Occasionnel
Bonsoir le Forum

Voila je souhaite afficher une ListeBox dans un Userform. le contenu d'une feuille.
Le choix de la feuille se fait par des boutons option, le problème est que les feuilles possèdent le même nom

Geely
 

Pièces jointes

  • Geely.xls
    44.5 KB · Affichages: 33

job75

XLDnaute Barbatruc
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Bonsoir Geely,

Voir fichier joint.

Il y avait un espace devant le nom de l'onglet Tableau (2) je l'ai enlevé...

A+
 

Pièces jointes

  • Geely(1).xls
    59.5 KB · Affichages: 24

Regueiro

XLDnaute Impliqué
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Bonsoir à Tous
Il y des espaces devant tes noms d'onglets.

Code:
Private Sub OptionButton1_Click()
    With Sheets("Tableau (2)")
    Me.TextBox1 = .[D4]
    Me.ListBox1.List = .Range("D5:D" & .Range("D65536").End(xlUp).Row).Value
   End With
End Sub
 

job75

XLDnaute Barbatruc
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Re,

Fichier (2) nettement plus sophistiqué avec une macro paramétrée :

Code:
Private Sub OptionButton1_Click()
Affiche "Tableau"
End Sub

Private Sub OptionButton2_Click()
Affiche "Tableau (2)"
End Sub

Private Sub OptionButton3_Click()
Affiche "Tableau (3)"
End Sub

Private Sub OptionButton4_Click()
Affiche "Tableau (4)"
End Sub

Sub Affiche(NomFeuille As String)
Dim liste As Range
With Sheets(NomFeuille)
  TextBox1 = .[D4]
  Set liste = .Range("D5", .[D65536].End(xlUp)) 'liste dynamique
  If liste.Row < 5 Then ListBox1.Clear: Exit Sub 'si liste vide
  ListBox1.List = liste.Value
End With
End Sub
Bonne nuit.
 

Pièces jointes

  • Geely(2).xls
    59.5 KB · Affichages: 33

Regueiro

XLDnaute Impliqué
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Re
Avec un combobox pour le choix des onglets.
Code plus court ??

Code:
Private Sub UserForm_Initialize()
   For i = 2 To Sheets.Count
     Me.ComboBox1.AddItem Sheets(i).Name
   Next i
 End Sub
Private Sub ComboBox1_Change()
   m = Me.ComboBox1
   With Sheets(m)
   Me.TextBox1 = .[D4]
    Me.ListBox1.List = .Range("D5:D" & .Range("D65536").End(xlUp).Row).Value
End With
 End Sub
A+
 

job75

XLDnaute Barbatruc
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Bonjour le fil, le forum,

Autre solution avec une ComboBox , plus compliquée à comprendre :

Code:
Dim tablo() 'mémorisation

Private Sub ComboBox1_Change()
Dim liste As Range
ListBox1.Clear
If ComboBox1.ListIndex = -1 Then Exit Sub
With Sheets(tablo(1, ComboBox1.ListIndex))
  Set liste = .Range("D5", .[D65536].End(xlUp)) 'liste dynamique
End With
If liste.Row = 5 Then ListBox1.List = liste.Value
End Sub

Private Sub UserForm_Initialize()
Dim w As Worksheet, n As Integer
For Each w In Worksheets
  If w.Name Like "Tableau*" Then
    ReDim Preserve tablo(1, n) 'base 0
    tablo(0, n) = w.[D4]
    tablo(1, n) = w.Name
    n = n + 1
  End If
Next
ComboBox1.List = Application.Transpose(tablo)
End Sub
Fichier (3).

Edit : si l'on veut afficher aussi le nom de la feuille, il suffit de mettre à 2 la propriété ColumnCount de la ComboBox.

Fichier (3 bis).

A+
 

Pièces jointes

  • Geely(3 bis).xls
    61 KB · Affichages: 22
  • Geely(3).xls
    60.5 KB · Affichages: 28
Dernière édition:

job75

XLDnaute Barbatruc
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Re,

Et en mettant à 2 la propriété BoundColumn de la ComboBox plus besoin de mémoriser tablo :

Code:
Private Sub ComboBox1_Change()
Dim liste As Range
ListBox1.Clear
If ComboBox1.ListIndex = -1 Then Exit Sub
With Sheets(ComboBox1.Value)
  Set liste = .Range("D5", .[D65536].End(xlUp)) 'liste dynamique
End With
If liste.Row = 5 Then ListBox1.List = liste.Value
End Sub

Private Sub UserForm_Initialize()
Dim w As Worksheet, tablo(), n As Integer
For Each w In Worksheets
  If w.Name Like "Tableau*" Then
    ReDim Preserve tablo(1, n) 'base 0
    tablo(0, n) = w.[D4]
    tablo(1, n) = w.Name
    n = n + 1
  End If
Next
ComboBox1.List = Application.Transpose(tablo)
End Sub
Fichier (4).

A+
 

Pièces jointes

  • Geely(4).xls
    61 KB · Affichages: 23

job75

XLDnaute Barbatruc
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Re,

En poussant le bouchon un peu loin, on peut même trier alphabétiquement les titres des listes :

Code:
Sub tri(a, gauc, droi)          ' Quick sort aménagée
Dim ref, g, d, temp
ref = a(0, (gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(0, g) < ref: g = g + 1: Loop
    Do While ref < a(0, d): d = d - 1: Loop
    If g <= d Then
      temp = a(0, g): a(0, g) = a(0, d): a(0, d) = temp
      temp = a(1, g): a(1, g) = a(1, d): a(1, d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub
Par ailleurs j'ai amélioré la restitution dans UserForm_Initialize :

Code:
If n = 1 Then
  ComboBox1.AddItem tablo(0, 0)
  ComboBox1.List(0, 1) = tablo(1, 0)
ElseIf n Then
  Call tri(tablo, 0, n - 1)
  ComboBox1.List = Application.Transpose(tablo)
End If
End Sub
Fichier (5).

A+
 

Pièces jointes

  • Geely(5).xls
    64.5 KB · Affichages: 29

Geely

XLDnaute Occasionnel
Re : bouton option affichage dans une listeBox des feuilles ayant le même nom

Bonsoir

Merci Job75 & Regueiro, super !

Je retiens les deux codes suivant
Code:
Private Sub UserForm_Initialize()
    For i = 2 To Sheets.Count
      Me.ComboBox1.AddItem Sheets(i).Name
    Next i
  End Sub
 Private Sub ComboBox1_Change()
    m = Me.ComboBox1
    With Sheets(m)
    Me.TextBox1 = .[D4]
     Me.ListBox1.List = .Range("D5:D" & .Range("D65536").End(xlUp).Row).Value
 End With
  End Sub
et
Code:
Private Sub OptionButton1_Click()
 Affiche "Tableau"
 End Sub

 Private Sub OptionButton2_Click()
 Affiche "Tableau (2)"
 End Sub

 Private Sub OptionButton3_Click()
 Affiche "Tableau (3)"
 End Sub

 Private Sub OptionButton4_Click()
 Affiche "Tableau (4)"
 End Sub

 Sub Affiche(NomFeuille As String)
 Dim liste As Range
 With Sheets(NomFeuille)
   TextBox1 = .[D4]
   Set liste = .Range("D5", .[D65536].End(xlUp)) 'liste dynamique
   If liste.Row < 5 Then ListBox1.Clear: Exit Sub 'si liste vide
   ListBox1.List = liste.Value
 End With
 End Sub

Job75, j'avoue je décroche sur tes dernières solutions qui sont plus compliqués à comprendre
notamment :"Application.Transpose(tablo)"

Le trie sur les Listes : un vrai Luxe

Merci du coup de main.

geely
 

Discussions similaires

Statistiques des forums

Discussions
312 370
Messages
2 087 690
Membres
103 640
dernier inscrit
So pizza