Rechercher : dans
Par :

[Excel vba] Pb affectation macro -> objet

Dernière réponse le 13 jan 2009 à 14:47:50 xjl, le 18 avr 2007 à 14:23:55 
 Signaler ce message aux modérateurs

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

Configuration: Windows XP
Internet Explorer 6.0

1

masterseb, le 18 avr 2007 à 19:29:06

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+

Répondre à masterseb

2

xjl, le 19 avr 2007 à 08:09: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 ! ;-)

Répondre à xjl

3

masterseb, le 20 avr 2007 à 01:14:49

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

Répondre à masterseb

4

xjl, le 20 avr 2007 à 08:27:41

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.

Répondre à xjl

5

masterseb, le 20 avr 2007 à 16:45:59

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

Répondre à masterseb

6

xjl, le 23 avr 2007 à 08:34:19

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 !

Répondre à xjl

7

xjl, le 26 avr 2007 à 15:37:56

Salut,

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

Merci d'avance ! ;-)

Répondre à xjl

8

ChrisKang, le 28 avr 2007 à 18:18:58
  • +1

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.
Chriskang

Répondre à ChrisKang

9

Lupin.A, le 30 avr 2007 à 14:03:53
  • +1

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.

Répondre à Lupin.A

12

HKLM, le 5 jan 2009 à 19:50:55

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

Répondre à HKLM

13

Lupin.A, le 5 jan 2009 à 21:07:50

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

Répondre à Lupin.A

14

HKLM, le 6 jan 2009 à 10:30:28

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.

Répondre à HKLM

15

Lupin.A, le 6 jan 2009 à 13:30:42

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

Répondre à Lupin.A

16

HKLM, le 12 jan 2009 à 09:33:06

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

Répondre à HKLM

17

 Lupin.A, le 13 jan 2009 à 14:47:50

Re :

Alors j'ai testé aussi pour inclure un deuxième paramètre
et ça ne fonctionne pas. Au début je croyais que la cause
était le type de bouton, le code que j'ai fournit fonctionne
avec un bouton sur une barre d'outils.

Or ton bouton était sur une feuille, alors j'ai fait des tests !

Malheureusement, je ne trouve pas la solution si elle existe.

Si j'ai du temps, je regarderai dans mon bouquin, mais je
ne promets rien puisque mes cours à l'université commence
cette semaine.

@+
Lupin

Répondre à Lupin.A

10

xjl, le 2 mai 2007 à 08:44:07

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 !

Répondre à xjl

11

bourak, le 28 mai 2007 à 16:32:23

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

Répondre à bourak