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

Sospecho que es un error en los nombres de los objetos de tu formulario, míralos bien, no solo copies y pegues lo que he enviado, trata de entenderlo para que lo adaptes.

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.

INFORMACIÓN BÁSICA SOBRE PROTECCIÓN DE DATOS

Responsable: Sergio Andrés Celemín

Finalidad: Moderar y responder comentarios de usuarios. Recuerda que la información que facilites es pública, y los datos que incluyas los leerá cualquier visitante de esta web, así como el avatar que poseas.

Legitimación: Consentimiento del interesado.

Destinatarios: Hetzner Online GmbH.

Derechos: Puedes ejercitar en cualquier momento tus derechos de acceso,
rectificación, supresión, oposición y demás derechos legalmente establecidos a
través del email sergio@ayudaexcel.com.

Información adicional: Encontrarás más información en la política de privacidad.




  • Posts

    • Efectivamente la había dejado preparada... solo una de las dos partes Te dejo la nueva solución. No sé cómo metes los datos de las nuevas hojas, pruebalo. BUSCAR DATO EN OTRA HOJA-1.xlsm
    • Buenas noches amigos de Ayuda Excel. Estoy atorado en una parte del proyecto, y quiero consultarles de que manera se podria realizar lo siguiente. Estoy haciendo un archivo de registro de entradas y salidas de equipos seriabilizables, pero necesito que al capturar el serial del equipo con una lectora de codigo, la macro me verifique si este esta en la tabla de la hoja "Salidas", si el serial esta en dicha tabla, necesito que la macro me traiga la informacion de ese rango de fila, y lo agregue en otra tabla ubicada en la hoja "Entrada", y que adicionalmente agregue en esa misma fila, al lado de la fecha de egreso, la fecha de hoy (ingreso) con su hora (de la misma manera en que ya lo hace). Al terminar de exportar la informacion, debera arrojarme un mensaje indicandome la ubicacion y numero de baul. Despues de este procedimiento, debe ir nuevamente a la celda "Serial de equipo", para capturar si fuera el caso el proximo serial. Pero si el serial del equipo no esta en la tabla "Salidas", la macro debera pedirme que ingrese el serial de inventario de dicho equipo en la hoja "Reg. Entrada", y despues agregar esta informacion (los dos seriales) en la tabla de la hoja "Entradas". Seria algo asi como en la imagen. Anexo mi archivo para mayor informacion. Entradas y salidas de equipos - Version muestra.xlsm Les agradezco de antemano por la ayuda que me puedan prestar Entradas y salidas de equipos - Version muestra.xlsm
    • Entonces dentro de la macro, modifica para que sea una columna completa, además indicarte que esto es lo que pasa cuando un usuario no sube una muestra en Excel tal cual en su estructura, así que en futuras consultas ya sabes La opción de @John Jairo V también es buena alternativa   Saludos a ambos!
    • ¡Hola, @Leonardo Briceño! Es claro que con la macro de evento proporcionada por Gerson (un saludo) puedes realizar el cambio de minúsculas a mayúsculas.  Te doy otra alternativa más sencilla que quizá te pueda servir:  Usar fuente tipo versalitas.  Estas fuentes siempre usan mayúsculas en su esencia, así que te evitas la macro.  Si gustas verifica sobre ellas para aplicarlas en tu archivo.  ¡Bendiciones!
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy