XL 2021 Formulaire de navigation

  • Initiateur de la discussion Initiateur de la discussion olivier1984
  • 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 !

olivier1984

XLDnaute Junior
Bonsoir à tous j'espère que vous allez bien.

J'ai une application dont le formulaire me servant de menu de navigation ne fonctionne pas correctement. L'objectif est de cliquer sur une case du formulaire et elle nous renvoie à la feuille du classeur concernée. Le fichier contient plusieurs feuilles (achats, Stock, TDB, BDD, nouvelle facture, imprimer facture etc...)

Problème : lorsque je clique par exemple sur TDB ça ouvre plutôt la feuille BDD, si je clique sur le bouton nouvelle facture ça va ouvrir la feuille achats etc... Tous les boutons du formulaire fonctionnent Mais n'ouvrent pas la feuille indiquée.

J'aimerais que vous m'aidiez à corriger l'erreur du code VBA afin que le bouton cliqué ouvre la feuille correspondante.

Je suis vraiment très novice en VBA donc j'apprends sur le tas.

Toute aide sera la bienvenue j'en ai vraiment besoin et je suis dans une urgence.

Pièces jointes :
- Fichier Excel
 

Pièces jointes

Bonjour Olivier,
Il me semble qu'il y ait pb dans vos sub de boutons :
VB:
Private Sub BtnimprimerFactures_Click()
Sheets(Me.BtnimprimerFactures.Caption).Select
'Feuil9.Select

End Sub
Le 1er Sheets(x).select est correct mais le second renvoie à une autre feuille.
Il suffit de le supprimer.
PJ à tester.

( NB : Vous avez des références circulaires qu'il vaudrait mieux résoudre )
 

Pièces jointes

Re,
Dans votre macro "vide_fichier" il y a des noms de feuilles inconnus.
"lignes factures" au lieu de probablement "LISTE DES FACTURES"
"Entrées" n'a pas de feuille correspondante.

De plus lorsqu'on réinitialise un fichier il est bon de demander confirmation au demandeur pour éviter les aneries.
Donc on peut faire :
VB:
Sub vide_fichier()
    Rep = MsgBox("Voulez vous vraiment réinitialiser ce fichier ?" & Chr(10) & _
                "Cela durera quelques secondes.", vbYesNo, vbCritical)
    If Rep = vbNo Then Exit Sub
    Sheets("LISTE DES FACTURES").[a2:f1000,i2:i1000].ClearContents
    Sheets("REGLEMENTS").[h2:h1000,e4:e1000].ClearContents
    Sheets("STOCK PRODUITS").[j7:j1000,m7:m1000].ClearContents
    'Sheets("Entrées").[f2:f1000,a2:c1000].ClearContents
    MsgBox "Traitement terminé", vbInformation
End Sub
La ligne de "Entrées" est en commentaires, à rectifier.

NB : pour les MSGBOX il y a un très bon tuto sur toutes les possibilités :
Vous avez aussi un petit outil pour construire graphiquement le msgbox, et il vous donne le code à mettre dans le VBA :
 
Dernière édition:
Bonsoir olivier1984, sylvanu,

On peut utiliser l'UserForm USFmenuPro comme module de classe avec ce code :
VB:
Public WithEvents CB As MSForms.CommandButton

Private Sub CB_Click()
Sheets(CB.Caption).Select
End Sub

Private Sub CB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CB.BackColor = IIf(X > 4 And X < CB.Width - 4 And Y > 4 And Y < CB.Height - 4, RGB(15, 215, 15), RGB(255, 255, 255))
End Sub
La classe est initialisée avec ce code dans Module1 :
VB:
Dim CB() As New USFmenuPro 'mémorise la variable

Sub menu()
Dim c As Control, n
With USFmenuPro
    For Each c In .Controls
        ReDim Preserve CB(n)
        Set CB(n).CB = c
        n = n + 1
    Next
    .Show
End With
End Sub
A+
 

Pièces jointes

Bonsoir olivier1984, sylvanu,

On peut utiliser l'UserForm USFmenuPro comme module de classe avec ce code :
VB:
Public WithEvents CB As MSForms.CommandButton

Private Sub CB_Click()
Sheets(CB.Caption).Select
End Sub

Private Sub CB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CB.BackColor = IIf(X > 4 And X < CB.Width - 4 And Y > 4 And Y < CB.Height - 4, RGB(15, 215, 15), RGB(255, 255, 255))
End Sub
La classe est initialisée avec ce code dans Module1 :
VB:
Dim CB() As New USFmenuPro 'mémorise la variable

Sub menu()
Dim c As Control, n
With USFmenuPro
    For Each c In .Controls
        ReDim Preserve CB(n)
        Set CB(n).CB = c
        n = n + 1
    Next
    .Show
End With
End Sub
A+
Bonsoir olivier1984, sylvanu,

On peut utiliser l'UserForm USFmenuPro comme module de classe avec ce code :
VB:
Public WithEvents CB As MSForms.CommandButton

Private Sub CB_Click()
Sheets(CB.Caption).Select
End Sub

Private Sub CB_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CB.BackColor = IIf(X > 4 And X < CB.Width - 4 And Y > 4 And Y < CB.Height - 4, RGB(15, 215, 15), RGB(255, 255, 255))
End Sub
La classe est initialisée avec ce code dans Module1 :
VB:
Dim CB() As New USFmenuPro 'mémorise la variable

Sub menu()
Dim c As Control, n
With USFmenuPro
    For Each c In .Controls
        ReDim Preserve CB(n)
        Set CB(n).CB = c
        n = n + 1
    Next
    .Show
End With
End Sub
A+
Bonjour Job 75 j'espère que tu vas bien.

Sincèrement je suis très ravi de ta proposition qui répond la mieux à mon problème qui est du coup totalement réglé et j'en suis ravi.

En effet le code que tu as utilisé est 1000 fois meilleur que celui que j'avais utilisé car beaucoup moins de lignes de codes et facile à adapter en cas d'ajout de nouvelles feuilles.

Je te dis encore 1000 fois merci tu m'as trouvé la solution à mon problème (même si en réalité je n'y comprends rien à ce code que tu as mis car je suis novice en VBA ce qui m'intéressait c'est le résultat).

