XL 2021 Atteindre l'onglet du Client au clic sur son nom dans ma ListBox

Usine à gaz

XLDnaute Barbatruc
Bonjour à toutes et à tous :)

Je voudrais faire un codage que je ne sais (évidemment lol) pas faire.
C'est plus pour le fun !

Le contexte
Chaque fin de mois, je facture mes Clients
- Quand je valide dans onglet "Facture" une facturation, la facture est enregistrée dans un nouvel onglet au nom du Client concerné.

Je peux avoir ainsi jusqu'a une cinquantaine d'onglets (1 par Client),
Pour "atteindre l'onglet d'un Client, il "me faut me promener" dans les onglets pour le trouver.

Evidemment, il a la possibilité de faire un clic droit, en bas à gauche des onglets pour afficher la liste des Clients et atteindre l'onglet au clic sur le nom.

Pour le fun, j'aimerais pouvoir atteindre l'onglet du Client au clic sur son nom dans ma ListBox.

Pensez-vous que ce soit possible ?

En cas, je joins un petit fichier test et je continuerai à chercher ce soir.

Merci à toutes et à tous :)
 

Pièces jointes

  • Facturation Question.xlsm
    147.1 KB · Affichages: 18
Dernière édition:

Dudu2

XLDnaute Barbatruc
De mon coté j'ai amélioré l'affichage de la liste des pages en paramétrant:
- Le nombre de lignes de la ComboBox,
- La position du UserForm.
De plus j'ai ajouté le Scroll dans la ComboBox.

Fichier à placer en Complément pour un fonctionnement sur tout classeur ouvert.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour,

Des paramètres supplémentaires:
1696664473785.png


Fichier à placer en Complément pour un fonctionnement sur tout classeur ouvert.
 

Pièces jointes

  • ChoixFeuille.xlsm
    55.3 KB · Affichages: 3

job75

XLDnaute Barbatruc
Bonjour Lionel, Dudu2, le forum,

L'un de tes arguments Dudu2 pour ton usine à gaz c'est qu'il est difficile de naviguer entre les feuilles quand il y en a beaucoup.

Voici ma contribution en complément de mon post #13 avec ce code dans ThisWorkbook :
VB:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
ThisWorkbook.Names.Add "Feuille_Precedente", Sh.Name
End Sub

Sub Retour()
'se lance par les touches Ctrl+R
On Error Resume Next
Sheets([Feuille_Precedente]).Activate
End Sub
Il permet de revenir facilement sur la feuille précédente.

A+
 

Pièces jointes

  • Facturation Question(2).xlsm
    107.8 KB · Affichages: 2

Usine à gaz

XLDnaute Barbatruc
Bonjour Lionel, Dudu2, le forum,

L'un de tes arguments Dudu2 pour ton usine à gaz c'est qu'il est difficile de naviguer entre les feuilles quand il y en a beaucoup.

Voici ma contribution en complément de mon post #13 avec ce code dans ThisWorkbook :
VB:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
ThisWorkbook.Names.Add "Feuille_Precedente", Sh.Name
End Sub

Sub Retour()
'se lance par les touches Ctrl+R
On Error Resume Next
Sheets([Feuille_Precedente]).Activate
End Sub
Il permet de revenir facilement sur la feuille précédente.

A+
Bonjour Gérard :)
Merci d'être encore à répondre.
Super aussi ta version (qui me donne une idée)...
Comme d'habitude, nickel et "pas" Usine à gaz lol :)
 

laurent950

XLDnaute Barbatruc
Bonjour @Usine à gaz

Après avoir relu ton poste une proposition efficace

VB:
Private Sub ListBox1_Click()
    Dim ws As Worksheet
    Dim button As button
    Dim buttonLeft As Single, buttonTop As Single
    ' Le nom de l'onglet qui correspond au client sélectionné
        Set ws = ThisWorkbook.Worksheets(Me.ListBox1.List(ListBox1.ListIndex, 1))
    ' Activer la feuille correspondante
        ws.Activate
    ' Créer le bouton avec une flèche de retour
        buttonLeft = 10 ' Position horizontale du bouton
        buttonTop = 10  ' Position verticale du bouton
            Set button = ws.Buttons.Add(buttonLeft, buttonTop, 50, 20)
    ' Ajouter une flèche de retour au bouton
        With button
            .Caption = ChrW(&H2190) & " Retour" ' Flèche de retour
            .OnAction = "Feuil2.SupprimerBoutonRetour" ' Feuil2 = Feuille Facture pour faire simple
        End With
End Sub
'
Sub SupprimerBoutonRetour()
    ' Déclarer une variable pour stocker l'objet bouton
        Dim Bouton As button
    ' Utiliser Application.Caller pour obtenir l'objet bouton qui a déclenché la macro
        Set Bouton = ActiveSheet.Buttons(Application.Caller)
    ' Supprimer le bouton
        Bouton.Delete
    ' Retour à la feuille "Facture"
        ThisWorkbook.Worksheets("Facture").Activate
