OVH Cloud OVH Cloud

VBA - .OnAction = "mamacro(2)" transmettre une valeur 2

10 réponses
Avatar
twinley
Bonsoir,

Je créé un menu avec 12 entrées pour lancer 12 macros.

Si je pouvais transmettre une valeur (2) ou (5) ou (8) avec la macro,
je simplifie le code avec une seule macro à éxécuter.
Sinon c'est 12 macros identiques avec des vars différentes.

Je n'ai pas trouvé de notes là-dessus.


With Application.CommandBars(1)
Set MenuMois = .Controls.Add(Type:=msoControlPopup, _
before:=.Controls.Count - 1)
End With
MenuMois.Caption = "Mois"

'Creation des sous-menus

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

Si je mets .OnAction = "montre5onglet" cela fonctionne mais pour une
macro spécifique.

Est-ce possible de transmettre une var ou bien dois-je écrire 12 macros ?

Merci pour votre aide.
--
à+twinley

10 réponses

Avatar
twinley
Je viens de trouver une info majeure de Denis Michon

Il faut encadrer l'ensemble nomProc+espace+Paramètre par des
guillemets+apostrophes et mettre le paramètre entre guillemets.

Désolé pour le dérangement. Bonsoir.

à+twinley


Bonsoir,

Je créé un menu avec 12 entrées pour lancer 12 macros.

Si je pouvais transmettre une valeur (2) ou (5) ou (8) avec la macro,
je simplifie le code avec une seule macro à éxécuter.
Sinon c'est 12 macros identiques avec des vars différentes.

Je n'ai pas trouvé de notes là-dessus.


With Application.CommandBars(1)
Set MenuMois = .Controls.Add(Type:=msoControlPopup, _
before:=.Controls.Count - 1)
End With
MenuMois.Caption = "Mois"

'Creation des sous-menus

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

Si je mets .OnAction = "montre5onglet" cela fonctionne mais pour une
macro spécifique.

Est-ce possible de transmettre une var ou bien dois-je écrire 12 macros ?

Merci pour votre aide.


Avatar
FxM
Bonsoir,

Je n'ai rien trouvé sur .onaction qui indique de pouvoir passer un argument.

Pour détourner le problème, tu pourrais simplifier la macro pour
renvoyer ensuite un argument vers une macro complète.
exemple :
bouton1 --> .onaction = "macro1"
bouton2 --> .onaction = "macro2"
bouton3 --> .onaction = "macro3"

sub macro1()
mamacro(1)
end sub
sub macro2()
mamacro(2)
end sub
sub macro3()
mamacro(3)
end sub

sub mamacro(argument)
msgbox argument
end sub

@+
FxM





Bonsoir,

Je créé un menu avec 12 entrées pour lancer 12 macros.

Si je pouvais transmettre une valeur (2) ou (5) ou (8) avec la macro,
je simplifie le code avec une seule macro à éxécuter.
Sinon c'est 12 macros identiques avec des vars différentes.

Je n'ai pas trouvé de notes là-dessus.


With Application.CommandBars(1)
Set MenuMois = .Controls.Add(Type:=msoControlPopup, _
before:=.Controls.Count - 1)
End With
MenuMois.Caption = "Mois"

'Creation des sous-menus

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

Si je mets .OnAction = "montre5onglet" cela fonctionne mais pour une
macro spécifique.

Est-ce possible de transmettre une var ou bien dois-je écrire 12 macros ?

Merci pour votre aide.


Avatar
twinley
'tain ça marche d'enfer

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "'montre5onglet ""2""'"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "'montre5onglet ""5""'"
End With

Heureusement que Denis Michon avait mis un exemple...
Merci Denis.

à+twinley


Je viens de trouver une info majeure de Denis Michon

Il faut encadrer l'ensemble nomProc+espace+Paramètre par des
guillemets+apostrophes et mettre le paramètre entre guillemets.

Désolé pour le dérangement. Bonsoir.

à+twinley



Bonsoir,

Je créé un menu avec 12 entrées pour lancer 12 macros.

