Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/09/2011, 17h33   #1
Invité de passage
 
Inscription : juin 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Par défaut Affecter une macro à une image créée en VBA

Bonjour à toutes et à tous,

je sollicite l'aide précieuse de la communauté pour le problème suivant:

-par macro, je copie-colle une image qui me sert de bouton de navigation dans une feuille Excel;
-après avoir créée et positionnée cette image comme souhaité dans la feuille Excel, je souhaite affecter une macro appelée ola qui soit activée quand on clique sur l'image.

les images sont créées dynamiquement d'où l'utilisation d'un compteur "j"

j'ai essayé avec .OnAction comme ci-dessous mais je récuère une erreur 1004
Code :
ActiveSheet.Shapes("Image" & j).OnAction = "ola"
A l'aide !! je ne trouve pas de solution à mon problème

Merci d'avance
lamina008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 18h04   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 898
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 898
Points : 7 183
Points : 7 183
Bonjour,

Ci dessous une solution, mais en utilisant l'objet image (activeX) et non shape

J'utilise VBComponent pour créer la macro évènement click de l'objet image

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub AjouteMacro(NomObject As String)
 
 
Dim VbMod As VBComponent
 
Dim i As Integer
 
Set VbMod = ThisWorkbook.VBProject.VBComponents.Item("Feuil1")
 
 
                                '#################
                                '### Ajoute le code ###
                                '#################
 
 
With VbMod.CodeModule
    i = .CountOfLines
    .InsertLines i + 1, "Private Sub " & NomObject & "_Click()"
    .InsertLines i + 2, "   Call Feuil1.m1 "
    .InsertLines i + 3, "End Sub"
End With
 
End Sub
On appel cette macro en lui fournissant le nom de l'objet
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/09/2011, 20h14   #3
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonsoir,

Ce qui plus bas fonctionne chez moi (Excel 2007), le nom du Shape est passé en argument. Je vois que tu n'as pas mis d'espace entre "Image" et le numéro, c'est peut être de là que vient l'erreur :
Code :
1
2
 
ActiveSheet.Shapes("Image" & j).OnAction = "ola"
au lieu de :
Code :
1
2
 
ActiveSheet.Shapes("Image " & j).OnAction = "ola"
Teste ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
Sub Image()
 
    Dim Shp As Shape
    Dim I As Integer
 
    I = 1
    Set Shp = ActiveSheet.Shapes("Image " & I)
 
    Shp.OnAction = "'AfficherNom""" & Shp.Name & "'"
 
End Sub
 
 
Sub AfficherNom(NomShape As String)
 
    MsgBox NomShape
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/09/2011, 22h37   #4
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Quel est ton code de création d'image .?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/09/2011, 10h39   #5
Invité de passage
 
Inscription : juin 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
rebonjour à tous les 3,

merci beaucoup pour vos messages et vos suggestions de solutions.

Pour répondre à la question de bbil,
je copie colle une image (Contrôle ActiveX) préexistante dans la feuille et je la positionne par code VBA à l'endroit souhaité dans la feuille.

J'ai essayé les codes de JP et Theze.

-Pour la proposition de code de jpfontaine :

j'ai du au préalable activer "Microsoft Visual Basic for Applications Extensibility 5.3."
Y-a-t-il d'autres références à activer ?"
J'ai copié-collé le code dans un Module mais la ligne de code suivante pose problème
Set VbMod = ThisWorkbook.VBProject.VBComponents.Item("Feuil1")

comme test, j'ai essayé un Msgbox pour récupérer la propriété Name de ThisWorkbook.VBProject.VBComponents.Item("Feuil1")
mais ca ne marche pas.

Des suggestions jp ?

-Pour la proposition de Thèze,