Re,
Dans votre macro "vide_fichier" il y a des noms de feuilles inconnus.
"lignes factures" au lieu de probablement "LISTE DES FACTURES"
"Entrées" n'a pas de feuille correspondante.

De plus lorsqu'on réinitialise un fichier il est bon de demander confirmation au demandeur pour éviter les aneries.
Donc on peut faire :
VB:
Sub vide_fichier()
    Rep = MsgBox("Voulez vous vraiment réinitialiser ce fichier ?" & Chr(10) & _
                "Cela durera quelques secondes.", vbYesNo, vbCritical)
    If Rep = vbNo Then Exit Sub
    Sheets("LISTE DES FACTURES").[a2:f1000,i2:i1000].ClearContents
    Sheets("REGLEMENTS").[h2:h1000,e4:e1000].ClearContents
    Sheets("STOCK PRODUITS").[j7:j1000,m7:m1000].ClearContents
    'Sheets("Entrées").[f2:f1000,a2:c1000].ClearContents
    MsgBox "Traitement terminé", vbInformation
End Sub
La ligne de "Entrées" est en commentaires, à rectifier.

NB : pour les MSGBOX il y a un très bon tuto sur toutes les possibilités :
Vous avez aussi un petit outil pour construire graphiquement le msgbox, et il vous donne le code à mettre dans le VBA :
Bonsoir mon cher Sylvanu et merci pour ta proposition qui a aussi bien fonctionné même si j'ai préféré le code de job 75 qui était beaucoup plus court ce qui facilite les manipulations à venir...

Merci pour tes remarques en général et ta proposition sur la macro "vide fichier" qui fonctionne déjà à merveille.

Le logiciel étant en développement, je vous reviens très bientôt pour d'autres petits problèmes de code.

Bonne soirée à toi
 
Bonjour Olivier,
Il me semble qu'il y ait pb dans vos sub de boutons :
VB:
Private Sub BtnimprimerFactures_Click()
Sheets(Me.BtnimprimerFactures.Caption).Select
'Feuil9.Select

End Sub
Le 1er Sheets(x).select est correct mais le second renvoie à une autre feuille.
Il suffit de le supprimer.
PJ à tester.

( NB : Vous avez des références circulaires qu'il vaudrait mieux résoudre )
Merci pour ce retour.

Je ne sais pas comment y procéder ne serait-ce que pour détecter les cellules concernées

Peux-tu m'aider stp à supprimer ces références circulaires ?

Merci
 
- 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

Retour