Si je pouvais transmettre une valeur (2) ou (5) ou (8) avec la macro,
je simplifie le code avec une seule macro à éxécuter.
Sinon c'est 12 macros identiques avec des vars différentes.

Je n'ai pas trouvé de notes là-dessus.


With Application.CommandBars(1)
Set MenuMois = .Controls.Add(Type:=msoControlPopup, _
before:=.Controls.Count - 1)
End With
MenuMois.Caption = "Mois"

'Creation des sous-menus

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

Si je mets .OnAction = "montre5onglet" cela fonctionne mais pour une
macro spécifique.

Est-ce possible de transmettre une var ou bien dois-je écrire 12 macros ?

Merci pour votre aide.




Avatar
twinley
Bonsoir FxM

Pas mal ta solution, je n'avais pas pensé à ça.
Comme tu vas le voir, j'ai trouvé la soluce de Denis.
J'ai cherché pendant deux heures sans succés, je post ma question, je
retourne fouiller et c'est le moment de grâce. Il faut poster pour
trouver dans les archives...

Mais où vont-ils chercher tout ça ?

Merci pour ta réponse.

à+twinley

Bonsoir,

Je n'ai rien trouvé sur .onaction qui indique de pouvoir passer un
argument.

Pour détourner le problème, tu pourrais simplifier la macro pour
renvoyer ensuite un argument vers une macro complète.
exemple :
bouton1 --> .onaction = "macro1"
bouton2 --> .onaction = "macro2"
bouton3 --> .onaction = "macro3"

sub macro1()
mamacro(1)
end sub
sub macro2()
mamacro(2)
end sub
sub macro3()
mamacro(3)
end sub

sub mamacro(argument)
msgbox argument
end sub

@+
FxM






Bonsoir,

Je créé un menu avec 12 entrées pour lancer 12 macros.

Si je pouvais transmettre une valeur (2) ou (5) ou (8) avec la macro,
je simplifie le code avec une seule macro à éxécuter.
Sinon c'est 12 macros identiques avec des vars différentes.

Je n'ai pas trouvé de notes là-dessus.


With Application.CommandBars(1)
Set MenuMois = .Controls.Add(Type:=msoControlPopup, _
before:=.Controls.Count - 1)
End With
MenuMois.Caption = "Mois"

'Creation des sous-menus

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

Si je mets .OnAction = "montre5onglet" cela fonctionne mais pour une
macro spécifique.

Est-ce possible de transmettre une var ou bien dois-je écrire 12 macros ?

Merci pour votre aide.




Avatar
Alain CROS
Bonjour.

En poursuivant tes recherches, tu aurais trouvé que cette méthode n'est pas fiable car elle ne fonctionne pas sur certaine config.

Ce que je propose :

Une propriété OnAction commune à chacun des boutons de ta barre d'outils nommée "MaBarre", par Exemple "Action"

Et dans un module :

Sub Action()
MsgBox CommandBars("MaBarre").Controls(Application.Caller(1)).Caption
End Sub

Alain CROS

"twinley" a écrit dans le message de news: #
Bonsoir FxM

Pas mal ta solution, je n'avais pas pensé à ça.
Comme tu vas le voir, j'ai trouvé la soluce de Denis.
J'ai cherché pendant deux heures sans succés, je post ma question, je
retourne fouiller et c'est le moment de grâce. Il faut poster pour
trouver dans les archives...

Mais où vont-ils chercher tout ça ?

Merci pour ta réponse.

à+twinley



Avatar
twinley
Bonjour Alain CROS

J'ai trouvé, j'ai essayé, vu que ça marchait et j'ai regardé le Diner de
Cons pour rire malgré la tristesse...

Ce matin c'est la douche froide.

J'utilise un menu perso pour sélectionner 5 onglets ou 11 onglets parmi
38, pour faciliter l'ergonomie.
Cela fonctionne en XL2003 la version de développement et j'ai fais un
test en cata ce matin en XL2000, qui sera la version des utilisateurs.
Ca marche aussi en XL2000.

A l'usage, il y aura plusieurs OS de 98 à XP mais tous en XL2000,
dois-je craindre des Pb alors que le test en XL2000 sous Win Me passe
pour le fonctionnalité ?

