Syntaxe Importer Image dans feuille Excel vers UserForm

Résolu
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 1 mars 2012 à 15:51
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 2 mars 2012 à 19:52
Bonjour à tous,

Pour importer une image depuis un fichier dédié : Pas de problème avec le code
Chem = "C:\InfiltroPass\Images"
Pict = "Toto.jpg"
VoirGamme.Slide.Picture = LoadPicture(Chem & Pict)


Mais si je veux plutôt utiliser cette image, préalablement collée dans MaFeuille de MonClasseur sous MonImage (ouvert),
Chem = "C:\InfiltroPass"
'Quelle syntaxe pour Pict ?
Pict = "Workbooks("MonClasseur").Sheets("MaFeuille").Shapes("MonImage")"
VoirGamme.Slide.Picture = LoadPicture(Chem & Pict)


La syntaxe n'est évidemment pas correcte (incompatibilté de type)!

Je suis un peu confus, mais je cherche toujours la bonne syntaxe en vain...

Merci d'un coup de main.

Cordialement
Rataxes64

25 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
2 mars 2012 à 11:56
J'ai trouvé une solution.
Une UserForm, 1 bouton et un controle Image.
L'usrForm: ShowModal à False pour faire une copie de ton image.
Dans le bouton:

 Selection.Copy
  Image_ClipBoard
  Image1.Picture = LoadPicture(ActiveWorkbook.Path & "\monimage" & ".jpg")


Dans un module:

'http://excel.developpez.com/faq/?page=PressePapier
Option Explicit
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, _
    ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Sub Image_ClipBoard()
Dim x As Byte
Dim Sh As Shape
Dim monImage As String

'Compte le nombre d'objet initial dans la feuille
x = ActiveSheet.Shapes.Count

Application.ScreenUpdating = False
ActiveSheet.Range("A1").Select
'Colle le contenu du presse papier dans la feuille de calcul
ActiveSheet.Paste
'vérifie si le collage effectué correspond à une image
If x = ActiveSheet.Shapes.Count Then
    Application.ScreenUpdating = True
    MsgBox "Opération annulée"
    Exit Sub
    
    Else
    
    'Récupère la dernière forme de la feuille
    Set Sh = ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
    'Définit le nom et le lieu de stockage de l'image
    monImage = ActiveWorkbook.Path & "\monimage" & ".jpg"
    ' MsgBox "L'image est sauvegardée dans le dossier du classeur."
    'Colle l'image dans un graphique
    With ActiveSheet.ChartObjects.Add(0, 0, Sh.Width, Sh.Height).Chart
        .Paste
        'Sauvegarde l'image du graphique au format jpg
        .Export monImage, "JPG"
    End With
    
    'Supprime le graphique et la forme.
    With ActiveSheet
        .ChartObjects(ActiveSheet.ChartObjects.Count).Delete
        .Shapes(ActiveSheet.Shapes.Count).Delete
    End With
    
    Application.ScreenUpdating = True
    
    
    '-------------------------------------------------------------
    'Option pour les utilisateurs de Windows XP :
    'visualisation de l'image créée, avec l'apercu images_telecopies Windows
    'testé avec Excel2002 et WinXP
    
    'ShellExecute 0, "open", "rundll32.exe", _
       ' "C:\WINDOWS\System32\shimgvw.dll,ImageView_Fullscreen " & monImage, 0, 1
End If

End Sub

Ce n'est pas de moi je l'ai adapté à ta demande. Par contre pour changer le nom c'est impossible car les images insérées prennent le nom de Image 1 etc. suivant leur entrée dans la feuille


@+Le Pivert
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
2 mars 2012 à 15:14
D'abord, merci encore de ton appel, ucfoutu.

Voilà, j'essaie de mettre en pratique ta solution consistant à "charger" une Userform (Images) de mes différentes images (c'est fait), et utiliser l'évènement Click au lieu de Change dans la Combo (GmeBox). Mais encore faut-il appeler les images correctement...

En effet, le NOM de l'image à appeler dépend de la sélection faite : Comment le déclarer pour qu'il soit pris en compte dans la syntaxe .Picture (plutôt que de poser près de 30 Case ou If) ?

Private Sub GmeBox_Click()
'Changement de choix dans la Combo

    Application.ScreenUpdating = False

    'Déclaration pour le nom de l'image à reprendre par .Picture
    Dim iGme ' As quoi ?
    '===================
    
    'Report du choix dans la feuille ?
    'Dim Gme As String
    'Gme = GmeBox.value
    'ActiveCell.value = Gme
    
    'Nom de l'image dans userform Images (Nom = "Image" + choix fait avec "." remplacé par "_")
    'Par exemple choix = "0.1" devient "Image0_1" : c'est le nom de l'image (iGme) à récupérer dans la Form pour le choix fait
    iGme = "Image" & Replace(GmeBox.value, ".", "_")
    
    'iGme : Membre ou méthode de données introuvable
    GmeSlide.Picture = Images.iGme.Picture

End Sub


Boudiou!

Cordialement
Rataxes64
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2012 à 17:32
En utiliant tout simplement la collections Controls ===>>
Exemple :
GmeSlide.picture = images.controls(iGme).picture


