L'erreur est quelque peu explicite :un contrôle d'image dans Microsoft Access peut être soit lié à un emplacement de fichier, soit défini sur un .dib
image (bitmap indépendant du périphérique format
, l'un des formats d'image les plus obscurs).
Cependant, contourner ce problème n'est pas si simple.
Vous pouvez contourner cette limitation de plusieurs manières :
- Utilisez un contrôle ActiveX qui prend en charge plusieurs formats d'image (il en existe plusieurs)
- Enregistrez l'image sur le disque dans un dossier temporaire et définissez la source de contrôle des images sur son emplacement
- Utilisez un contrôle de navigateur Web et utilisez le code HTML
<img />
tag pour afficher votre image, en utilisant une image BASE64 intégrée
Voici l'exemple de code pour l'approche 3 :
Premièrement, nous devons pouvoir convertir le code binaire contenu dans l'objet OLE en BASE64 :
Public Function ToBase64(Bytes As Variant) As String
Dim XMLElement As Object
Set XMLElement = CreateObject("Msxml2.DOMDocument.6.0").createElement("tmp")
XMLElement.DataType = "bin.base64"
XMLElement.nodeTypedValue = Bytes
ToBase64 = Replace(XMLElement.Text, vbLf, "")
End Function
Ensuite, nous pouvons utiliser un contrôle de navigateur Web et y insérer une page Web contenant l'image encodée en BASE64 :
Public Sub InsertImageInControl()
Dim wb As Object
Set wb = MyWebbrowserControl.Object
With wb
.Navigate2 "about:blank"
Do Until .ReadyState = 4 '=READYSTATE_COMPLETE
'This is a somewhat inefficient way to wait, but loading a blank page should only take a couple of milliseconds
DoEvents
Loop
.Document.Open
.Document.Write "<!DOCTYPE html><HTML><HEAD><TITLE>A</TITLE></HEAD><BODY scroll=""no"" style=""margin: 0px; padding: 0px;"">"
.Document.Write "<img alt="""" style=""width:100%; margin: 0px; padding: 0px;"" src=""data:image/jpg;base64,"
.Document.Write ToBase64(MyOLEObject.Value)
.Document.Write """ />"
.Document.Write "</BODY></HTML>"
.Document.Close
End With
End Sub
Où MyWebbrowserControl
est le nom du contrôle de votre navigateur Web, image/jpg
est votre type d'image, et MyOLEObject
est votre objet OLE.
Conseils :
- N'utilisez pas le contrôle ActiveX WebBrowser, mais utilisez celui fourni avec Access. Sinon, vous obtiendrez une version obsolète d'Internet Explorer avec une bordure 3D qui ne peut pas être supprimée.
- Définissez la source de contrôle pour le contrôle du navigateur Web sur
="about:blank"
pour l'initialiser comme une page vierge