Je suis reparti sur Google mais je n'ai pas trouvé de détails.

Par contre j'ai vu que l'auteur du tuyau était FS, je l'avais attribué
un peu rapidement à Denis Michon qui reprennait la note en citant FS.
Pour pas me tromper, merci à eux deux.

Si tu as sous le coude ou en tête les aléas que cela peut générer, peux
tu me rassurer ou dois je absolumment creuser ta solution ?

Je ne sais pas comment installer ta version ni quoi transmettre,
j'ai douze with end with, pour une commandbarpopup.

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

2 vise l'onglet2, 5 vise l'onglet5 etc.

.OnAction = "Action(5)"

J'attend ta réponse avant de pousser plus avant, car je n'ai pas essayé
ton code.

Merci pour l'avertissement

à+twinley

Bonjour.

En poursuivant tes recherches, tu aurais trouvé que cette méthode n'est pas fiable car elle ne fonctionne pas sur certaine config.

Ce que je propose :

Une propriété OnAction commune à chacun des boutons de ta barre d'outils nommée "MaBarre", par Exemple "Action"

Et dans un module :

Sub Action()
MsgBox CommandBars("MaBarre").Controls(Application.Caller(1)).Caption
End Sub

Alain CROS

"twinley" a écrit dans le message de news: #

Bonsoir FxM

Pas mal ta solution, je n'avais pas pensé à ça.
Comme tu vas le voir, j'ai trouvé la soluce de Denis.
J'ai cherché pendant deux heures sans succés, je post ma question, je
retourne fouiller et c'est le moment de grâce. Il faut poster pour
trouver dans les archives...

Mais où vont-ils chercher tout ça ?

Merci pour ta réponse.

à+twinley








Avatar
Michel Pierron
Bonjour twinley;
Tu n'as besoin que d'une seule procédure; un exemple:

Sub OnActionWithArguments()
Call DelBarre
Dim CmdBar As CommandBar, i%, shName$
Set CmdBar = CommandBars.Add
For i = 1 To 12
shName = Choose(i, "Janvier", "Février" _
, "Mars", "Avril", "Mai", "Juin" _
, "Juillet", "Août", "Septembre", "Octobre" _
, "Novembre", "Décembre")
CmdBarAdd CmdBar, ThisWorkbook, "MontreOnglet" _
, "Affiche l'onglet " & shName, 2520, shName
Next i
CmdBar.Name = "Ma barre de test"
CmdBar.Visible = True
Set CmdBar = Nothing
End Sub

Private Function CmdBarAdd(ParentCmdBar As CommandBar _
, Wbk As Workbook, ProcName$, sToolTip$, lFaceID& _
, ParamArray args() As Variant) As CommandBarButton
Dim Action$, CBtn As CommandBarButton
Dim vArg As Variant, Sep$
Set CBtn = ParentCmdBar.Controls.Add
CBtn.FaceId = lFaceID
CBtn.TooltipText = sToolTip
Action = "'" & Wbk.Name & "'!'" & ProcName
If IsArray(args) Then
For Each vArg In args
Action = Action & Sep & """" & CStr(vArg) & """"
Sep = ","
Next
End If
Action = Action & "'"
CBtn.OnAction = Action
Set CBtn = Nothing
End Function

Sub MontreOnglet(Optional Param$ = "")
MsgBox "Paramètre : " & Param, 64
'ThisWorkbook.Sheets(Param).Select
End Sub

Sub DelBarre()
On Error Resume Next
Application.CommandBars("Ma barre de test").Delete
End Sub

Note qu'avec ce principe, tu pourrais transmettre plusieurs arguments.
MP

"twinley" a écrit dans le message de
news:

Bonsoir,

Je créé un menu avec 12 entrées pour lancer 12 macros.

Si je pouvais transmettre une valeur (2) ou (5) ou (8) avec la macro,
je simplifie le code avec une seule macro à éxécuter.
Sinon c'est 12 macros identiques avec des vars différentes.

Je n'ai pas trouvé de notes là-dessus.


