Jump to content

Recommended Posts

Hola

No es una buena idea usar campos OLE, dichos campos hacen crecer la base de datos demasiado, y más aún hoy en día en que las imágenes tienen más resolución y mayor tamaño. Si bien algunos consideran que el tipo de campo "Datos adjuntos" es una alternativa ya que podría decirse que comprime los archivos, finalmente es bastante complicado de manejar en VBA y, hasta donde recuerdo, no se puede usar SQL e Insert Into para "llenarlo". 

¿Cuál es mi propuesta? Que uses un campo del tipo Texto y guardes la ruta de la imagen. Comentas.

Share this post


Link to post
Share on other sites

Hola, no es exactamente lo que quiero parece ser que es muy dificil.

Envio un ejemplo tengo la hoja de excel y la base de datos de access tiene 4 campos.

Me gustaria que los datos de la hoja de excel se movieran a la base de datos de access con una macro pero incluyendo la imagen como objeto ole.

Saludos.

Libro2.xlsx

Edited by luis martinez pedrosa

Share this post


Link to post
Share on other sites

Estimado, a ver, tú has dicho que quieres insertar una imagen en  un campo OLE de Access y eso es lo que hace la UDF del enlace enviado, y no, no es fácil, más aún porque lo quieres hacer desde el VBA de Excel, para lo cual debes adaptar la UDF enviada en el enlace ya que, además, usa objetos de Access y tú usarás de Excel.

Ojo, no, no hay una forma fácil de hacerlo y por si acaso, debes tener los archivos de imagen en alguna carpeta, tal como se apreciaba que se basaba  el primer archivo que enviaste (en la columna A estaban las rutas). Si tu idea es que los archivos están solo y ya en el Excel (sin una ruta escrita en algún lado), pues la programación necesaria es mucho más complicada y requeriría, además de mucho conocimiento, bastante más tiempo del que creo estás imaginando.

Lo de los otros campos, te aseguro que teniendo el código para insertar la imagen, pues te sería más fácil (ojo, ya que en tu primer archivo hay macros, estoy asumiendo que algo sabes del tema).

Ah, por supuesto que todo sería más fácil si solo guardaras la ruta de cada imagen como texto.

Resumen:

- El mostrado (ADO Stream) es el método más fácil para insertar imágenes en campos OLE de Access, siempre y cuando la imagen esté en una ruta que se conoce y/o se tiene la ruta escrita en alguna celda (como en el primer archivo).

- Si la imagen solo está en el archivo Excel (es decir no se conoce la carperta y/o no se tiene la ruta escrita), incrementa la dificultad de lograrlo.

- Si se opta por solo guardar la ruta como texto, varios tenemos ejemplos ya hechos que no son complicados (usando ADO y SQL).

Ya en tus manos está decidir.

Share this post


Link to post
Share on other sites

Hola podrias poner un ejemplo.

 

- El mostrado (ADO Stream) es el método más fácil para insertar imágenes en campos OLE de Access, siempre y cuando la imagen esté en una ruta que se conoce y/o se tiene la ruta escrita en alguna celda (como en el primer archivo).

Ya que no tengo ni idea de como hacerlo.

Gracias.

 

Saludos.

Share this post


Link to post
Share on other sites

Vamos a suponer una tabla (MiTabla) con cuatro campos:

ej1.JPG.bf97930d8702d8d16302c767ef500adb.JPG

El campo ID, al ser aunonumérico se incrementará solo, ojo con eso.

Luego supondremos  que el archivo Excel es así:

ej2.thumb.JPG.48a71cbb5daf3aa571f1615b2a1d96a5.JPG

Entonces, en el editor de VBA activamos la referencia:

Ej3.JPG.1a5a2929e8b4f81f92ba9a0a660855cf.JPG

No olvides que el 6.1 puede ser otro número dependiendo de tu versión de Excel (elige el número superior, si es que hay varios).

Ahora lo más importante, la macro (Excel):

Sub InsertarFotos()

Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim mstream As ADODB.Stream
Dim Celda As Range
Dim Sql As String

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset

With cnn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "data source=C:\Users\EAVJ\OneDrive\Escritorio\PruebasExcel\BD.accdb"
    .Open
End With

Sql = "Select * From MiTabla"

With rst
    .CursorLocation = adUseClient
    .CursorType = adOpenKeyset
    .LockType = adLockOptimistic
    .Open Sql, cnn, , , adCmdText
End With

For Each Celda In Range("A2:A4")

    With rst
        .AddNew
        .Fields("Nombre") = Celda.Value
        .Fields("Edad") = Celda.Offset(0, 1).Value
        Set mstream = New ADODB.Stream
        mstream.Open
        mstream.Type = adTypeBinary
        mstream.LoadFromFile Celda.Offset(0, 2).Value
        .Fields("Foto") = mstream.Read
        .Update
        mstream.Close
        Set mstream = Nothing
    End With

Next Celda

rst.Close
cnn.Close

End Sub

Obviamente reemplaza: La ruta y nombre del archivo Access, las rutas (en el Excel) de tus imágenes, el rango de tus celdas, el nombre de la tabla, el nombre de los campos...

Después de correr la macro, tu tabla de Access debería quedar algo así:

ej4.thumb.JPG.8d556d1d6f44259ffe2c51fd31a78f7c.JPG

Las imágenes se han convertido en datos binarios largos que, cuando necesites verlas, debes convertir en archivos (temporales) primero y luego usar algún objeto de Access (Image, PictureBox...) para poder observarlos, pero eso lo veremos después, primero debes confirmar si pudiste llegar hasta aquí y sobre todo, entenderlo.

