lunes, 12 de septiembre de 2011

Curso Programación VBA Excel 2010: Ejercicio Práctico Importar Imágenes.






Saludos!!!!!!!!!!


Volvemos a nuestro tema favorito, VBA para Excel. En esta ocasión abandono de nuevo el temario o programa del curso, para publicaros una sesión en la que voy a explicar la solución que envié a un lector del Blog para una duda que tenía.

La idea o duda era la siguiente. Tenía un documento de Excel en el que por necesidades de trabajo tenía que importar unas 2500 imágenes y no quería importarlas de una en una. Cada una de las imágenes se debía importar en una celda. Debía empezar en una celda concreta y a partir de esa celda se van insertando el resto de imágenes una fila por debajo.

Hasta aquí podemos deducir dos problemas principales: Como importar todas las imágenes que contiene una carpeta y como dar a las celdas y a la imagen el tamaño justo para que la imagen quede bien situada en cada celda. 

Esta es la duda que me planteo. Primero vamos a dar solución a este problema y a continuación modificaremos el código un poco para que en lugar de sacar las imágenes de una carpeta escrita en el código, aparezca una ventana en la que podemos seleccionar la carpeta de la que sacará las imágenes para importar. Esto es lo que vamos hacer en esta sesión.

Creo que es una sesión muy interesante ya que se tocan temas a los que todavía no hemos llegado en el curso de VBA para Excel. Por esta razón, igual que en la anterior sesión dedicada a las dudas, hay algunos detalles que no explico al 100%, os doy pinceladas para que luego vosotros probéis con cosas nuevas y ver qué pasa.


Todos mis vídeos son Gratis, pero si te gusta mi trabajo, puedes realizar una donación para que pueda continuar con este proyecto. Cualquier cantidad desde 1€/1$ es bienvenida. Gracias!!!!!!!!!!!!!!


Para seguir esta sesión podéis descargar el siguiente archivo que utilizo en el Vídeo. 


Como siempre, aquí tenéis la información del vídeo, enlaces para ver los vídeos y comentarlo en el foro del Blog.

  • Nombre: Curso Programación VBA Excel 2010: Ejercicio Práctico Importar Imágenes.
  • Nivel: Avanzado.
  • Duración Total: 33m 57s.
  • Duración Vídeo 1: 16m 13s.
  • Duración Vídeo 2: 17m 44s.

Vídeo 1 de 2.

Vídeo 2 de 2.

Bueno, pues ya tenéis material para empezar la semana. Para la siguiente sesión posiblemente vuelva a las "Tablas Dinámicas", aunque no descartéis una nueva de Visual Basic para Excel.