End Sub

Si la feuille n'est pas trouvé suite au click dans la ListBox (Gestion d'erreur et sortie de Procédure)
Code ci-dessous
' Ajout
On Error Resume Next
' Le nom de l'onglet qui correspond au client sélectionné
Set ws = ThisWorkbook.Worksheets(Me.ListBox1.List(ListBox1.ListIndex, 1))
If Err <> 0 Then Exit Sub

Code:
Private Sub ListBox1_Click()
    Dim ws As Worksheet
    Dim button As button
    Dim buttonLeft As Single, buttonTop As Single
    On Error Resume Next
    ' Le nom de l'onglet qui correspond au client sélectionné
        Set ws = ThisWorkbook.Worksheets(Me.ListBox1.List(ListBox1.ListIndex, 1))
        If Err <> 0 Then Exit Sub
    ' Activer la feuille correspondante
        ws.Activate
    ' Créer le bouton avec une flèche de retour
        buttonLeft = 10 ' Position horizontale du bouton
        buttonTop = 10  ' Position verticale du bouton
            Set button = ws.Buttons.Add(buttonLeft, buttonTop, 50, 20)
    ' Ajouter une flèche de retour au bouton
        With button
            .Caption = ChrW(&H2190) & " Retour" ' Flèche de retour
            .OnAction = "Feuil2.SupprimerBoutonRetour" ' Feuil2 = Feuille Facture pour faire simple
        End With
End Sub
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Pléthore de codes et de solutions. Quel succès @Usine à gaz ! ;)

Alors, comme Monsieur Plus, je reviens avec la possibilité de déplacer le UserForm/ComboBox avec les flèches du clavier.
Et pourquoi ?
Parce qu'Excel "ne voit pas" la barre des tâches quand il développe une ComboBox et que si la liste est longue et le UserForm pas assez haut placé (ex sur le curseur quelque part), les 1 ou 2 derniers éléments sont masqués par la barre des tâches si elle est en bas.

Edit: Ceci dit ça ne sert pas à grand chose car dans ce cas il suffit de faire Escape + monter le curseur + F1. C'était histoire de faire un truc.

Fichier à placer en Complément pour un fonctionnement sur tout classeur ouvert.
 

Pièces jointes

  • ChoixFeuille.xlsm
    57.7 KB · Affichages: 4
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Bonjour @Usine à gaz

Après avoir relu ton poste une proposition efficace

VB:
Private Sub ListBox1_Click()
    Dim ws As Worksheet
    Dim button As button
    Dim buttonLeft As Single, buttonTop As Single
    ' Le nom de l'onglet qui correspond au client sélectionné
        Set ws = ThisWorkbook.Worksheets(Me.ListBox1.List(ListBox1.ListIndex, 1))
    ' Activer la feuille correspondante
        ws.Activate
    ' Créer le bouton avec une flèche de retour
        buttonLeft = 10 ' Position horizontale du bouton
        buttonTop = 10  ' Position verticale du bouton
            Set button = ws.Buttons.Add(buttonLeft, buttonTop, 50, 20)
    ' Ajouter une flèche de retour au bouton
        With button
            .Caption = ChrW(&H2190) & " Retour" ' Flèche de retour
            .OnAction = "Feuil2.SupprimerBoutonRetour" ' Feuil2 = Feuille Facture pour faire simple
        End With
End Sub
'
Sub SupprimerBoutonRetour()
    ' Déclarer une variable pour stocker l'objet bouton
        Dim Bouton As button
    ' Utiliser Application.Caller pour obtenir l'objet bouton qui a déclenché la macro
        Set Bouton = ActiveSheet.Buttons(Application.Caller)
    ' Supprimer le bouton
        Bouton.Delete
    ' Retour à la feuille "Facture"
        ThisWorkbook.Worksheets("Facture").Activate
End Sub

Si la feuille n'est pas trouvé suite au click dans la ListBox (Gestion d'erreur et sortie de Procédure)
Code ci-dessous
' Ajout
On Error Resume Next
' Le nom de l'onglet qui correspond au client sélectionné
Set ws = ThisWorkbook.Worksheets(Me.ListBox1.List(ListBox1.ListIndex, 1))
If Err <> 0 Then Exit Sub

Code:
Private Sub ListBox1_Click()
    Dim ws As Worksheet
    Dim button As button
    Dim buttonLeft As Single, buttonTop As Single
    On Error Resume Next
    ' Le nom de l'onglet qui correspond au client sélectionné
        Set ws = ThisWorkbook.Worksheets(Me.ListBox1.List(ListBox1.ListIndex, 1))
        If Err <> 0 Then Exit Sub
    ' Activer la feuille correspondante
        ws.Activate
    ' Créer le bouton avec une flèche de retour
        buttonLeft = 10 ' Position horizontale du bouton
        buttonTop = 10  ' Position verticale du bouton
            Set button = ws.Buttons.Add(buttonLeft, buttonTop, 50, 20)
    ' Ajouter une flèche de retour au bouton
        With button
            .Caption = ChrW(&H2190) & " Retour" ' Flèche de retour
            .OnAction = "Feuil2.SupprimerBoutonRetour" ' Feuil2 = Feuille Facture pour faire simple
        End With
