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.

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
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.

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.

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

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

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

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.

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.

 

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.

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

    • Hola compañeros del foro,   Tengo el siguiente problema de novato con el presente array que he creado: Este es el código: Option Explicit Option Base 1 Sub adminTemp() Dim admin As String admin = Array("...", "...", "...", "...", "Administrador", "Conectado", "...", "...") Dim fila As Long fila = Sheets("CONEXIONES").Range("A1048576").End(xlUp).Row Dim columna As Byte For columna = 1 To UBound(admin) If Sheets("CONEXIONES").Cells(fila, columna).Value = admin(columna) Then Sheets("CONEXIONES").Rows(fila).Delete Shift:=xlUp Next columna End Sub En otras palabras, me dice que el problema está en la declaración de la variable "admin", pues la declaro como una cadena de caracteres, en cambio cuando la misma variable la declaro como un variant, entonces la macro si funciona correctamente. Pero no quiero declarar el array como un tipo variant cuando sólo contiene valores de tipo string, y ocupar espacio innecesario de memoria.   Sería de ayuda que cualquier orientación sobre este problema...
    • Estoy de acuerdo con @Sergio, es díficil encontrar documentación oficial sobre el código XML de la ribbon.
    • Muchísimas gracias por la corrección, @JSDJSD. Y muchas gracias también por compartir ese vídeo. Efectivamente, me percaté de ese error cuando me pasó el código @Antoni.   Te felicito por tu corrección. Con gente como vosotros, da gusto compartir conocimientos a través de este foro. Mil gracias de nuevo.   Saludos.
    • Ya lo hice pero con gusto lo hago nuevamente, y soy afortunado  Gracias   
    • Buenas noches Ya cheque la modificación y es exactamente lo que no sabía como hacer, mis respetos y mi agradecimiento,  Un saludo desde Irapuato, Gto. México   Gracias 
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy