[Excel vba] Pb affectation macro -> objet
Résolu/Fermé
xjl
Messages postés
232
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
12 juin 2007
-
18 avril 2007 à 14:23
Utilisateur anonyme - 13 janv. 2009 à 14:47
Utilisateur anonyme - 13 janv. 2009 à 14:47
A voir également:
- Cette formule est trop compliquée pour être affectée à un objet
- Formule excel pour additionner plusieurs cellules - Guide
- Formule si et - Guide
- Vente objet occasion entre particulier - Guide
- Formule excel moyenne - Guide
- Formule excel - Guide
6 réponses
Utilisateur anonyme
30 avril 2007 à 14:03
30 avril 2007 à 14:03
Bonjour,
une histoire de syntaxe !
la ligne :
Sheets(Cells(ligne, 1).Value).Shapes(Cells(ligne, 2).Value).OnAction = "SELECTION_TRONCON(N)"
devrait se lire :
Sheets(Cells(ligne, 1).Value).Shapes(Cells(ligne, 2).Value).OnAction = "'SELECTION_TRONCON" & "(" & """" & N & """" & ")'"
voici un exemple fonctionnel dans ma routine :
'Création de la chaine de commande pour la propriété VBA <.OnAction>
ChaineCommande = "'CreationPageBarreOutils " & "(" & """" & NumPage & """" & ")'"
'Affectation de la chaine de commande à la propriété VBA <.OnAction>
Application.CommandBars("Bloc").Controls(Boucle).OnAction = ChaineCommande
Bon courage
Lupin.
une histoire de syntaxe !
la ligne :
Sheets(Cells(ligne, 1).Value).Shapes(Cells(ligne, 2).Value).OnAction = "SELECTION_TRONCON(N)"
devrait se lire :
Sheets(Cells(ligne, 1).Value).Shapes(Cells(ligne, 2).Value).OnAction = "'SELECTION_TRONCON" & "(" & """" & N & """" & ")'"
voici un exemple fonctionnel dans ma routine :
'Création de la chaine de commande pour la propriété VBA <.OnAction>
ChaineCommande = "'CreationPageBarreOutils " & "(" & """" & NumPage & """" & ")'"
'Affectation de la chaine de commande à la propriété VBA <.OnAction>
Application.CommandBars("Bloc").Controls(Boucle).OnAction = ChaineCommande
Bon courage
Lupin.
salut xlj,
je pense que tu pourrais utiliser dans ta macro la méthode Select Case afin de déterminer les case (valeur ligne,2). En fonction de ces valeur tu appelerais la macro concernée avec la méthode Call + nom de macro.
cordialement
seb
a+
je pense que tu pourrais utiliser dans ta macro la méthode Select Case afin de déterminer les case (valeur ligne,2). En fonction de ces valeur tu appelerais la macro concernée avec la méthode Call + nom de macro.
cordialement
seb
a+
xjl
Messages postés
232
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
12 juin 2007
183
19 avril 2007 à 08:09
19 avril 2007 à 08:09
En effet c'est possible, le seul problème c'est que ma macro affecte une macro à des shapes, et que j'en ai qq centaines, c'est-à dire que si j'utilise cette méthode, il me faudra une macro par shape alors que je voudrais affecter une même macro à toutes les shapes qui prendrait comme variable la fin du nom de la shape... Je ne sais pas si c'est très clair ?!
Merci quand même et toute nouvelle idée sera la bienvenue ! ;-)
Merci quand même et toute nouvelle idée sera la bienvenue ! ;-)
masterseb
>
xjl
Messages postés
232
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
12 juin 2007
20 avril 2007 à 01:14
20 avril 2007 à 01:14
Salut,
je crois avoir compris en partie ton problème. J'ai fait un exemple qui pourra peut-être te servir. Il prend 2 minute à réaliser.
1) Dans une feuille excel, dessine 2 rectangles. En haut à gauche, tu aura Rectangle 1, et Rectangle 2 dans la barre de nom à coté de la barre de texte.
2) Dans ta cellule A1, inscrit 1
3) crée la macro suivante :
Sub selectionshape ()
A = Cells(1, 1).value
ActiveSheet.Shapes("Rectangle " & A).Select
End Sub
4) Execute ta macro. Si ta cellule A1 contient la valeur1, ton Rectangle 1 sera selectionné, s'il contient la valeur 2, ton rectangle 2 sera selectionne.
Il ne s'agit que d'une idée, j'espère qu'elle pourra t'aider. Tiens moi au courant
je crois avoir compris en partie ton problème. J'ai fait un exemple qui pourra peut-être te servir. Il prend 2 minute à réaliser.
1) Dans une feuille excel, dessine 2 rectangles. En haut à gauche, tu aura Rectangle 1, et Rectangle 2 dans la barre de nom à coté de la barre de texte.
2) Dans ta cellule A1, inscrit 1
3) crée la macro suivante :
Sub selectionshape ()
A = Cells(1, 1).value
ActiveSheet.Shapes("Rectangle " & A).Select
End Sub
4) Execute ta macro. Si ta cellule A1 contient la valeur1, ton Rectangle 1 sera selectionné, s'il contient la valeur 2, ton rectangle 2 sera selectionne.
Il ne s'agit que d'une idée, j'espère qu'elle pourra t'aider. Tiens moi au courant
xjl
Messages postés
232
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
12 juin 2007
183
>
masterseb
20 avril 2007 à 08:27
20 avril 2007 à 08:27
Merci, mais ça ne correspond pas vraiment à ce qu'il me faut.
Il faudrait que je puisse avoir sur le OnAction de mes shape la même macro, et que cette macro soit capable de détecter le nom de la shape qui vient d'être cliquée (avec un truc du genre ActiveShape.Name, mais ça ne marche pas) pour affecter le numéro du tronçon au paramètre N pour ensuite lancer la macro SELECTION_TRONCON(N).
En fait le principal problème, c'est que je ne connais pas la syntaxe qui peut me renvoyer le nom de la shape qui vient d'être cliquée, pour le reste ça va aller tout seul !
Merci d'avance pour vos idées.
Il faudrait que je puisse avoir sur le OnAction de mes shape la même macro, et que cette macro soit capable de détecter le nom de la shape qui vient d'être cliquée (avec un truc du genre ActiveShape.Name, mais ça ne marche pas) pour affecter le numéro du tronçon au paramètre N pour ensuite lancer la macro SELECTION_TRONCON(N).
En fait le principal problème, c'est que je ne connais pas la syntaxe qui peut me renvoyer le nom de la shape qui vient d'être cliquée, pour le reste ça va aller tout seul !
Merci d'avance pour vos idées.
Salut xlj, j'ai enfin compris ce que tu voulais, j'ai fait des test et chez moi, ça marche. En fait l'erreur 1004 est générée par la variable (N) de ta Macro SELECTION_TRONCON car le OnAction n'accepte que du texte entre gillemets.
alors j'ai essayé les modification suivantes :
1) Déclare ta variable N en Public (Public N >>> tout au dessus)
2) pour le OnAction, remplace "SELECTION_TRONCON(N)" par "ShapeClick"
3)crée une macro intermédiaire appelée ShapeClick comme suit :
Sub ShapeClick()
N = Right(Cells(ligne, 2).Value, 3)
Call SELECTION_TRONCON(N)
End Sub
pour vérifier, rajoute temporairement cette ligne dans ta macro SELECTION_TRONCON(N) :
j = Worksheets(1).Shape(N).Name 'adapte à ton code si nécessaire
msgbox j
Contacte moi si problème, je peux t'affirmer que lorsque je clique chez moi sur un shape, il me renvoie son nom.
a+ seb
alors j'ai essayé les modification suivantes :
1) Déclare ta variable N en Public (Public N >>> tout au dessus)
2) pour le OnAction, remplace "SELECTION_TRONCON(N)" par "ShapeClick"
3)crée une macro intermédiaire appelée ShapeClick comme suit :
Sub ShapeClick()
N = Right(Cells(ligne, 2).Value, 3)
Call SELECTION_TRONCON(N)
End Sub
pour vérifier, rajoute temporairement cette ligne dans ta macro SELECTION_TRONCON(N) :
j = Worksheets(1).Shape(N).Name 'adapte à ton code si nécessaire
msgbox j
Contacte moi si problème, je peux t'affirmer que lorsque je clique chez moi sur un shape, il me renvoie son nom.
a+ seb
xjl
Messages postés
232
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
12 juin 2007
183
23 avril 2007 à 08:34
23 avril 2007 à 08:34
Salut,
j'ai déjà testé quelquechose d'équivalent, mais le seul problème c'est que la variable ligne n'est pas incrémentée ici, donc la cellule dans laquelle on ira chercher le nom de la shape qui viendra d'être cliquée n'aura rien à voir avec cette shape !
Je vois bien comment lancer une macro à partir du clic sur l'une des shape, mais il me parait plus compliqué de récupérer le nom de la shape par laquelle vient d'être lancée la macro...
Merci pour tes efforts !
j'ai déjà testé quelquechose d'équivalent, mais le seul problème c'est que la variable ligne n'est pas incrémentée ici, donc la cellule dans laquelle on ira chercher le nom de la shape qui viendra d'être cliquée n'aura rien à voir avec cette shape !
Je vois bien comment lancer une macro à partir du clic sur l'une des shape, mais il me parait plus compliqué de récupérer le nom de la shape par laquelle vient d'être lancée la macro...
Merci pour tes efforts !
xjl
Messages postés
232
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
12 juin 2007
183
26 avril 2007 à 15:37
26 avril 2007 à 15:37
Salut,
je n'ai toujours pas trouvé de solution à ce problème, alors si qqun à une idée, je suis preneur...
Merci d'avance ! ;-)
je n'ai toujours pas trouvé de solution à ce problème, alors si qqun à une idée, je suis preneur...
Merci d'avance ! ;-)
J'avais le même problème que toi, xjl, et je viens de trouver la solution à l'instant :
Depuis chacun de tes shapes, il te suffit d'appeller la même macro, sans paramètre.
Ensuite, dans cette macro tu peux retrouver l'identité du shape appellant grâce à la variable "Application.Caller".
Si le propriété Name de tes shapes est bien renseignée, tu devrais pouvoir appeller la bonne macro parametrée à partir de ça.
Bon courage, en esperant que ca te débloque comme ça l'a fait pour moi.
Depuis chacun de tes shapes, il te suffit d'appeller la même macro, sans paramètre.
Ensuite, dans cette macro tu peux retrouver l'identité du shape appellant grâce à la variable "Application.Caller".
Si le propriété Name de tes shapes est bien renseignée, tu devrais pouvoir appeller la bonne macro parametrée à partir de ça.
Bon courage, en esperant que ca te débloque comme ça l'a fait pour moi.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
xjl
Messages postés
232
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
12 juin 2007
183
2 mai 2007 à 08:44
2 mai 2007 à 08:44
Salut,
vraiment bien vu le coup du Application.Caller qui revoit directement le nom de la shape !!
Merci à toi aussi Lupin, je suis sûr que ta solution fonctionne aussi mais c'est un peu plus compliqué à mettre en place...
Merci à tous !
vraiment bien vu le coup du Application.Caller qui revoit directement le nom de la shape !!
Merci à toi aussi Lupin, je suis sûr que ta solution fonctionne aussi mais c'est un peu plus compliqué à mettre en place...
Merci à tous !
5 janv. 2009 à 19:50
Je voudrais faire la même chose avec 2 paramètres mais ça marche pas. Je ne comprends pas trop pourquoi.Ca marche avec 1 mais pas avec 2. Est ce que c'est possible? Tu pourrais m'écrire la chaîne de commande STP. Je t'avouerais être un peu perdu avec tous ces guillements. Toute explication supplémentaire est la bienvenue:-)
Merci d'avance
5 janv. 2009 à 21:07
Voilà, la chaine de commande devrait ressembler a ceci :
Le nom de la fonction, paramètres inclus doit être d'abord entre simple guillement (quote)
et le tout entre double guillemets.
C'est pourquoi le syntaxe débute ainsi :
Chaine = " ' SEL...
Lupin
6 janv. 2009 à 10:30
Ta solution marche bien avec l'instruction MsgBox mais quand j'essaie d'affecter la chaine à un bouton via .OnAction ça ne marche pas et j'obtiens "Impossible de trouver la macro". J'imagine qu'il faut ajouter des séries de guillemet """" quelque part mais je ne sais pas trop où?
voici le code:
Sub ...
H As Integer
W As Integer
...
.OnAction='"affectemacro" & "(" & H & "," & W &")'"
end sub
Je sais plus trop quoi faire pour y parvenir. Merci de ton aide.
6 janv. 2009 à 13:30
La macro que tu appelle [ affectemacro ] est-elle dans un autre module ?
Cette macro est-elle déclaré en [ Private ] ?
Sinon, il faudrait que tu colle l'instruction complète afin que je puisse la
faire fonctionner. J'ai découvert cette syntaxe dans mon bouquin il y a
quelques années, mais je n'utilisais qu'un seul argument.
Étant donnée qu'une fonction ou routine peuvent avoir plus d'un
argument, il est clair que cela devrait fonctionner.
Lupin
12 janv. 2009 à 09:33
J'ai une macro qui effectue différents calculs à partir d'une plage de données (Range) et d'un entier.
Je dois, via un bouton, pouvoir dupliquer le tableau contenant les données et ajouter pour chaque nouvelle occurence un bouton pour pouvoir executer la macro précédent (calculs)
Voici le code en question
La macro calcul
Public Sub compute_delivery(my_cells As Range, market As Integer)
Dim...
Ligne1= Ligne2+1 'formules en réalité plus compliqué en réalité
Ligne2= LIgne3*1/2
...
End Sub
La partie ajout d'un bouton (partie délicate):
Sub Add_button_w_macro(PositionCell As Range, Txt As String, Data_macro As Range)
Const H As Integer = 51
Const W As Integer = 100
'
'
With ActiveSheet.Shapes.AddShape(msoShapeActionButtonCustom, PositionCell.Left + 6, PositionCell.Top + PositionCell.Height + 6, W, H)
With .Fill
.ForeColor.RGB = RGB(37, 64, 97)
.TwoColorGradient msoGradientHorizontal, 1
End With
With .TextFrame
.MarginBottom = 5
.MarginLeft = 5
.MarginRight = 5
.MarginTop = 5
.Characters.Text = Txt
'"Click here to" & Chr(10) & "realize schedule" & Chr(10) & " -MPR- "
.Characters.Font.Color = RGB(0, 0, 0)
.Characters.Font.Bold = True
.HorizontalAlignment = xlHAlignCenter
.VerticalAlignment = xlVAlignCenter
End With
.OnAction = "'compute_delivery " & "(" & """" & Data_macro & """" & ")'" 'marche bien avec un paramètre
.OnAction = "'compute_delivery (""Data_macro"",""1"")'" 'marche pas avec un 2eme
End With
End Sub