40 comentarios:

  1. saludos David muy interesante pero esta linea a mi me da error:
    Set LibreriaUtilidades = CreateObject("shell. application")

    ResponderEliminar
  2. Hola.

    Si lo tienes como me lo has puesto aquí, parece que tienes un espacio entre el punto y application. Debería ir junto. Si no es eso, dime cual es el erro que te da exactamente o mándame el documento y lo miro cuando pueda.

    Saludos.

    ResponderEliminar
  3. correcto, tragon q es uno gracias

    ResponderEliminar
  4. Broer estoy realizando o mas bien copiando todo lo que indicas en tu video. Pero no aparecen las imagenes pero si los nombres de las imagenes. Mis Imagenes estan en JPEG. ayudameeeeeeeeeeee. como te podria mandar mi archivo para que lo veas y veas mi VBA que es una fiel copia del video que muestras. Ademas no se nada de programacion en VBA.

    ResponderEliminar
  5. Hola

    Envíalo a davidasurmendi@gmail.com

    Saludos.

    ResponderEliminar
  6. Bueno, pues hemos detectado un error en el vídeo entre Mario, que es el anónimo y yo.

    En el vídeo se me olvida cambiar una línea de código esta:

    ActiveSheet.Pictures.Insert("C:\Imagenes\" & NombreImagen).Select

    Debe quedar así:

    ActiveSheet.Pictures.Insert(Ruta & "\" & NombreImagen).Select

    En el vídeo no da problemas porque vuelvo a importar las imágenes de la carpeta fija, pero si seleccionáis cualquier otra carpeta no se cargan las imágenes, los nombres si. Esta es la solución.

    Saludos.

    ResponderEliminar
  7. Buenos días David, Muchas gracias por este blog tan chévere... estoy muy conectado a cada una de las publicaciones, con respecto a estos videos el código para insertar los nombres y las imágenes funciona pero las imágenes quedan por fuera de las celdas, unas sobre otras qué puede ser???

    ResponderEliminar
  8. Hola

    ¿Usas la versión 2007? En esa versión el código tiene algún pequeño detalle diferente. Parece que solo afecta a los que usáis la versión 2007. Se soluciona así, te pongo el código, hay que añadir dos líneas que sitúan las imágenes en las mismas coordenadas que las celdas.

    Do Until NombreImagen = ""
    Range("B" & Fila).Select

    Selection.RowHeight = 159

    ActiveSheet.Pictures.Insert(Ruta & "\" & NombreImagen).Select
    Selection.ShapeRange.LockAspectRatio = False

    Selection.ShapeRange.Height = 159
    Selection.ShapeRange.Width = 267
    'Estas son las líneas nuevas, en la versión 2010 funciona sin problemas
    'pero en la 2007 parece que hay que situar la imagen en la misma
    'posición que la celda de forma manual.
    Selection.ShapeRange.Top = Range("B" & Fila).Top
    Selection.ShapeRange.Left = Range("B" & Fila).Left

    Range("A" & Fila) = NombreImagen

    Fila = Fila + 1
    NombreImagen = Dir
    Loop


    Saludos.

    ResponderEliminar
  9. Buenos días David, perfecto esa es la solución, ahora funciona muy bien, pero no me queda muy claro ese par de lineas de código, eso lo veremos más adelante en el curso de programación 2010???

    Muchas gracias.

    ResponderEliminar
  10. Me alegro.

    En la versión 2010 al seleccionar una celda e introducir la imagen parece que la imagen se queda asignada a esa celda y el ejemplo funcionaba bien.

    Pero en la versión 2007 parece que no funciona igual. Con esas dos líneas lo que hago es dar a la imagen la misma posición en la pantalla que ocupa la celda en la que se supone que debe estar. Eso hacen esas dos líneas.

    Saludos.

    ResponderEliminar
  11. Holas. Hay alguna manera que se pueda exportar ese excel a Access y se incorpore las fotos a la base de datos. Saludos

    ResponderEliminar
    Respuestas
    1. Por poderse hacer se puede hacer todo. Hay que pensar el código pero si que se podría. Lo único que si son muchas imágenes no suele ser buena idea meter las imágenes en las tablas.

      Se suele optar por mantener las fotos fuera de la base de datos y lo que se almacena es la ruta donde están guardadas las imágenes. Más adelante cuando tenga tiempo, este puedes ser un buen tema para un par de vídeos. Han hecho otra consulta parecida hoy mismo y se podrían juntar las dos.

      Saludos.

      Eliminar
  12. Hey que tal
    Cree el programa y si me funcionó bien. Solo que ahora a ala carpeta le cambie los nombre por codigos numericos(a las fotos) y ahora cuando jala las imagenes no se ve nada. Igual he probado con las otras carpetas con otras fotos y se ve que jala los nombres, pero no se ve imagenes. ¿Que habrá pasado? No he modificado el VBA. Saludos Orlando (Peru)

    ResponderEliminar
  13. Ya lo resolvi leyendo uno de los mensajes anteriores. Realmente un excelente blog, mis mas sinceras felicitaciones desde el Perú. Sigue adelante maestro. Orlando(Peru)

    ResponderEliminar
    Respuestas
    1. OK, muchas gracias por las felicitaciones.

      Saludos.

      Eliminar
  14. hola david gracias por tus aportes tengo una pregunta en la cual solicito tu ayuda, mira te explico, tengo una base de datos con materiales y existencias y me gustaria que al realizar un vale de salida de algunos de los materiales que contiene estos materiales de salida se descuenten de la base de datos automaticamen espero y me ayudes gracias.

    ResponderEliminar
    Respuestas
    1. Hola

      Ahora mismo es imposible que os pueda ayudar. Tengo que acabar de preparar todo el material del curso de VBA para Access 2010 que he empezado esta semana y no tengo nada de tiempo libre. De hecho, es que ya veis que no tengo tiempo ni para crear sesiones nuevas. Ahora mismo es imposible.

      Saludos.

      Eliminar
  15. Hola,
    Antes que nada agradecer tu esplendido trabajo. Estoy intentando hacer una cosa mucho mas sencilla que la que haces tu en tu vídeo, pero no hay manera. De todo lo que he visto por ahí, tu vídeo es el que mas se le parece.

    Quiero insertar una imagen que se llame igual que una celda. Es decir, en la celda D4 quiero insertar la imagen 109.jpg, en la celda D2 tengo el texto 109. He de poner un botón que al apretarlo actualice la foto y a a ser posible la ponga a 6 cm de alto. (esto seria lo de la función esto seria lo del shapeRange.Height = x, pero con el lockAspectRatio = True, no?)

    Te agradezco anticipadamente. Ya he visto que estas muy liado, pero es para algo del curro y no quiero quedar mal.

    Un saludo

    ALex

    ResponderEliminar
    Respuestas
    1. Hola Alex

      Como ya comenté haces unos días por falta de tiempo he decidido que las dudas personales serán considerados trabajos y tendrán un coste, pequeño pero lo tendrán y tu duda se engloba dentro de ese grupo. Aquí puedes leer más información, si después sigues interesado te puedes poner en contacto conmigo.

      http://davidasurmendi.blogspot.com.es/2012/07/empezamos-el-verano.html

      Saludos.
      David Asurmendi Ochoa.

      Eliminar
  16. Hola David, eres un genio con esto de excel. lleve a cabo todo el tutorial y funciona de maravilla. Solo una cosa je je. sucede que la segunda vez que importo, de otra carpeta, coloca también las imágenes en la fila 2, encimándose con las anteriores. Que linea debo modificar para que esto no me suceda? Muy bueno el Blog y lo que haces.

    ResponderEliminar
    Respuestas
    1. Muchas gracias!!!!

      Podrías sustituir la línea en la que asigno a la variable Fila el valor 2 por estas. Y así creo que bastaría para que empiece en la primera fila vacía.

      Range("A1").End(xlDown).Select
      Fila = Selection.Row + 1

      Saludos.

      Eliminar
  17. Hola, he probado la macro realizando las modificaciones para así agregar imágenes adicionales a las ya exportadas pero solo funciona al cambiar el código fijo de la variable al código propuesto por David Asurmendi justo después del primer exporta, de lo contrario las imágenes las toma desde la celda A1 y me salen descuadras, espero sea error mio o es porque manejo el excel 2007, gracias de antemano por tan excelente ejemplo y blog.. un seguidor mas. saludos.

    ResponderEliminar
    Respuestas
    1. Hola

      No te he entendido muy bien, pero si que hay diferencias entre la versión 2007 y la 2010. En la 2007 hay alguna pequeña diferencia.

      Saludos.

      Eliminar
  18. Hola David
    Te escribo desde Chile para felicitarte por tu vídeo y ademas hacerte una consulta, como se podría hacer para seleccionar una imagen especifica y no tomar todas las imágenes que contenga esta carpeta?
    Bueno espero tu respuesta
    Saludos.

    ResponderEliminar
    Respuestas
    1. Tienes que utilizar GetOpenFileName para indicar que archivo quieres abrir. Este método muestra una ventana en la que puedes indicar un archivo y devuelve la ruta del archivo.

      Investiga un poco ese tema, lo juntas con las instrucciones para importar las imágenes y ya lo tienes. No tengo tiempo para responder más.

      Saludos.

      Eliminar
  19. COMO PUEDO MODIFICAR EL CÓDIGO PARA SELECCIONAR DE LA CARPETA LA FOTO QUE DESEO AGREGAR, E INTENTADO IMAGINAR UNA MODIFICACIÓN CON GetOpenFileName PERO NO DOY AYUDDADADADADADADADA

    ResponderEliminar
  20. ah lo estoy intentando con un control activex de imagen para incrustarselo

    ResponderEliminar
    Respuestas
    1. Si investigáis un poco por Internet no es tan difícil:

      Dim Ruta As Variant

      Ruta = Application.GetOpenFilename("Archivos de JPG (*.jpg), *.jpg")

      If Ruta <> False Then
      Range("A1").Select
      ActiveSheet.Pictures.Insert (Ruta)
      End If

      Saludos.

      Eliminar
  21. hola como puedo por medio de un una celda mostrar dos imágenes al mismo tiempo desde una carpeta que la tengo en el disco c, que se llama imagen

    ResponderEliminar
  22. Buenas tardes David,
    Mi nombre es Rafa y en primer lugar quiero felicitarte por el blog y tus grandes conocimientos, pero sobretodo agradecerte que los vuelques aqui para que podamos instruirnos las mentes inquietas como yo, aún siendo simples usuarios de Office.
    He seguido todos tus cursos y me parecen fantásticos. Mi pregunta está relacionada con la importación de fotos. ¿Cómo podría utilizar tu ejemplo, modificándolo, para importar una imagen, la que elija en cada momento, desde una carpeta de mi PC y que se inserte en tres celdas de una misma hoja, manteniendo el mismo tamaño de las celdas (que son iguales)?
    Muchas gracias!

    ResponderEliminar
    Respuestas
    1. Hola Rafa

      Gracias por las felicitaciones. En cuanto a tu duda, ahora mismo no puedo dedicar ni un minuto a resolver dudas personales. No los tengo, lo siento, solo problemas con el contenido de los vídeos.

      Saludos.

      Eliminar
  23. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  24. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  25. De verdad que lo intento y hay un error que no logro identificar. tendrás forma de pasar el código o el libro de Excel a mi correo?

    ResponderEliminar
    Respuestas
    1. Hola

      Siento no responder antes, estaba de vacaciones. Mándame el archivo para que lo mire.

      Saludos.

      Eliminar
  26. en el caso de contener sub carpetas y estos tengan imágenes independientes contenidos en cada una de las sub carpetas te carga todas.. no hay un código para que cargue solo de la carpeta selecccionada

    ResponderEliminar
    Respuestas
    1. Pues la verdad es que no se que te ha pasado pero a mi solo me carga las de la carpeta que he indicado. Las de las carpetas que están dentro de la que he seleccionado, no. Lo acabo de probar ahora.

      Saludos.

      Eliminar
  27. BUENAS TARDES DESDE VENEZUELA, LE ENVIE UN EMAIL CON ALGUNAS IMAGENES DE MI PROBLEMA POR ESO NO LO MUESTRO AQUI PARA VER DE QUE MANERA ME PUEDE AYUDAR, GRACIAS-

    ResponderEliminar
    Respuestas
    1. Buenas Ali

      Ando escaso de tiempo y no había visto tu correo. Si solo tienes mal lo que me muestras en las imágenes que me enviaste es que en lugar de poner Integer, pusiste Interger, te sobra una r.

      A ver si es eso.

      Saludos.

      Eliminar