Saludos

Share this post


Link to post
Share on other sites

Hola ya he creado la base de datos y el archivo excel siguiendo tus explicaciones, de momento todo funciona tal y como indicas subo el link para la descarga.

Tal y como indicas las imagenes se han convertido en datos binarios largos.

https://drive.google.com/open?id=1dBRtqtpZIVkgu07Eq0GuvyhdV7E6fq9d

El sistema que utilizo  para insertar las imagenes en el campo ole que utilizo es.

Inserto las imagenes en un documento de word y abro la tabla de la base de datos y voy arrastrando cada imagen al campo ole luego abro el formulario y ya veo las imagenes incrustadas.

Me gustaria automatizar en masa para ahorrar tiempo ya que si son 50 imagenes tengo que moverlas una a una.

Muchas gracias por tu tiempo.

 

Saludos

Share this post


Link to post
Share on other sites

Hola nuevamente

Pues, como ves, al tener toda la ruta en Excel, ya puedes enviarlo a Access, cuestión de tener todas las rutas de todas tus imágenes en tu Excel. Para ver las imágenes en Access, solo crea un formulario usando el asistente de formulario, elige tu tabla e inserta todos los campos menos el del objeto OLE. 

ej5.thumb.JPG.5e540f2c1d52742863009003a3476fdc.JPG

Después inserta un objeto Image pero sin insertar ninguna imagen no vincular el objeto a ningún campo:

ej6.thumb.JPG.e616eada8a422dc3d45139ff2bd093d9.JPG

Después, en el código del formulario usaremos lo del ejemplo del enlace que te envíes, o sea, pega esto:

Private Sub Form_Current()

Dim rs As DAO.Recordset, sSQL As String, sTempPicture As String

sSQL = "SELECT * FROM MiTabla WHERE ID= " & Me.Id

Set rs = CurrentDb.OpenRecordset(sSQL)

If Not (rs.EOF And rs.BOF) Then
    sTempPicture = "D:\MyTempPicture.jpg"
    Call BlobToFile(sTempPicture, rs("Foto"))
    If Dir(sTempPicture) <> "" Then
        Me.Imagen8.Picture = sTempPicture
    End If
End If

rs.Close
Set rs = Nothing

End Sub

Private Function BlobToFile(strFile As String, ByRef Field As Object) As Long
On Error GoTo BlobToFileError
Dim nFileNum As Integer
Dim abytData() As Byte
BlobToFile = 0
nFileNum = FreeFile
Open strFile For Binary Access Write As nFileNum
abytData = Field
Put #nFileNum, , abytData
BlobToFile = LOF(nFileNum)
BlobToFileExit:
If nFileNum > 0 Then Close nFileNum
Exit Function
BlobToFileError:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, _
"Error writing file in BlobToFile"
BlobToFile = 0
Resume BlobToFileExit
End Function

Y luego, al activar el formulario y cambiar registros, verás así:

ej7.thumb.JPG.3cb73ed3748d869efce531fc89370105.JPG

ej8.thumb.JPG.12055b38c1ae3621361a83930f56f2be.JPG

Como ves, puedo ver tus imágenes sin que me las hayas enviado aparte y/o en un Word.

Saludos

Share this post


Link to post
Share on other sites

Estimado, siempre hay limitaciones cuando se quiere interactuar entre programas, tú querías hacer todo desde Excel y de forma automática/masiva y entre las formas planteadas es la trabajada aquí en la cual se insertan las imágenes (*.jpg) como datos binarios. Si revisas,  nuevamente, todo, verás que para visualizar las imágenes es necesario crear archivos temporales; entonces al usar tú la distribución por tabulación en tu formulario mostrando todos los registros, y al existir en realidad un solo objeto Image en dicho formulario (no es que al mostrar varios registros se - auto - creen varios objetos iguales) el código VBA llena el objeto con el registro activo, viéndose la misma imagen en todos los registros, es decir, Access está haciendo lo que se le está indicando. 

Aunque es una pregunta de Access (siendo este un foro de Excel), ¿hay una manera de que usando la distribución de tabulación y archivos temporales se muestren distintas fotos? Sí, pero habría que crear un campo más en la tabla (puede ser temporal), habría que crear un archivo de imagen temporal por cada registro, y habría que hacer que ese campo temporal se llene con la ruta temporal de la imagen y la muestre, lo que implica bastante programación y bastante tiempo. ¿Hay una forma más fácil de hacerlo? No, o sea, no si deseas usar ese tipo de distribución en un formulario. Ojo, si vas a usar Informes, pasará algo parecido si quieres mostrar todos los registros a la vez.

Share this post


Link to post
Share on other sites

Hola avalencia, era de suponer que no era un tema facil aunque gracias a tu ayuda he conseguido avanzar mucho. si crees que seria posible tal y como indicas creando un campo temporal por cada imagen seguire investigando.

Aunque creo que sera muy dificil ya que soy novato.

Gracias por tu gran ayuda trabajo y esfuerzo.

 

Saludos.

 

Share this post


Link to post
Share on other sites

Estimado, de nada y dado que mencionas que eres novato en estos temas, yo sugiero ir paso a paso, iniciar desde cosas básicas. La salids que sugiero a tu actual dilema, te aseguro que hasta a personas con tiempo en este tema pues no se les hace tan fácil, y es por ello (la dificultad y tiempo) que ya es complicado recibir "ayuda" a ese nivel. Espero se entienda. Saludos.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png