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

XL 2016 Atteindre une colonne à partir d'un menu déroulant

Eric4709

XLDnaute Nouveau
Bonjour à tous,

Nouveau problème, nouvelle question

J'ai dans un tableau 280 colonnes. Je souhaiterai savoir s'il serait possible par un bouton faire apparaître sous forme de menu déroulant l'ensemble des intitulés des colonnes du tableau et cliquer sur un nom pour atteindre cette colonne ?

Merci d'avance pour votre aide.
 

Pièces jointes

  • Test_OPRA.xlsm
    673.1 KB · Affichages: 12
Solution
Bonsoir,
Un essai en PJ avec :
VB:
Sub ChoixOnglets()
With ListWindows
    Dim Plage(), PlageOut(), Buffer, N%, x%, i%, j%
    N = Application.CountIf([1:1], "*")
    Plage = Range(Cells(1, 1), Cells(1, N))
    ReDim PlageOut(N)
    ' Tri alpha descendant
    For i = 1 To N
        For j = 1 To N
            If Plage(1, i) < Plage(1, j) Then
                Buffer = Plage(1, i)
                Plage(1, i) = Plage(1, j)
                Plage(1, j) = Buffer
            End If
        Next j
    Next i
    ' Transfert matrice pour passer double colonne en une seule
    For x = 1 To N
        PlageOut(x - 1) = Plage(1, x)
    Next x
    ' Mise dans ListBox
    .ListeOnglets.List = PlageOut
    .ListeOnglets.ListIndex = 0
    .Show
End With...

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Éric, bonjour le forum,

J'ai déplacé le tableau structuré, figé les volets et rajouté les deux événementielle ci-dessous :

VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim I As Integer
Dim L As String

If Target.Address <> "$A$1" Then Exit Sub
For I = 1 To Me.ListObjects("Tableau1").HeaderRowRange.Count
    L = IIf(L = "", Me.ListObjects("Tableau1").HeaderRowRange.Item(1, I), L & "," & Me.ListObjects("Tableau1").HeaderRowRange.Item(1, I))
Next I
With Target.Validation
    .Delete
    .Add xlValidateList, Formula1:=L
End With
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
Me.Cells(2, Me.Rows(2).Find(Target.Value, , xlValues, xlWhole).Column).Select
End Sub
Le fichier :
 

Pièces jointes

  • Eric_ED_v01.xlsm
    681.8 KB · Affichages: 7

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Eric,
Un essai en PJ avec :
Dans Thisworkbook, je redirige la touche "²" pour faire l'accès aux onglets :
VB:
Sub Workbook_Open()
     Application.OnKey "²", "ChoixOnglets"
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     Application.OnKey "²"
End Sub
Dans l'userform l'accès aux onglets:
Code:
Private Sub CommandButton1_Click()
    N = Application.Match(ListeOnglets.Value, [1:1], 0)
    Unload Me
    ActiveSheet.Cells(1, N).Select
End Sub
En module le remplissage de l'userform :
Code:
Sub ChoixOnglets()
With ListWindows
    N = Application.CountIf([1:1], "*")
    Set Plage = Range(Cells(1, 1), Cells(1, N))
    .ListeOnglets.List = Application.Transpose(Plage)
    .ListeOnglets.ListIndex = 0
    .Show
End With
End Sub

Donc pour accéder à un onglet il suffit d'appuyer sur la touche "²" ( qui ne sert à rien généralement ) pour avoir la liste des onglets et le choisir.
 

Pièces jointes

  • Test_OPRA.xlsm
    683.4 KB · Affichages: 9

Jacky67

XLDnaute Barbatruc
Bonjour à tous,
Une proposition avec un combobox visible en permanence et colonne sélectionnée en début de feuille
 

Pièces jointes

  • Test_OPRA .xlsm
    684.5 KB · Affichages: 5

Eric4709

XLDnaute Nouveau
Merci à tous pour vos réponses aussi intéressante les unes que les autres et qui fonctionnent parfaitement.

J'ai finalement retenu la solution de Sylvanu
Pour aller toujours un peu plus loin, est ce qu'il y aurait une ligne de code qui me permettrait de classer les intitulés dans la liste par ordre alphabétique ?

Encore merci
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir,
Un essai en PJ avec :
VB:
Sub ChoixOnglets()
With ListWindows
    Dim Plage(), PlageOut(), Buffer, N%, x%, i%, j%
    N = Application.CountIf([1:1], "*")
    Plage = Range(Cells(1, 1), Cells(1, N))
    ReDim PlageOut(N)
    ' Tri alpha descendant
    For i = 1 To N
        For j = 1 To N
            If Plage(1, i) < Plage(1, j) Then
                Buffer = Plage(1, i)
                Plage(1, i) = Plage(1, j)
                Plage(1, j) = Buffer
            End If
        Next j
    Next i
    ' Transfert matrice pour passer double colonne en une seule
    For x = 1 To N
        PlageOut(x - 1) = Plage(1, x)
    Next x
    ' Mise dans ListBox
    .ListeOnglets.List = PlageOut
    .ListeOnglets.ListIndex = 0
    .Show
End With
End Sub
 

Pièces jointes

  • Test_OPRA (2).xlsm
    684.9 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Oups, p'ti bug.
Le tri s'effectuant avec la casse, le "a" est en fin de liste, et comme votre liste commence par des majuscules ou minuscules, le tri n'est pas effectué correctement.
En PJ s'est rectifié.
Sorry.
 

Pièces jointes

  • Test_OPRA (3).xlsm
    684.9 KB · Affichages: 5

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…