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 :

Private sub image_click sur toutes les images [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut Private sub image_click sur toutes les images
    Bonjour,

    J'ai une feuille avec une image par service quand je clic sur l'image le tableau associé apparait/disparait, j'ai fait le code pour un image:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Imageacc_Click()
    Application.ScreenUpdating = False
    If Shapes("Image tdb").Visible = True Then
        Shapes("Image tdb").Visible = Not Shapes("Image tdb").Visible
        Sheets("Synthèse v2").Rows("5:32").Hidden = False
    Else
        Sheets("Synthèse v2").Rows("5:32").Hidden = True
        Sheets("Synthèse v2").Range("acc").EntireRow.Hidden = False
        Shapes("Image tdb").Visible = Not Shapes("Image tdb").Visible
    End If
    Application.ScreenUpdating = True
    End Sub
    Plutôt que de dupliquer ce code pour chaque service j'aimerais savoir si je peux faire un code générique qui se lancerait sur toutes les images de ma feuille.
    C'est possible ?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Premier point : ne pas faire de test If pour contrôler un Booléen.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Imageacc_Click()
    Application.ScreenUpdating = False
    If Shapes("Image tdb").Visible = True Then
        Shapes("Image tdb").Visible = Not Shapes("Image tdb").Visible
        Sheets("Synthèse v2").Rows("5:32").Hidden = False
    Else
        Sheets("Synthèse v2").Rows("5:32").Hidden = True
        Sheets("Synthèse v2").Range("acc").EntireRow.Hidden = False
        Shapes("Image tdb").Visible = Not Shapes("Image tdb").Visible
    End If
    Application.ScreenUpdating = True
    End Sub
    Devient donc (sauf erreur de ma part...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Imageacc_Click()
    Dim b As Boolean
    Application.ScreenUpdating = False
      b = Shapes("Image tdb").Visible
      Shapes("Image tdb").Visible = Not b
      Sheets("Synthèse v2").Rows("5:32").Hidden = Not b
      Sheets("Synthèse v2").Range("acc").EntireRow.Hidden = b
    Application.ScreenUpdating = True
    End Sub
    Il est par conséquent facile d'en faire une Sub paramétrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub WhenClic(Image As Shape, strRows As String, strRng As String)
    Dim b As Boolean
    Application.ScreenUpdating = False
      b = Image.Visible
      Image.Visible = Not b
      Sheets("Synthèse v2").Rows(strRows).Hidden = Not b
      Sheets("Synthèse v2").Range(strRng).EntireRow.Hidden = b
    Application.ScreenUpdating = True
    End Sub
    Que tu appelles depuis chaque procédure événementielles ImageXXX_Click() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Imageacc_Click()
    WhenClic Shapes("Image tdb"), "5:32", "acc"
    End Sub
    Ou sinon, via un module de Classe...

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Merci pijaku pour la réponse, je prend bonne note de ta remarque sur le booléen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Imageacc_Click()
    WhenClic Shapes("Image tdb"), "5:32", "acc"
    End Sub
    Pardon c'était clair pour moi, mais je ne l'ai pas retransmis dans mon premier message, la seule variable qui change dans le code c'est le "acc" qu'on retrouve dans le nom de l'image. l'image est toujours la même c'est une copie avec liaison et je cache tout sauf la partie qui concerne le service choisi

    Citation Envoyé par pijaku Voir le message
    Que tu appelles depuis chaque procédure événementielles ImageXXX_Click() :
    C'est ce que je cherche a évité, car il y a beaucoup de services et aussi pour ma culture générale.

    Ce que j'aimerais faire dans l'idéal (en prenant en compte tes modifs) c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Image*_Click()
    WhenClic Shapes("Image tdb"), "5:32", right(image.name,3)
    End Sub
    Merci aussi Menhir.
    Citation Envoyé par Menhir
    Qu'est-ce que tu appelles un "service" (en terme Excel) ?
    En terme d'Excel, il y a le nom de l'image: imageXXX, et une plage nommée XXX, où XXX est le nom de du service

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Déjà, ton code peut se simplifier ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Imageacc_Click()
        Sheets("Synthèse v2").Rows("5:32").Hidden = Not Shapes("Image tdb").Visible
        Shapes("Image tdb").Visible = Not Shapes("Image tdb").Visible
        If Shapes("Image tdb").Visible Then Sheets("Synthèse v2").Range("acc").EntireRow.Hidden = False
    End Sub
    Citation Envoyé par halaster08 Voir le message
    J'ai une feuille avec une image par service
    Qu'est-ce que tu appelles un "service" (en terme Excel) ?

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Citation Envoyé par halaster08 Voir le message
    j'aimerais savoir si je peux faire un code générique qui se lancerait sur toutes les images de ma feuille.
    Oui en utilisant   Application.Caller   pour récupérer le nom de l'image appelante …

    ___________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Merci Marc-L.
    Problème résolu.

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Comme j'ai aussi eu un doute sur le code présenté initialement, si tu veux bien poster ton code final …

  8. #8
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    Comme j'ai aussi eu un doute sur le code présenté initialement, si tu veux bien poster ton code final …
    Le code initial fonctionnait comme prévu même si il était perfectible.

    Le code final:
    J'ai repris celui de pijaku, avec application.caller pour récupérer le nom de la plage à afficher
    Et j'ai affecté la macro ci-dessous à mes images:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub tab_image()
    WhenClic Sheets("TdB").Shapes("Image tdb"), "5:32", Right(Application.Caller, Len(Application.Caller) - 6)
    End Sub
     
    Private Sub WhenClic(Image As Shape, strRows As String, strRng As String)
    Dim b As Boolean
    Application.ScreenUpdating = False
      b = Image.Visible
      Image.Visible = Not b
      Sheets("Synthèse v2").Rows(strRows).Hidden = Not b
      Sheets("Synthèse v2").Range(strRng).EntireRow.Hidden = b
    Application.ScreenUpdating = True
    End Sub

  9. #9
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Effectivement là il n'y a plus rien à dire !

    Mais pour chipoter, si tu n'es pas l'utilisateur final, au lieu d'inscrire en dur le nom des feuilles de calculs
    utilise plutôt leur CodeName, évitant ainsi un souci en cas de feuille renommée …

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

Discussions similaires

  1. replace() sur toutes les variables d'une Private Sub
    Par wulfram dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/08/2016, 15h48
  2. [PPT-2007] Insertion d'une image sur toute les slides.
    Par kahoerre dans le forum VBA PowerPoint
    Réponses: 4
    Dernier message: 09/06/2012, 06h43
  3. [CS4] SWF externe qui se répercute sur toute les images ?
    Par Apoulit dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 16/08/2010, 23h47
  4. Image de fond complète sur toutes les pages
    Par Faleya dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 23/07/2009, 12h30

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