j'ai essayé d'intégrer ton code mais je récupère une erreur 1004.
lamina008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 10h49   #6
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 898
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 898
Points : 7 183
Points : 7 183
Je te joint un fichier exemple
Affecter une macro par code (VBCOMPONENT).xls
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/09/2011, 10h54   #7
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Au début tu parle de Shape avec OnAction et maintenant tu parle de contrôle ActiveX, ce n'est pas la même chose.
En double cliquant sur ton image, tu te retrouve dans le module de la feuille où se trouve le contrôle image avec le squelette de l'évènement Click.
Il te suffit de "pré écrire" le code dans le module et une fois l'image collée, si tu clique sur cette dernière la proc évènementielle sera exécutée.

Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/09/2011, 18h34   #8
Invité de passage
 
Inscription : juin 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
rebonjour,

et merci de vos précédentes réponses:

Pour Jérôme, j'ai essayé de faire la macro du fichier que tu m'as envoyé et ça n'a pas marché sur mon poste !
bug au meme endroit:
Code :
Set VbMod = ThisWorkbook.VBProject.VBComponents.Item("Feuil1")
Y-at-il des références autres que Microsoft Visual Basic for Applications Extensibility 5.3. à activer ???

Pour Thèze,

je ne suis pas expert enVBA malheureusement, et j'ai encore des soucis pour définir proprement les objects que je manipule, dsl!
Pour ta proposition de "pré-écriture" du code, ca ne répond pas à mon problème car je ne sais pas combient d'images seront crées par l'utilisateur lors de l'utilisation du workbook.

Si vous avez d'autres suggestions, je suis preneur !
lamina008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 21h05   #9
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 898
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 898
Points : 7 183
Points : 7 183
Juste pour etre sur.

Ce code fait référence à la Feuil1. as tu une feuille de ce nom?
Code :
Set VbMod = ThisWorkbook.VBProject.VBComponents.Item("Feuil1")
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/09/2011, 21h20   #10
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Citation:
Envoyé par lamina008 Voir le message
....
Pour répondre à la question de bbil,
je copie colle une image (Contrôle ActiveX) préexistante dans la feuille et je la positionne par code VBA à l'endroit souhaité dans la feuille.
...
on as pas vu ce code VBA ....
toutes tes images doivent-elles appeler le même code ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/09/2011, 10h04   #11
Invité de passage
 
Inscription : juin 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Pour Jérôme:

oui j'ai bien une feuille qui s'appelle "Feuil1"

Pour bbil :
voici ma macro annotée, si ça peut aider à voir l'origine du problème

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Sub scenario1()
 
' scenario1 Macro
Dim i As Integer  'enregistre le N° de Ligne initial avec bouton Enregistrer
Dim j As Integer
 
