O erro é um pouco autoexplicativo:um controle de imagem no Microsoft Access pode ser vinculado a um local de arquivo ou pode ser definido como um
.dib
imagem (bitmap independente do dispositivo formato
, um dos formatos de imagem mais obscuros). Trabalhar em torno disso, no entanto, não é tão fácil.
Você pode contornar essa limitação de várias maneiras:
- Use um controle ActiveX que suporte vários formatos de imagem (há vários a serem encontrados)
- Salve a imagem em disco em uma pasta temporária e defina a fonte de controle de imagens para seu local
- Use um controle de navegador da Web e use o HTML
<img />
para exibir sua imagem, usando uma imagem BASE64 incorporada
Aqui está o código de exemplo para a abordagem 3:
Primeiro, precisamos ser capazes de converter o código binário contido no objeto OLE para 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
Em seguida, podemos usar um controle de navegador da Web e inserir uma página da Web com a imagem codificada em 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
Onde
MyWebbrowserControl
é o nome do seu controle do navegador, image/jpg
é o seu tipo de imagem e MyOLEObject
é o seu objeto OLE. Pontas:
- Não use o controle ActiveX WebBrowser, mas use o que vem com o Access. Caso contrário, você receberá uma versão desatualizada do Internet Explorer com uma borda 3D que não pode ser removida.
- Defina a fonte de controle para o controle do navegador da Web como
="about:blank"
para inicializá-lo como uma página em branco