Partager via

Images, Shapes et Cie

Anonyme
2020-10-26T14:43:06+00:00

Bonjour,

Dans Excel VBA, j'aimerais insérer dans un label ou dans un bouton, une image qui est dans un classeur (l'image est donc interne). J'ai lu plusieurs réponses sur plusieurs forums, mais franchement ils ne sont pas clairs. Les variables ne sont pas déclarées et on ne sait pas donc de quels types elles sont ni ce qu'elles font. J'ai également essayé de lire les documentations de Microsoft, mais elles manquent aussi de clarté à mon sens.

Par exemple, voici ce que j'ai trouvé:

Dim f

Private Sub UserForm_Initialize()

  Set f = Sheets("photos")

  For Each s In f.Shapes

    Me.ComboBox1.AddItem s.Name

  Next

End Sub

Private Sub ComboBox1_Change()

  Set s = f.Shapes(CStr(Me.ComboBox1))

  s.CopyPicture xlScreen, xlBitmap

  With s.Parent.ChartObjects.Add(0, 0, s.Width, s.Height).Chart

    While .Shapes.Count = 0

        DoEvents

        .Paste

    Wend

    .Export "monimage.jpg", "Jpg"

    .Parent.Delete

  End With

  Me.Image1.PictureSizeMode = fmPictureSizeModeZoom

  Me.Image1.Picture = LoadPicture("monimage.jpg")

  Kill "monimage.jpg"

End Sub

Quelqu'un peut-il m'expliquer ce code en détail ou en proposer un qui soit plus clair et mieux expliqué?

La partie que je ne comprends pas c'est celle en rouge.

Merci d'avance

Microsoft 365 et Office | Installer, entrer des clés, activer | Pour la maison | Autres

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

7 réponses

  1. DanielCo 107.7K Points de réputation
    2020-10-26T18:34:07+00:00

    La structure des objets est la suivante :

    Feuille

        Shape (ChartOject= container du graphique)

            Chart (Graphique)

    Donc :

    With s.Parent.ChartObjects.Add(0, 0, s.Width, s.Height).Chart

    signifie qu'on crée un ChartObject contenant un graphique objet inclus dans la feuille de données, (contrairement au graphique d'une feuille de graphique).

    "pourquoi ajouter ".Chart" à la fin?"

    On peut le traduire en français par "créer un graphique contenu dans un chartobject". Le "With" indique que le "." se réfère  à "Chart". D'où ".Parent.Delete" = suppression du chartobject (et donc du graphique qu'il contient).

    " .Export "monimage.jpg", "Jpg"", comme "Kill" se réfère au dossier en cours, s'il n'est pas spécifié. On peut préciser ce dossier, par exemple :

    .Export "c:\temp\monimage.jpg", "Jpg"

    N'hésite pas à poser toutes les questions que tu veux.

    Daniel

    Cette réponse a-t-elle été utile ?

    1 personne a trouvé cette réponse utile.
    0 commentaires Aucun commentaire
  2. DanielCo 107.7K Points de réputation
    2020-10-26T15:38:13+00:00

    Bonjour,

    Le principe, c'est de créer une image externe à partir d'une forme présente sur la feuille. On y parvient en chargeant la forme sur un graphique (ou plus exactement dans la forme (objet "Shape") contenant un graphique (objet "Chart"), puis en exportant le chartobject (seul moyen de créer une image externe).

    Ensuite, ,on procède comme pour un fichier jpg (ou png, ou...)

    Dim f As Worksheet

    Private Sub UserForm_Initialize()

      Set f = Sheets("photos")

      For Each s In f.Shapes

        Me.ComboBox1.AddItem s.Name

      Next

    End Sub

    Private Sub ComboBox1_Change()

      Dim s As Shape

      'assigne la variable "s" à l'image choisie

      Set s = f.Shapes(CStr(Me.ComboBox1))

      'copie cette image dans le presse-papier

      s.CopyPicture xlScreen, xlBitmap

      'ajout d'un graphique de la même dimension que l'image

      With s.Parent.ChartObjects.Add(0, 0, s.Width, s.Height).Chart

        'colle l'image dans le graphique

        .Paste

        'exporte l'image au format jpg

        .Export "monimage.jpg", "Jpg"

        'delete le "chartobject

        .Parent.Delete

      End With

      'règle le contrôle image en modde agrandissement dans déformation

      ' pour s'adapter à la taille de l'image

      Me.Image1.PictureSizeMode = fmPictureSizeModeZoom

      'chargement de l'image dans le contrôle

      Me.Image1.Picture = LoadPicture("monimage.jpg")

      'suppression du fichier externe

      Kill "monimage.jpg"

    End Sub

    Cordialement.

    Daniel

    Cette réponse a-t-elle été utile ?

    1 personne a trouvé cette réponse utile.
    0 commentaires Aucun commentaire
  3. Anonyme
    2020-10-26T23:06:56+00:00

    Merci pour toutes ces précisions. Ca m'a vraiment aidé. Très peu d'articles sont aussi précis!

    Voici un schéma que j'ai fait à partir des explications et de ce que j'ai cru comprendre. Est-ce qu'on peut résumer les choses ainsi?

    Le chartObject contient le Chart qui contient le Shape? Si j'ai bien lu un Chart, c'est un graphique (ou un "dessin") incorporé dans une feuille de données ou une feuille de graphique (histogrammes, courbes, etc. dans une feuille qui ne contient que cela). Cela veut donc dire que notre Shape (formes, graphiques, contrôles ActiveX et de formulaires) est rangé dans un Chart (graphique incorporé dans une feuille de données) qui est contenu dans un ChartObject (le conteneur principal). C'est grâce à ce dernier qu'on peut créer des images à enregistrer sur le disque dur.

    Une dernière question encore:

    J'ai essayé d'adapter le code ci-dessus à mes besoins. Et voici ce que ça a donné:

    Private Sub giveATry()

        Dim feuille As Worksheet

        Dim objetShape As Shape

        Set feuille = ThisWorkbook.Sheets("Images")

        Set objetShape = feuille.Shapes("Bouton MacOS")

        objetShape.CopyPicture xlScreen, xlBitmap

        With objetShape.Parent.ChartObjects.Add(0, 0, objetShape.Width, objetShape.Height).Chart

            While .Shapes.Count = 0

               DoEvents

               .Paste

    Wend

            .Export "imageTemp.jpg", "jpg"

            .Parent.Delete

        End With

        With ToggleButton7

            .Picture = LoadPicture("imageTemp.jpg")

            .PicturePosition = fmPicturePositionCenter

        End With

    End Sub

    Dans un premier temps, j'ai omis la partie en gras. Voilà quel a été le résultat:

    Quand j'ai remis cette portion de code, j'ai obtenu ce que j'espérais:

    Je ne comprends pas pourquoi ce bout de code a fait en sorte que l'image (ici le Shape ressemblant au bouton d'un MAC) ne se charge pas et laisse à la place un vide. Est-ce que tu peux encore m'expliquer stp?

    Merci beaucoup!

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  4. Anonyme
    2020-10-26T16:38:20+00:00

    With s.Parent.ChartObjects.Add(0, 0, s.Width, s.Height).Chart

    Cette ligne veut donc dire qu'on crée un "chart" qui sera le "parent" (ou qui contiendra) l'objet shape si j'ai bien compris?

    A quoi fait référence la méthode "ChartObjects"? Est-ce que cela désigne l'ensemble des objets de type "chart" de la feuille? Et dans ce cas, cette ligne signifie-t-elle aussi qu'on est en train d'ajouter un nouvel objet "chart" à l'ensemble? Et pourquoi ajouter ".Chart" à la fin?

        .Export "monimage.jpg", "Jpg"

    Cette ligne signifie donc qu'un fichier temporaire est créé quelque part sur l'ordinateur, peut-être dans le dossier Temp. Cependant, même si ce n'est pas mon cas, ne pourrait-il pas y avoir un problème avec les droits d'accès (droits d'administration)? Serait-il possible de changer le répertoire de destination?

    Désolé avec toutes mes questions. J'ai l'impression que cela signifie que je n'ai pas bien lu les différentes documentations...

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  5. Supprimé

    Cette réponse a été supprimée en raison d’une violation de notre Code de conduite. La réponse a été signalée manuellement ou identifiée via la détection automatisée avant que l’action ne soit entreprise. Pour obtenir plus d’informations, veuillez consulter notre Code de conduite.


    Les commentaires ont été désactivés. En savoir plus