Import d'une image de excel vers access

Résolu
jimgini Messages postés 4 Date d'inscription mardi 17 juillet 2007 Statut Membre Dernière intervention 3 août 2007 - 1 août 2007 à 12:08
jimgini Messages postés 4 Date d'inscription mardi 17 juillet 2007 Statut Membre Dernière intervention 3 août 2007 - 3 août 2007 à 11:11
Bonjour!

Tout d'abord je ne suis pas sûr d'avoir poster au bon endroit. J'ai hésité entre access et vba...

Voici mon problème. Je suis entrain de faire une base de données qui doit remplacer tout un ensemble de fichiers excel. Chaque fichier excel devient une entrée de la base de données. Comme les fichiers excel sont en peu foutus n'importe comment, j'ai un module access qui recopie une à une la bonne cellule excel dans le bon champ access. Jusque là ça va je m'en sors tout seul.

Mais j'ai aussi une image à recopier. Cette image se trouve sur la feuille excel, son nom varie d'une feuille à une autre, et elle n'est pas attachée à une cellule. j'ai trouvé des bouts de code pour récupérer les images d'une feuille excel, mais je n'arrive pas à les faire marcher. ce sont des trucs du style :



Dim Obj As Shape

'Boucle sur les formes type Image contenues dans la feuille
For Each Obj In Worksheets("Feuil1").Shapes
    If Obj.Type = msoPicture Then MsgBox Obj.Name
Next Obj



ou encore :

Dim P As Object
   For Each P In ActiveSheet.Pictures
       If TypeOf P Is Picture Then Call P.Delete 'là aussi ce n'est pas la bonne instruction, mais je peux gérer ça tout seul!
   Next

Je n'arrive pas à faire marcher ces fragments de code. Tel que je comprends le problème il me manque des références, puisque je dois utiliser du vba excel dans access. Pourtant j'en utilise pour le reste, par exemple pour avoir accès à une cell particulière ou pour faire getopenfilename. Mais il doit encore me manquer des références. J'ai mis microsoft excel 11.0, ms access 11.0, activeX data objects 2.1, DAO 3.6, OLE automation, et visual basics for applications.

Le problème est donc : récupérer avec access une image sur excel dont je ne connais rien.

Quelqu'un a une idée?  Merci pour toute aide!

ps : j'ai office 2003

5 réponses

jimgini Messages postés 4 Date d'inscription mardi 17 juillet 2007 Statut Membre Dernière intervention 3 août 2007
3 août 2007 à 11:11
Voilà j'ai finalement réussi à le faire marcher. Je le mets si d'autres personnes en ont besoin un jour.

    Dim Photo As Object
    Dim ch As ChartObject

    For Each Photo In ws.Shapes 'ws est la worksheet où il faut récupérer les images
    Photo.CopyPicture
    Set ch = ws.ChartObjects.Add(0, 0, Photo.Width, Photo.Height)
    ch.Chart.Paste
    ch.Chart.Export Application.CurrentProject.Path & "\photos" & po_ref & ".jpeg", "JPEG" 'ici je l'enregistre dans un rep "photos" qui se trouve au même endroit que le .mdb. po_ref est un string que je récupère plus haut, propre au fichier excel.
    Next Photo

Perso je m'en sers pour enregistrer une seule photo, pour en enregistrer plus il faudrait à chaque fois changer le nom.

Cette méthode modifie la feuille excel originale, j'ai contourné le problème avec des sendkeys pour que les modifications ne soient pas enregistrées à la fermeture.
3
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
1 août 2007 à 14:06
Si cela t"interesse je peux déjà te passer le code pour stocker une image (les données dans access). Perso je conseille pas, car le fichier access s'envole rapidement en dimension, il vaut sauver l'image ailleur et stocker le lien de cette image dans access.
0
jimgini Messages postés 4 Date d'inscription mardi 17 juillet 2007 Statut Membre Dernière intervention 3 août 2007
2 août 2007 à 04:51
Je te remercie.

Je veux bien que tu me passes ça, même si je pense pouvoir faire seul cette partie. Effectivement stocker l'image en dehors est sans doute mieux, mais ça n'empêche pas que j'aimerais toujours récupérer automatiquement l'image sur le fichier excel, quel que soit l'endroit où je la stocke après. Je ne fais pas confiance aux futurs utilisateurs pour sauver l'image au bon endroit avec le bon nom  et en plus ça serait plus rapide.

Merci à toi en tout cas.
0
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
2 août 2007 à 08:59
Ce code permet de stocker une image dans Access (j'insiste en disant qu'il vaut mieux sauver cette image automatiquement dans un répertoire et la lier dans access):

Il faut d'abord récupérer l'image, je la passe ensuite dans un MemoryStream, qui me permet de récupérer une table bynaire (il y a peut être plus simple mais je ne connais pas). Pour cela tu as besoin de connaitre l'encodeur Jpeg dans mon cas.

 'traitement d'image
    Dim MyImageCodecInfo As ImageCodecInfo = GetEncoderInfo("jpeg")
    Dim MyEncoder As Encoder = Encoder.Quality
    Dim Quality As Long = 70 'facteur de compression
    Dim MyEncoderParameter As New EncoderParameter(MyEncoder, Quality)
    Dim MyEncoderParameters As New EncoderParameters(1)

'retourne les caractéristiques du codec dispo dans Framework (dans mon cas un JPEG)
    Function GetEncoderInfo(ByVal Format As String) As ImageCodecInfo
        Dim i As Integer
        Dim encoders As ImageCodecInfo()
        encoders = ImageCodecInfo.GetImageEncoders
        For i = 0 To encoders.Length
            If encoders(i).FormatDescription = Format.ToUpper Then
                Return encoders(i)
                Exit For
            End If
        Next
        GetEncoderInfo = Nothing 'sinon on retourne rien
    End Function

Mettre ce code dans le Form.Load par exemple:
           MyEncoderParameters.Param(0) = MyEncoderParameter 'récupère les paramètres encodeur Jpg disponible

  Puis celui-ci pour stocker chaque image dans access:
Dim NameTable As String = "IMAGES"

    'Connection pour Access

    Dim MyConnexion As New
OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data
source=C:\... fichier Access.mdb")
Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
 Mycommand.CommandText = "INSERT INTO " & NameTable & "([Image]) VALUES (?)"

Dim Miniature As Image
Dim bytImage As Byte()

Miniature = Bitmap.FromFile(ListFile(I)) 'Là, tu devras avoir le code qui te récupérera l'image depuis un fichier Excel (désolé je ne connais pas celui-ci)
 Miniature = Miniature.GetThumbnailImage(90, 120, Nothing, Nothing) 'redimensionne
 mais pas obligatoire dans ton cas
                  
 Dim mstImage As New MemoryStream() 'Attention Il faut recréer un mstImage à chaque fois, sinon on ajoute l'image à la suite
                   
Miniature.Save(mstImage, MyImageCodecInfo, MyEncoderParameters)
bytImage = mstImage.GetBuffer()
                  
 Mycommand.Parameters.Add(New OleDbParameter("Image", OleDbType.VarBinary, bytImage.Length, ParameterDirection.Input, False, CByte(0), CByte(0), "", DataRowVersion.Current, bytImage))

Mycommand.ExecuteNonQuery()

Mycommand.Dispose() 'supprime l'ancienne donnée

Enfin, dans access il faudra mettre un champ Image avec un type "Objet OLE"

Voilà bon courage ;)
0

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

Posez votre question
jimgini Messages postés 4 Date d'inscription mardi 17 juillet 2007 Statut Membre Dernière intervention 3 août 2007
2 août 2007 à 11:44
Wah merci beaucoup!

En fait je vais suivre ton conseil, je vais les enregistrer à coté de la bd. Donc je ne sais pas si j'aurais besoin de ce code, en tout cas merci.

J'ai trouvé comment accéder aux images, là j'essaye de les enregistrer. Si tu as ce code dispo aussi je suis prenuer, sinon c'est pas grave.

Merci beaucoup en tout cas.
0
Rejoignez-nous