car controls("toto") est tout simplement le contrôle nommé toto


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 mars 2012 à 18:36
Et évite d'utiliser l'évènement Change de ta combo.
Pas très "parlants" tes noms d'images ainsi construits sur la valeur choisie, pour l'utilisateur, alors que, comme je te l'ai exposé ce matin, tu peux en profiter pour lui faciliter la vie.
Je vais te donner des idées ===>>
Regarde ce que ferait ceci (exemple) :
En imaginant que les "photo_..." soient les noms de tes images dans ton userform Images
Private Sub UserForm_Initialize()
  Dim i As Single, mestrucs(6, 2)
 ComboBox1.ColumnCount = 2
 mestrucs(0, 0) "0.1": mestrucs(0, 1) "photo_machine"
 mestrucs(1, 0) "0.2": mestrucs(1, 1) "photo_bidule"
 mestrucs(2, 0) "0.9": mestrucs(2, 1) "photo_grue"
 ComboBox1.List() = mestrucs
End Sub


Private Sub ComboBox1_Click()
 Dim monimage As String
  monimage = ComboBox1.List(ComboBox1.ListIndex, 1)
  MsgBox "tu viens de cliquer sur l'article " & ComboBox1.List(ComboBox1.ListIndex) & " qui correspond à l'image " & monimage
  ComboBox1.Text = monimage

  ' il te suffit alors de prendre la propriété Picture de Images.Controls(monimage)
  'GmeSlide.picture = images.controls(monimage).picture


End Sub



C'est-y pas mieux et plus proche de l'utilisateur ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
2 mars 2012 à 19:41
Mais c'est bien sûr...

Oh! J'ai honte!

Bon, alors voilà, j'ai finalement choisi la solution dont nous avons discuté avec ucfoutu, à savoir :

Comme j'ai finalement très peu d'images au total (23, exactement), et qu'elles pèsent environ 15ko chacune, ça n'allourdit pas trop le classeur (il double quand même de poids en passant de 2,Mo à 5Mo, mais bon, ça reste raisonnable).

Après les avoir crées classiquement (.jpg), elles sont chacune chargée dans une Userform (Images) avec, et c'est très important, un NOM précis. Il contient, après le mot "Image" (pour éviter des soucis) un suffixe correspondant aux valeurs qui seront proposées dans les listes déroulante dans les cellules de choix.

Plus besoin de recourir à une répertoire externe (qui peut être perdu ou "maltraité", et les images sont mieux protégées que collées dans une feuille, puisqu'il faut accéder aux macros (verrouilées ).

Avantage supplémentaire, on peut "boucler" le choix, qui peut s'effectuer, soit depuis la feuille, soit depuis une combo dans la Form. Raison pour laquelle j'ai écarté le script de Michel PIERRON cité plus haut (je n'ai jamais pu y arriver...).

Voici donc le code final utilisé :

Plus de répertoire d'images ; elles sont stockées dans userform "Images"

Dans la feuille "Mesures", l'évènement Woksheet_Change de la cellule concernée appelle la sub VisuGme

Sub VisuGme()
'Par Userform Images

    Application.ScreenUpdating = False
    Dim Gme, Grw, GmeVent, ListeGamme
    Gme = ActiveCell.value
    Grw = ActiveCell.Row
    
    'Reprise du Modèle de Ventilateur
    VoirGamme.ModelVT.Caption = Sheets("Mesures").Range("G" & Grw - 3).value
    
    'Reprise de l'image dans userform Images
    iGme = "Image" & Replace(Gme, ",", "_")
    If Gme = "C2" _
        And VoirGamme.ModelVT.Caption = "S2000" _
        Then iGme = "ImageC2_2"
    If Gme = "C2" _
        And VoirGamme.ModelVT.Caption = "S3000" _
        Then iGme = "ImageC2_3"
    VoirGamme.GmeSlide.Picture = Images.Controls(iGme).Picture

    'Reprise de la valeur
    VoirGamme.GmeBox.value = Gme
    
    'Reprise liste des Gammes disponible pour le Ventilateur choisi
    GmeVent = Sheets("Mesures").Range("G" & Grw).value
    ListeGamme = ThisWorkbook.Sheets("Data").Range(GmeVent).Address(external:=True)
    VoirGamme.GmeBox.RowSource = ListeGamme
    VoirGamme.Show

End Sub


Une Userform "VoirGamme" (Une combo "GmeBox", un Label "ModelVT"; une zone Picture "GmeSlide")
Private Sub UserForm_Initialize()

    GmeBox.value = ActiveCell.value
    
End Sub


Private Sub RepGmeBox_Click()
'Par répertoire de fichiers

    Application.ScreenUpdating = False
    Dim Gme As String
    Gme = GmeBox.value
    
    ActiveCell.value = Gme
    
    If Dir("C:\InfiltroPass\Images" & Gme & ".jpg") <> "" Then
        GmeSlide.Picture = LoadPicture("C:\InfiltroPass\Images" & Gme & ".jpg")
    End If
    
End Sub

Private Sub GmeBox_Click()
'Par Userform Images

    Application.ScreenUpdating = False
    Dim Gme As String
    Dim iGme As String
    
    'Report dans la cellule
    Gme = GmeBox.value
    ActiveCell.value = Gme
    
    'Reprise de l'image dans userform Images
    iGme = "Image" & Replace(GmeBox.value, ",", "_")
    If Gme = "C2" _
        And VoirGamme.ModelVT.Caption = "S2000" _
        Then iGme = "ImageC2_2"
    If Gme = "C2" _
        And VoirGamme.ModelVT.Caption = "S3000" _
        Then iGme = "ImageC2_3"
    GmeSlide.Picture = Images.Controls(iGme).Picture
    
End Sub


Voilà, voilà.

Sachant que pour être nikel, je dois encore "dépoussiérer" certaines déclarations.

Merci à tous.
Cordialement.
Rataxes64
0
Rejoignez-nous