With Application.CommandBars(1)
Set MenuMois = .Controls.Add(Type:=msoControlPopup, _
before:=.Controls.Count - 1)
End With
MenuMois.Caption = "Mois"

'Creation des sous-menus

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

Si je mets .OnAction = "montre5onglet" cela fonctionne mais pour une
macro spécifique.

Est-ce possible de transmettre une var ou bien dois-je écrire 12 macros ?

Merci pour votre aide.
--
à+twinley


Avatar
twinley
Merci Michel

Encore un truc qui ne s'invente pas. Je vais décortiquer pour compléter
ma formation.

à+twinley

Bonjour twinley;
Tu n'as besoin que d'une seule procédure; un exemple:

Sub OnActionWithArguments()
Call DelBarre
Dim CmdBar As CommandBar, i%, shName$
Set CmdBar = CommandBars.Add
For i = 1 To 12
shName = Choose(i, "Janvier", "Février" _
, "Mars", "Avril", "Mai", "Juin" _
, "Juillet", "Août", "Septembre", "Octobre" _
, "Novembre", "Décembre")
CmdBarAdd CmdBar, ThisWorkbook, "MontreOnglet" _
, "Affiche l'onglet " & shName, 2520, shName
Next i
CmdBar.Name = "Ma barre de test"
CmdBar.Visible = True
Set CmdBar = Nothing
End Sub

Private Function CmdBarAdd(ParentCmdBar As CommandBar _
, Wbk As Workbook, ProcName$, sToolTip$, lFaceID& _
, ParamArray args() As Variant) As CommandBarButton
Dim Action$, CBtn As CommandBarButton
Dim vArg As Variant, Sep$
Set CBtn = ParentCmdBar.Controls.Add
CBtn.FaceId = lFaceID
CBtn.TooltipText = sToolTip
Action = "'" & Wbk.Name & "'!'" & ProcName
If IsArray(args) Then
For Each vArg In args
Action = Action & Sep & """" & CStr(vArg) & """"
Sep = ","
Next
End If
Action = Action & "'"
CBtn.OnAction = Action
Set CBtn = Nothing
End Function

Sub MontreOnglet(Optional Param$ = "")
MsgBox "Paramètre : " & Param, 64
'ThisWorkbook.Sheets(Param).Select
End Sub

Sub DelBarre()
On Error Resume Next
Application.CommandBars("Ma barre de test").Delete
End Sub

Note qu'avec ce principe, tu pourrais transmettre plusieurs arguments.
MP

"twinley" a écrit dans le message de
news:

Bonsoir,

Je créé un menu avec 12 entrées pour lancer 12 macros.

Si je pouvais transmettre une valeur (2) ou (5) ou (8) avec la macro,
je simplifie le code avec une seule macro à éxécuter.
Sinon c'est 12 macros identiques avec des vars différentes.

Je n'ai pas trouvé de notes là-dessus.


With Application.CommandBars(1)
Set MenuMois = .Controls.Add(Type:=msoControlPopup, _
before:=.Controls.Count - 1)
End With
MenuMois.Caption = "Mois"

'Creation des sous-menus

With MenuMois.Controls.Add(msoControlButton)
.Caption = "Janvier"
.OnAction = "montre5onglet(2)"
End With
With MenuMois.Controls.Add(msoControlButton)
.Caption = "Février"
.OnAction = "montre5onglet(5)"
End With

etc.

Si je mets .OnAction = "montre5onglet" cela fonctionne mais pour une
macro spécifique.

Est-ce possible de transmettre une var ou bien dois-je écrire 12 macros ?

Merci pour votre aide.
--
à+twinley






Avatar
Alain CROS
Bonjour

Cette méthode consiste a passer un argument à la macro déclanchée par le OnAction des boutons.
Comme évoqué précédemment, certaine config ne l'accepte pas et c'est justement le cas chez moi avec Win98 et XL2000, alors que ça
fonctionne bien avec XL97 et XL2002.

Alain CROS

"Michel Pierron" a écrit dans le message de news:
Bonjour twinley;
Tu n'as besoin que d'une seule procédure; un exemple:

