IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Affecter une macro à une image créée en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 4
    Points
    4
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Shapes("Image" & j).OnAction = "ola"
    A l'aide !! je ne trouve pas de solution à mon problème

    Merci d'avance

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ActiveSheet.Shapes("Image" & j).OnAction = "ola"
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ActiveSheet.Shapes("Image " & j).OnAction = "ola"
    Teste ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Quel est ton code de création d'image .?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    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.

  6. #6
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Je te joint un fichier exemple
    Affecter une macro par code (VBCOMPONENT).xls

  7. #7
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    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é.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  9. #9
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Juste pour etre sur.

    Ce code fait référence à la Feuil1. as tu une feuille de ce nom?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set VbMod = ThisWorkbook.VBProject.VBComponents.Item("Feuil1")

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    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 ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  12. #12
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Peux tu expliquer ce qui ne fonctionne pas. Message d'erreur et ligne qui bloque

  13. #13
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    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

  16. #16
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,
    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é.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] affecter en VBA une macro à des images
    Par pelerin98 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/06/2015, 17h49
  2. Codage pour affectation d"une macro à une image
    Par pelerin98 dans le forum Excel
    Réponses: 5
    Dernier message: 08/05/2015, 09h41
  3. [WD-2007] Affecter une macro à une image
    Par babybell dans le forum Word
    Réponses: 2
    Dernier message: 02/10/2013, 00h40
  4. [WD-2007] Affecter une macro à une image
    Par aperrottet dans le forum VBA Word
    Réponses: 2
    Dernier message: 02/02/2011, 23h48
  5. [E-07] Comment affecter par macro une macro à un objet
    Par BATISSEUR dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2009, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo