[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
Salut,

j'ai un petit problème d'affectation:

N = Right(Cells(ligne, 2).Value, 3)
Sheets(Cells(ligne, 1).Value).Shapes(Cells(ligne, 2).Value).OnAction = "SELECTION_TRONCON(N)"

Le débogage me donne une erreur 1004: Cette formule est trop compliquée pour être affectée à un objet

En fait j'ai une macro qui doit affecter une autre macro (SELECTION_TRONCON(N)) à un objet en fonction du numéro de tronçon contenu en fin de cellule (ligne,2).

Quelqu'un saurait-il comment je peux modifier la syntaxe pour que ça passe svp ?

Merci d'avance
A voir également:

6 réponses

Utilisateur anonyme
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.
3
Salut,

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
0
Utilisateur anonyme > HKLM
5 janv. 2009 à 21:07
re :

Voilà, la chaine de commande devrait ressembler a ceci :

Sub Test()

    Dim Chaine As String
    Dim N As Long, J As Long
    
    N = 2: J = 5
    
    Chaine = "'SELECTION_TRONCON" & "(" & N & "," & J & ")'"

    MsgBox Chaine
    
End Sub
'


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
0
HKLM > Utilisateur anonyme
6 janv. 2009 à 10:30
Merci Lupin,
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.
0
Utilisateur anonyme > HKLM
6 janv. 2009 à 13:30
re:

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
0
HKLM > Utilisateur anonyme
12 janv. 2009 à 09:33
Pour faire bref voilà la logique du code.

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
0
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+
0
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
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 ! ;-)
0
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
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
0
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
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.
0
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
0
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
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 !
0
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
Salut,

je n'ai toujours pas trouvé de solution à ce problème, alors si qqun à une idée, je suis preneur...

Merci d'avance ! ;-)
0
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.
0

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
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 !
0
bonjour, j'ai un problème, je lance les fichier .xls en double clic sur la souri mais ils ne s'ouvrent pas, je doit passer obligatoirement par lancer l'excel et fichier, ouvrir. sachant que les autres fichiers *.doc etc s'ouvrent automatiquement par double clic
merci
0