Sub OnActionWithArguments()
Call DelBarre
Dim CmdBar As CommandBar, i%, shName$
Set CmdBar = CommandBars.Add
For i = 1 To 12
shName = Choose(i, "Janvier", "Février" _
, "Mars", "Avril", "Mai", "Juin" _
, "Juillet", "Août", "Septembre", "Octobre" _
, "Novembre", "Décembre")
CmdBarAdd CmdBar, ThisWorkbook, "MontreOnglet" _
, "Affiche l'onglet " & shName, 2520, shName
Next i
CmdBar.Name = "Ma barre de test"
CmdBar.Visible = True
Set CmdBar = Nothing
End Sub

Private Function CmdBarAdd(ParentCmdBar As CommandBar _
, Wbk As Workbook, ProcName$, sToolTip$, lFaceID& _
, ParamArray args() As Variant) As CommandBarButton
Dim Action$, CBtn As CommandBarButton
Dim vArg As Variant, Sep$
Set CBtn = ParentCmdBar.Controls.Add
CBtn.FaceId = lFaceID
CBtn.TooltipText = sToolTip
Action = "'" & Wbk.Name & "'!'" & ProcName
If IsArray(args) Then
For Each vArg In args
Action = Action & Sep & """" & CStr(vArg) & """"
Sep = ","
Next
End If
Action = Action & "'"
CBtn.OnAction = Action
Set CBtn = Nothing
End Function

Sub MontreOnglet(Optional Param$ = "")
MsgBox "Paramètre : " & Param, 64
'ThisWorkbook.Sheets(Param).Select
End Sub

Sub DelBarre()
On Error Resume Next
Application.CommandBars("Ma barre de test").Delete
End Sub

Note qu'avec ce principe, tu pourrais transmettre plusieurs arguments.
MP



Avatar
twinley
Bonsoir,

Je testerai la semaine prochaine sur deux pc w98-xl2000. J'ai la
solution de secours au cas ou...

à+twinley

Bonjour

Cette méthode consiste a passer un argument à la macro déclanchée par le OnAction des boutons.
Comme évoqué précédemment, certaine config ne l'accepte pas et c'est justement le cas chez moi avec Win98 et XL2000, alors que ça
fonctionne bien avec XL97 et XL2002.

Alain CROS

"Michel Pierron" a écrit dans le message de news:

Bonjour twinley;
Tu n'as besoin que d'une seule procédure; un exemple:

Sub OnActionWithArguments()
Call DelBarre
Dim CmdBar As CommandBar, i%, shName$
Set CmdBar = CommandBars.Add
For i = 1 To 12
shName = Choose(i, "Janvier", "Février" _
, "Mars", "Avril", "Mai", "Juin" _
, "Juillet", "Août", "Septembre", "Octobre" _
, "Novembre", "Décembre")
CmdBarAdd CmdBar, ThisWorkbook, "MontreOnglet" _
, "Affiche l'onglet " & shName, 2520, shName
Next i
CmdBar.Name = "Ma barre de test"
CmdBar.Visible = True
Set CmdBar = Nothing
End Sub

Private Function CmdBarAdd(ParentCmdBar As CommandBar _
, Wbk As Workbook, ProcName$, sToolTip$, lFaceID& _
, ParamArray args() As Variant) As CommandBarButton
Dim Action$, CBtn As CommandBarButton
Dim vArg As Variant, Sep$
Set CBtn = ParentCmdBar.Controls.Add
CBtn.FaceId = lFaceID
CBtn.TooltipText = sToolTip
Action = "'" & Wbk.Name & "'!'" & ProcName
If IsArray(args) Then
For Each vArg In args
Action = Action & Sep & """" & CStr(vArg) & """"
Sep = ","
Next
End If
Action = Action & "'"
CBtn.OnAction = Action
Set CBtn = Nothing
End Function

Sub MontreOnglet(Optional Param$ = "")
MsgBox "Paramètre : " & Param, 64
'ThisWorkbook.Sheets(Param).Select
End Sub

Sub DelBarre()
On Error Resume Next
Application.CommandBars("Ma barre de test").Delete
End Sub

Note qu'avec ce principe, tu pourrais transmettre plusieurs arguments.
MP