jimgini
Messages postés4Date d'inscriptionmardi 17 juillet 2007StatutMembreDernière intervention 3 août 2007
-
1 août 2007 à 12:08
jimgini
Messages postés4Date d'inscriptionmardi 17 juillet 2007StatutMembreDerniè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.
jimgini
Messages postés4Date d'inscriptionmardi 17 juillet 2007StatutMembreDerniè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.
cs_M51
Messages postés63Date d'inscriptiondimanche 20 novembre 2005StatutMembreDernière intervention10 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.
jimgini
Messages postés4Date d'inscriptionmardi 17 juillet 2007StatutMembreDerniè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.
cs_M51
Messages postés63Date d'inscriptiondimanche 20 novembre 2005StatutMembreDernière intervention10 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