End Sub
Bjr laurent :)
Merci pour ce nouveau code.
Je testerai,
:)
 

Usine à gaz

XLDnaute Barbatruc
Pléthore de codes et de solutions. Quel succès @Usine à gaz ! ;)

Alors, comme Monsieur Plus, je reviens avec la possibilité de déplacer le UserForm/ComboBox avec les flèches du clavier.
Et pourquoi ?
Parce qu'Excel "ne voit pas" la barre des tâches quand il développe une ComboBox et que si la liste est longue et le UserForm pas assez haut placé (ex sur le curseur quelque part), les 1 ou 2 derniers éléments sont masqués par la barre des tâches si elle est en bas.

Edit: Ceci dit ça ne sert pas à grand chose car dans ce cas il suffit de faire Escape + monter le curseur + F1. C'était histoire de faire un truc.

Fichier à placer en Complément pour un fonctionnement sur tout classeur ouvert.
Bonjour Dudu2 :)

Merci pour ce nouveau code... j'ai regardé tes autres codes qui fonctionnent bien.
Je pense que celui-là aussi. Je verrai les modifs que tu as faites ....
Encore merci :)

"Pléthore de codes et de solutions. Quel succès"
Yes ! Vraiment merci à tous :)
Moi heureux
super_vieux.gif
bébé heureux
bebe.gif
Mamie contente
la forme.gif

lol :)
 

dysorthographie

XLDnaute Accro
Bonjour,
tu raisonnes comme un DSI qui favorise l'aspect du rendu et pas le coté pratique coté utilisateurs!

perso j'aurai fait une base de données en ligne avec formulaire de saisie et recherche!

VB:
Private Sub ComboBox1_Change()
With ComboBox1
    If CStr(ComboBox1.Text) = "" Then
            For Each c In Split("F8,X8,F9,V9,X9,V12,V13,V15,B17,F17,N17,X17", ",")
                Sheets("Factures Client").Range(c).Value = ""
             Next
        End If
    If .ListIndex = -1 Then Exit Sub
    For Each c In Split("F8,X8,F9,V9,X9,V12,V13,V15,B17,F17,N17,X17", ",")
        Sheets("Factures Client").Range(c).Value = Sheets(.Text).Range(c).Value
    Next
  
End With
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
    If ComboBox1.ListIndex = -1 And CStr(ComboBox1.Text) <> "" Then
        If MsgBox(ComboBox1.Text & " n'xiste pas voulez voue le rajouter", vbQuestion + vbYesNo) = vbYes Then
        If IsSheetExist(ComboBox1.Text) Then MsgBox ComboBox1.Text & " Existe déjà", vbExclamation: Exit Sub
            Application.DisplayAlerts = False
            Sheets("Model Facture").Copy After:=Sheets(Sheets.Count)
                ComboBox1.AddItem ComboBox1.Text
                Sheets(Sheets.Count).Name = ComboBox1.Text
                Sheets("Factures Client").Select
           Application.DisplayAlerts = True
        End If
        
    End If
End If
End Sub
Function IsSheetExist(ByVal sh As String) As Boolean
On Error Resume Next
  sh = Sheets(sh).Name
  IsSheetExist = Not CBool(Err)
On Error GoTo 0
End Function



Private Sub CommandButton1_Click()
    With ComboBox1
        If .ListIndex = -1 Then Exit Sub
        For Each c In Split("F8,X8,F9,V9,X9,V12,V13,V15,B17,F17,N17,X17", ",")
            Sheets(.Text).Range(c).Value = Sheets("Factures Client").Range(c).Value
        Next
End With

End Sub

Private Sub Worksheet_Activate()
Dim i As Integer, sh As String
If ComboBox1.ListIndex > -1 Then sh = ComboBox1.Text
ComboBox1.Clear
For i = ActiveSheet.Index + 1 To Sheets.Count
    ComboBox1.AddItem Sheets(i).Name
Next
If CStr(sh) <> "" Then ComboBox1.Text = sh
End Sub
 

Pièces jointes

  • Facturation Question.xlsm
    186 KB · Affichages: 7

Dudu2

XLDnaute Barbatruc
Bonjour,
Puisque ce sujet vit encore, j'ai simplifié ma version en retirant toutes les options de positionnement (trop complexe et pas forcément adapté).
Le UserForm / ComboBox des feuilles se positionne sur le curseur et une touche (paramétrée) permet de figer / "dé-figer" la position en cours. Les touches flèches en permettent aussi le déplacement.

1696775363604.png
 

Pièces jointes

  • ChoixFeuille.xlsm
    60.4 KB · Affichages: 4

Discussions similaires

Réponses
16
Affichages
639

Statistiques des forums

Discussions
315 089
Messages
2 116 098
Membres
112 661
dernier inscrit
ceucri