Application.ScreenUpdating = False
 
    i = Range("A1").Value  ' enregistre la ligne contenant les liens avec les cellules de résultats
 
    Rows(i - 1 & ":" & i - 1).Select
    Selection.Copy
    Rows(i & ":" & i).Select
    Selection.Insert Shift:=xlDown
    Range("B" & i + 1 & ": C" & i + 1).Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("B" & i & ":C" & i).Select
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
 
    '''''''''''''''''''''''''''''''''''
    'Image pré-existante est sélectionnée puis copiée
    Worksheets("Feuil1").Shapes("Image3").Select
    Selection.Copy
 
      '''''''''''''''''''''''''''''''''''
    'Copie de l'image pré-existante est collée
    Range("D" & i).Select
    ActiveSheet.Paste
 
    j = ActiveSheet.Shapes.Count - 1
 
          '''''''''''''''''''''''''''''''''''
    'Copie de l'image pré-existante est positionnee
 
    ActiveSheet.Shapes("Image" & j).Left = Range("D" & i).Left + Columns("D").ColumnWidth
    ActiveSheet.Shapes("Image" & j).Top = Range("D" & i).Top + 5
 
    i = i + 1
 
    Range("A1").Value = i
 
    Application.ScreenUpdating = True
End Sub
Salut Jérôme,

as tu une explication pour le bug de ton fichier excel d'exemple sur mon poste ?
(j'ai essayé sur mes versions d'Excel 2003 et 2007°

merci d'avance pour ta réponse et vive les contributeurs !
lamina008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 11h00   #12
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 898
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 898
Points : 7 183
Points : 7 183
Peux tu expliquer ce qui ne fonctionne pas. Message d'erreur et ligne qui bloque
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/09/2011, 15h54   #13
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Il est possible d'utiliser un module de classe afin d'affecter la même proc à tous les contrôles Image, ensuite aiguiller le traitement dans le module standard.
Pour le test, ajouter un module de classe appelé "ClsImage" puis mettre ce code dans le module ClsImage :
Code :
1
2
3
4
5
6
7
8
 
Public WithEvents GroupeImages As Image
 
Private Sub GroupeImages_Click()
 
   Traitement GroupeImages.Name
 
End Sub
Ensuite, mettre ce code dans un module standard :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
'le module de classe se nomme "ClsImage"
Dim MesImages() As New ClsImage
 
Private Sub TblImage()
 
    Dim OLE_Objet As OLEObject
    Dim Img As MSForms.Image
    Dim i As Integer
 
    For Each OLE_Objet In Worksheets("Feuil1").OLEObjects
 
        'si dans le nom du contrôle se trouve le mot Image
        If InStr(OLE_Objet.Name, "Image") <> 0 Then
 
            i = i + 1
 
            'affecte à la variable Img l'objet afin de pouvoir
            'utiliser ses propriétés propre. On est obligé (je pense)
            'd'utiliser la collection "OLEObjects" de la feuille
            'car elle ne comporte pas de collection Images
            Set Img = OLE_Objet.Object
 
            ReDim Preserve MesImages(1 To i)
 
            'stocke le contrôle Image en cours dans le tableau
            Set MesImages(i).GroupeImages = Img
 
        End If
 
    Next OLE_Objet
 
End Sub
 
Sub Traitement(NomImage As String)
 
   'Ici le traitement voulu en fonction du nom de l'image cliquée...
   MsgBox "L'image qui a été cliqué est : " & NomImage
 
End Sub
Puis, lancer la proc "TblImage" (placer le curseur dans le code et F5). Les contrôles images ne doivent pas être en mode création. Une fois ceci fait, tester en cliquant sur les différentes image, un message doit apparaître avec le nom de l'image cliquée.
J'ai fait un test en appelant "TblImage" en fin de ton code mais ceci ne fonctionne pas tout le temps, je soupçonne un problème de délai.

Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/09/2011, 10h18   #14
Invité de passage
 
Inscription : juin 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Bonjour,

pour Jérôme:
la ligne qui pose problème à l' exécution du code est a la ligne 9 dans l'affectation de la variable VbMod

Code :
Set VbMod = ThisWorkbook.VBProject.VBComponents.Item("Feuil1")
pour Hervé:
merci pour cette nouvelle proposition! je ne suis pas assez expert en VBA pour avoir eu a creer des modules de classe, c'est une super occasion.

je vais essayer d'integrer votre code.

Merci encore pour votre aide précieuse a tous les 2
lamina008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 14h58   #15
Invité de passage
 
Inscription : juin 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Bonjour,

Pour Thèze,

j'ai intégré ton code, et ca a marché, merci beaucoup, je devrais pouvoir y arriver maintenant.
En plus, grace à toi, j'ai appris l'existance des modules de classe.

j'avais travaillé sur une alternative avec des Shape rectangle et OnAction avec une image en guide remplissage.
Avec les Images ActiveX, je vais pouvoir bénéficier des évènements associés, ce qui n'est pas le cas des Shapes. C'est exact ?

Pour Jérôme:
l'erreur que je récupère a l'exécution de la macro test est '1004' a la ligne 9 lors de la procédure d'affectation de la variable VbMod.

Merci à tous les 2 pour tout le temps que vous avez passé sur mon probleme

j'espere pouvoir aider a mon tour des gens

a bientot

Rémi
lamina008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 15h05   #16
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,
Citation:
Avec les Images ActiveX, je vais pouvoir bénéficier des évènements associés, ce qui n'est pas le cas des Shapes. C'est exact ?
Exact.

Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h26.


 
 
 
 
Partenaires

Hébergement Web