martes, 22 de mayo de 2012

VBA: Una macro en Excel para insertar imágenes.

Finalizando con este post la serie de artículos sobre el tratamiento de imágenes, hoy explicaré como, mediante una macro de Excel podemos listar los ficheros contenidos en una Carpeta y en qué forma, aprovechando los nombres de esos ficheros (imágenes), los insertaremos en las celdas contigüas respectivas, adecuando el tamaño de la celda.
Es por tanto un resumen de las entradas anteriores, añadiendo a éstas la instrucción .Picture.Insert que habilita la inserción de imágenes si trabajamos con Excel 2007 o Excel 2010.

En el ejemplo sobre el que trabajo la ruta es fija, definida sobre una variable incluida en la macro de Excel, en particular: D:\BancoFotos\
Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub FicherosCarpeta()
'www.excelforo.com
Dim Ruta As String
Dim Fotos As Object
Dim rng As Range, celda As Range

'Saltamos posibles errores
On Error Resume Next
Application.ScreenUpdating = False
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim img As Shape
'si existe alguna foto, la borro:
On Error Resume Next
For Each img In ActiveSheet.Shapes
     If img.Type = 11 Then img.Delete
Next
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Creamos el objeto FileSystemObject que
'proporciona acceso al sistema de archivos de un equipo
Set fso = CreateObject("Scripting.FileSystemObject")
'Indicamos la ruta de donde vamos a obtener
'los ficheros, en este caso D:\BancoFotos
Ruta = "D:\BancoFotos\"
'definimos dos variables que necesitaremos,
'para recuperar el nombre de la carpeta, y los ficheros que haya dentro
Set Carpeta = fso.GetFolder(Ruta)
Set ficheros = Carpeta.Files
'damos un título en negrita para la celda A1
With Range("A1")
    .Value = "Ficheros de la carpeta " & Ruta
    .Font.Bold = True
End With
'escribimos los ficheros, a partir de A2
Range("A2").Select
For Each archivo In ficheros
    'escribimos el nombre del fichero
    ActiveCell = archivo.Name
    'bajamos una fila
    ActiveCell.Offset(1, 0).Select
Next archivo
ActiveCell.EntireColumn.AutoFit
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Set rng = Worksheets("Hoja1").Range("A2:A5")
For Each celda In rng
If Len(Trim(celda)) > 0 Then
        'defino la celda equivalente de la columna A y la selecciono
        Set r1 = Cells(celda.Row, "B")
        r1.Select
        'se inserta la imagen de la ruta definida
        Set Fotos = ActiveSheet.Pictures.Insert(Ruta & celda.Value)
        'con la posición definida respecto a la celda de la columna B seleccionada
        With Fotos
            .Top = r1.Top
            .Width = .Width / 1.5
            .Height = .Height / 1.5
            .Left = r1.Left + (r1.Width - Fotos.Width) / 2
            .ShapeRange.LockAspectRatio = msoFalse
             r1.EntireRow.RowHeight = .Height
            .Placement = xlMoveAndSize
        End With
    r1.Select
End If
Next celda
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Limpiamos los objetos y variables definidas
Set fso = Nothing
Set Carpeta = Nothing
Set ficheros = Nothing
Set rng = Nothing
Set r1 = Nothing
Set Fotos = Nothing

Application.ScreenUpdating = True
End Sub


En esta entrada lo más importante, y novedoso respecto a las anteriores explicaciones, es la parte del código VBA donde se recorre el rango A2:A5 donde se insertaron los nombres de los ficheros de imagen, para ir incorporando en la celda contigüa (columna B) la imagen que le corresponda por nombre:
ActiveSheet.Pictures.Insert(Ruta & celda.Value)

Podemos ver en imágenes el antes y después de la ejecución de la macro 'FicherosCarpeta':

VBA: Una macro en Excel para insertar imágenes.


Si ejecutamos la macro asignada al botón Listar e Insertar imágenes obtendríamos:

VBA: Una macro en Excel para insertar imágenes.


Consiguiendo lo que pretendíamos, es decir listar el contenido de ficheros de una carpeta de nuestro equipo, e insertar a nuestra Hoja de cálculo de Excel las imágenes de esa carpeta.

115 comentarios:

  1. Hola excekforo,
    Una consulta he creado un botón para insertar las imágenes lo activo y me las importa las imágenes hasta ahí bien, creo otro botón para borrarla y no sé de adonde asignarle la macro, ya que en la ventana de asignación de macro solo me sale un nombre que es insertar imágenes si me puedes Orientar de como hacerlo.
    Gracias
    Marcelo.

    ResponderEliminar
    Respuestas
    1. Hola Marcelo,
      el botón de 'Borrar imágenes' corresponde a la macro explicada en un post anterior:
      http://excelforo.blogspot.com.es/2012/05/vba-una-macro-de-excel-para-borrar-solo.html
      Un cordial saludo

      Eliminar
  2. Hola excelforo, un placer saludarlo:
    Quisiera saber, a mi me barra las Imágenes pero no me borra las lista de los nombres de las imágenes eso es normal o es algo te he hecho mal.
    gracias...
    Anabel

    ResponderEliminar
    Respuestas
    1. Hola Anabel,
      si la macro está construida para borrar sólo las imágenes, dejando el listado de nombres.. aunque también se podrían borrar añadiendo otra línea de código.
      Asi que no has hecho nada mal...
      ;-)
      Slds

      Eliminar
  3. Hola excelforo,

    Yo inserto una imagen con la siguiente línea:

    ActiveSheet.Pictures.Insert(rutaDeImagen).Select

    Lo hace perfectamente, el problema que tengo es que en cuanto la imgen ya no se encuentra en ruta determinada en la hoja desaparece dejando un recuadro. Esto es por que en realidad lo que hace esa línea es vincular a la imagen insertada.

    Mi pregunta es:

    ¿Cómo hacer para que la imagen insertada en la hoja no dependa de la imagen original?

    Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola,
      bueno, esa línea de código inserta una imagen existente en una ruta concreta (en un directorio del equipo o algún servidor), asi que hasta cierto punto es verdad que hay un 'vínculo', ya que si no existe ese fichero de imagen la instrucción intenta insertar un objeto imagen que al no existir lo deja vacío, con ese recuadro que comentas.
      Esto es, se replica la acción de insertar una imagen desde la ficha Insertar > Ilustracones.

      Hasta donde yo sé para evitar esa vinculación tendrías que emplear una instrucción de copiado y pegado de imagenes, pero para ello deberías trabajar sobre una imagen particular (no un fichero) localizable en algún documento de Office para poder referenciarlo de alguna manera.

      Slds

      Eliminar
    2. Muchas gracias por contestar, trabajaré en lo que has dicho y si tengo éxito comentaré el resultado. Muchas gracias de nuevo y un saludo

      Eliminar
  4. Muy util. Gracias por el post.
    Pregunta. No me esta pegando las imagenes al lado de los ficheros.
    La macro pone los nombres de los ficheros, pero no las fotos. Que puede estar pasando?

    ResponderEliminar
    Respuestas
    1. Hola!!
      es raro, por que si te pone los nombres de los ficheros es que los tiene localizados... asegurate que la ruta de la carpeta es correcta, que no le falta ninguna barra \, es lo único que se me ocurre.
      Por que ¿estás trabajando con Excel 2007 ó 2010, verdad?
      Slds

      Eliminar
    2. Muchas gracias por la pronta respuesta!
      Faltaba colocar una barra al final del directorio. Error de novato!

      Eliminar
    3. Buen día.
      Yo también estoy penando con esta línea, porque inserta las imágenes, pero cuando el archivo lo envío por correo las imágenes salen "x".

      Pero cuando inserto la imagen con los botones normales del excel, la imagen se queda en el archivo y al mover la carpeta de imágenes, no afecta el libro.

      Para obtener la ruta de la imagen uso getopenfilename(), y el resultado lo coloco como variable del pictures.insert....

      Hay alguna otra forma de insertar la imagen y que se quede en el libro, como ya mencioné yo envío por correo los archivos, y obvio que la pc destino no está la imagen insertada.

      Muchas gracias

      Eliminar
    4. Hola Victorio,
      normalmente lo que hacemos es copiar y pegar imágenes de otras rutas.. por eso se mantiene la imagen en el fichero... pero al insertarlas de la manera que se explica, efectivamente ocurre lo que comentas.. ya que deja de existir el vínculo...

      Buscaré a ver si existe una solución práctica..
      Slds

      Eliminar
  5. Hola. Muchas gracias por toda la informaciòn que nos dan.
    Tengo una duda. He creado una macro en Excel, la cual me grafica unos datos de unas columna. En VBA he creado un botón el cual por medio de "Call (Nomnbre de la macro)" me activa la macro en excel, hasta ahí todo muy bien. Lo que necesito es que ese grafico que se genera en Excel me quede insertado en la interfaz que tengo de VBA. Muchas gracias por la ayuda. Visito mucho este blog.

    ResponderEliminar
    Respuestas
    1. Gracias a ti Camilo!
      No acabo de comprender a que te refieres con que el gráfico quede insertado en la interfaz de VBA ????.
      ¿Te refieres a insertarlo dentro de un UserForm???

      Slds

      Eliminar
    2. Si, a eso me refiero. A insertarlo dentro de mi UserFrom. Es decir, el grafico generado en la hoja de calculo de Excel me quede insertado en mi UserFrom. Muchas gracias por la respuesta.

      Eliminar
    3. Ok,
      subiré un post para explicar el proceso en los próximos días.
      Un saludo

      Eliminar
    4. Muchas gracias. me gustaria que me dieras los codigos, si ya los tienes. Lo que pasa es que eso es lo ultimo que me falta para entregar el proyecto y este mismo hay que entregarlo el viernes 15 de febrero

      Eliminar
    5. Lo siento, pero no lo tengo aún...
      en los próximos días.
      Slds

      Eliminar
    6. Listo amigo, yo espero entonces. Muchas gracias por la atención.

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

    ResponderEliminar
  7. Estimados!
    Necesito enviar 2 imagenes de la hoja activa por mail... arme el mail con los datos que necesito, pero no se como colocar las imagenes. me podrian ayudar por favor.
    saludos!

    ResponderEliminar
    Respuestas
    1. Hola!
      te adjunto un link a una web donde se explica (y desarrolla) una macro para tal acción.
      http://www.anshumusing.co.in/sending-email-outlook-excel-vba-macro/

      Creo que responde a lo que necesitas...
      Slds

      Eliminar
    2. Muchas Gracias por la rápida repuesta!!! lo que necesito es enviar una imagen que se encuentra en la hoja activa "1 Gráfico". esa imagen puede estar en el body del mensaje o como adjunto...
      en el enlace, no aparece esa opción y es la que me esta sacando canas!!
      ja!
      si se te ocurre me avisas? Te agradesco nuevamente!

      Eliminar
  8. Hola muchas gracias, muy completo el tutorial, acá tu ajustas la celda a la imágen, como sería al revés, es decir, ajustar la imagen a la celda?
    saludos

    ResponderEliminar
    Respuestas
    1. Hola,
      bien, lo primero sería determinar la dimensión de la celda mediante variables; tendrás que usar las propiedades
      altocelda=ActiveCell.RowHeight
      anchocelda=ActiveCell.ColumnWidth
      para luego dar a la imagen ese ancho y alto, sobre el código del post, sería algo así:
      With Fotos
      .Top = r1.Top
      .Width = anchocelda
      .Height = altocelda
      etc, etc

      Quizá haya que tener cuidado con las unidades de medida, pero la idea sería esa.
      Espero te sirva.
      Slds

      Eliminar
    2. muchas gracias!!!!
      saludos

      Eliminar
  9. Hola buen día, muy interesante esto de las macros, actualmente uso excel para presupuestar o cotizar trabajos digamos pisos epoxicos y de los cuales hay muchos tipos, por lo general incluyo imágenes ilustrativas de lo que estoy cotizando de la manera tradicional "insertar imagen de", y ya que tengo armada la cotización por lo regular 3 hojas tamaño carta la guardo como pdf y la envió al cliente, ahora bien me pregunto si de alguna manera por medio de macros podría llamar las imágenes que necesito para cierta cotización colocandolas en una de las hojas digamos que esta hoja sea solo para imágenes muestra de lo cotizado (maximo 4 a 6 imagenes), y otra pregunta seria como colocarle un foliador de cotizaciones digamos por fecha ejemplo 13031814:20 donde (13año 03mes 18dia 14:20hora). Gracias

    ResponderEliminar
    Respuestas
    1. Hola Norberto,
      echa un vistazo a esta entrada
      http://excelforo.blogspot.com.es/2011/08/como-asociar-una-imagen-al-valor-de-una.html

      De esta manera podrás buscar la foto asociandola a cada cotización.
      Espero te pueda servir.

      Respecto a la otra cuestión de obtener ese 'foliador' podrías formularlo así:
      =DERECHA(AÑO(AHORA());2)&MES(AHORA())&DIA(AHORA())&HORA(AHORA())&":"&MINUTO(AHORA())

      ahora bien, ojo por que esta fórmula actualiza su valor cada vez que se recalcule la hoja!!!
      Slds

      Eliminar
    2. Gracias todo funciono excelente, lo del folio, lo de las imágenes, inclusive agregue que se guardara como un pdf con nombre a base del folio y cliente, también agregue macro para convertir el importe de la cotización a texto y le agregue la opción en moneda nacional y en usd.
      Ahora lo que me faltaría y espero me puedas orientar es que me separe las hojas al momento de mandar a pdf o imprimir. Espero me entiendas lo que quiero es que imprima hasta donde tengo el importe total de la cotización (por decir la fila 40 donde el importe total lo tengo en la celda M40) la cotización puede ser o abarcar una,dos o tres hojas. Lo que esta después de la fila 40 lo pase o siga imprimiendo en la siguiente hoja.
      Gracias

      Eliminar
    3. Hola Norberto...
      habría que tener localizado, supongo mediante alguna variable o bien mediante un .Find que indique la fila donde corta y pasa a la siguiente página a imprimir, y luego incorporar la propiedad HPageBreaks que añade un Salto de página en la impresión...

      Slds

      Eliminar
    4. buscando aquí y allá con esto soluciono lo del el rango de impresión y la creación y guardado del PDF para archivo e impresión.

      'para insertar salto de pagina

      Sub Saltoparaimpresion()
      Function ACNColocaSaltos(CeldaInicial As String, CeldaFinal As String, Palabra As String)
      CeldaInicialColumna = Mid(CeldaInicial, 1, 1)
      CeldaInicialFila = Val(Mid(CeldaInicial, 2))
      CeldaFinalColumna = Mid(CeldaFinal, 1, 1)
      CeldaFinalFila = Val(Mid(CeldaFinal, 2))
      For Fila = CeldaInicialFila To CeldaFinalFila
      For Columna = Asc(CeldaInicialColumna) To Asc(CeldaFinalColumna)
      celda = Trim(Chr(Columna)) + Trim(Str(Fila))
      If Range(celda).Value = Palabra Then
      Rows(Fila).Select
      ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
      End If
      Next
      Next
      End Function

      Sub macroacn()
      If ACNColocaSaltos("A1", "A80", "salto") Then
      MsgBox ("PROCESO TERMINADO")
      End If
      '
      'Para convertir a PDF y guardar en x carpeta, bautizando el nombre de dicho PDF con lo que esta en la Celda B3 y B2
      '
      ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
      Filename:="C:\x carpeta\" & Range("B3").Value & "_" & Range("B2").Value, Quality:=xlQualityStandard, _
      IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True

      End Sub

      Muchas gracias por tu ayuda, aclaro que esto que estoy colocando aquí es creación de otras personas ya que no tengo mucho conocimiento de programación en VBA, pero buscando se encuentra.
      Espero tus comentarios y/o sugerencia al respecto y si se puede mejorar te lo agradecería.
      Y por supuesto cuenten con una donación para el foro.

      Eliminar
    5. Hola Norberto,
      nada que decir al respecto.
      La función parece que añade un Salto de página horizontal cuando entre las celdas del rango definidio por CeldaInicial y CeldaFinal encuentra una con el texto Palabra.
      La segunda macro exporta el archivo como PDF, empleando para generar el nombre del archivo las celdas B3 y B2.

      Muchas gracias por el aporte, siempre son bienvenidos...
      Un cordial saludo!!!

      Eliminar
  10. hola,

    MUCHAS GRACIAS POR TU TRABAJO

    he estado trabajndo con tu macro:

    For Each archivo In ficheros
    'escribimos el nombre del fichero
    ActiveCell = archivo.Name
    ActiveCell.Offset(0, 1) = archivo.DateCreated
    ActiveCell.Offset(0, 2) = archivo.DateLastAccessed
    ActiveCell.Offset(0, 3) = archivo.DateLastModified
    ActiveCell.Offset(0, 4) = archivo.Typwidthwite
    ActiveCell.Offset(0, 5) = archivo.Size
    ActiveCell.Offset(0, 6) = archivo.shortpath
    ActiveCell.Offset(0, 7) = archivo.shortname
    ActiveCell.Offset(0, 8) = archivo.Attributes
    ActiveCell.Offset(0, 9) = archivo.Path


    pero me falta una cosa, a mi me gustaría tambien saber el tamaño en pixeles de las imagenes; es decir yo tengo una carpeta con solo imagenes y además de los datos que has introducido debería poder extraer los datos de altura y anchura en pixeles de la imagen.

    Me puedes ayudar.

    Muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola!!,
      pues he repasado mis notas, y me parece que la propiedad Dimension es una de las pocas que no se pueden extraer...
      echa un vistazo también a
      http://excelforo.blogspot.com.es/2012/12/vba-como-cambiar-las-propiedades-de-un.html

      Seguiré buscando, por si acaso exite alguna opción..
      Slds

      Eliminar
  11. Un Favor ando perdido tengo una macro hecha en office 2003, trabaja muy bien inserta las imágenes por medio de Picture.Insert en office 2007 trabaja igual pero ahora en Office 2010 segun las pega pero no las deja ahi como antes lo hacia, si quiero abrir el archivo en otra maquina u la mando por correo cuando lo abren las imagenes no se muestran solo se ve un cuadro con una "x" me pueden ayudar por fa

    ResponderEliminar
    Respuestas
    1. Hola Rubén,
      no sabría decirte, Picture.Insert hace precisamente eso, insertar una imagen en la hoja de cálculo, por lo que debera mantenerse ahí para cualquier usuario... es decir, no hay un vínculo de imagen con su procedencia.
      Si te funciona bien con Excel 2007 debe hacerlo también para Excel 2010...

      De todas formas buscaré algo de documentación al respecto, a ver si encuentro algo.
      Slds

      Eliminar
  12. Está excelente tu código, solo que tengo un problema, al abrir el archivo de excel con las imágenes en otra PC, en la que no se encuentra la carpeta con los archivos de las imágenes, no las muestra, quisiera saber como podríamos hacer que las imágenes queden dentro del archivo de excel y no como referencia a un archivo en una carpeta externa.

    ResponderEliminar
    Respuestas
    1. Hola Natanael,
      la cuestión del ejemplo explicado en el post es la vinculación de una imagen (que insertaremos) respecto al valor de una celda 8en la que se encuentra la ruta).
      Quiero decir con esto que el problema no es el método Insert que inserta sin más una imagen, si no en la ruta dada en la celda.
      fijate en que lo primero que se hace con la macro es borrar las imagenes exitentes...
      Si tu quieres mantener las imágenes (independientemente de donde esté el fichero y la ruta) simplemente tendrías que insertalas una vez y no volver a ejecutar la macro, así tendrías las imágenes cargadas automáticamente (la primera vez) y en posteriores ocasiones no se haría necesario volver a cargarlas...

      Espero haber comprendido tu planteamiento
      Slds cordiales

      Eliminar
  13. excelforo, excelente aporte, me ha servido muchisimo!!!! gracias!

    ResponderEliminar
  14. Buenas ..
    Necesito realizar una macro que me copie la formula que esta en la fila de arriba con la excepción que en la nueva fila que se cree ,tiene que cambiar el nombre del libro EJ

    En la celda B7 tengo esta formula


    =AÑO('[03-2013.xlsm]TABLERO GESTIÓN'!$B$30)&-CONSULTAV((MAX('[03-2013.xlsm]TABLERO GESTIÓN'!$A$37:$A$37));'[03-2013.xlsm]TABLERO GESTIÓN'!$A$37:$Q$37;1;0)

    En celda B8

    =CONSULTAV((MAX('[03-2013.xlsm]TABLERO GESTIÓN'!$A$37:$A$37));'[03-2013.xlsm]TABLERO GESTIÓN'!$A$37:$Q$37;3;0)
    Tengo celdas con formulas que es de la B8 hasta Q8 que es la misma ...

    Esas formulas sacan de datos de otro libro que se llama 03-2013 lo que quiero es que cuando se cree la nueva fila con las formula.. automáticamente me cambie la formula con el nombre de libro 04-2013 si quiero crear otra después de la 04-2013 cree 05-2013 y asi ...
    Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola,
      no es necesario aplicar macros para tal cosa, bastaría aplicaras la función INDIRECTO.
      Tendrías que reemplazar el nombre y ruta del fichero [03-2013.xlsm] por un texto que concatene una variable (con valor 3,4,5,6, etc) con el resto del texto '-2013.xlsm]'; por ejemplo, la variable, al ir copiando hacia abajo en la misma columna desde la fila 8, podrías conseguirla con la funcion FILA()-4 que en la celda B8 nos daría el cuatro, concatenado con:
      "'[0"&FILA()-4&"-2013.xlsm]TABLERO GESTIÓN'!$B$30"
      tendríamos la ruta del archivo correspondiente.

      Por ejemplo, para la primera parte de la fórmula, quedaría:
      =AÑO(INDIRECTO("'[0"&FILA()-4&"-2013.xlsm]TABLERO GESTIÓN'!$B$30"))
      De manera similar para el resto...

      Slds

      Eliminar
    2. Buenas gracias por responder...
      Resulta que tengo un libro que es Principal que este saca datos de una carpeta llamada Caracterizaciones y dentro de ella tiene libros llamados en secuencia 01-2013 02-2013 03-2013 y asi cada mes se agrega uno nuevo siguiendo el numero de mes.
      Lo que quiero es hacer que cuando se agrege un nuevo libro la formula cambie como lo mencione antes...

      O lo otro seria no se si es posible alguna macro para cuando se agrege un libro nuevo en la carpeta Caracterizaciones el libro Principal detecte que se agrego uno nuevo libro y me copie la formula de la fila de arriba a la de abajo pero cambando el nombre del libro...

      Muchas gracias por tu interes..

      Eliminar
    3. Hola,
      correcto... eso es lo que te propuese con la fórmula anterior, con esas fórmulas y esos oconcatenados de texto, podrás copiar y arrastrar tu fórmula y que se adecúe al nuevo fichero en esa carpeta 'Caracterizaciones'.
      Añadele al texto la ruta completa, por ejemplo
      "C:\Caracterizaciones\'[0"&FILA()-4&"-2013.xlsm]TABLERO GESTIÓN'!$B$30"

      Que una macro detecte si existe un nuevo fichero en una carpeta lo veo complicado.. evidentemente se podrían recorrer los ficheros de esa carpeta para buscar una celda de alguna de susu hojas.. pero parece difícil vincularlo a una fórmula y una celda concreta para un Nombre de fichero en particular.

      Te recomendaría aplicaras la fórmula descrita.
      Slds

      Eliminar
    4. Disculpa
      Resulta que aparece #!REF¡ el tema es que ese libro principal lo van a tener varias personas. quiero tener las formulas con la secuencia de los libros para cuando se agregen los libros a la carpeta no exista problema en que saque los datos..

      Ej el libro llamado 05-2013 todavia no esta en la carpeta Caracterizaciones por eso quiero que al momento de agregar el libro 05-2013 el libro principal ya tenga esa formula llamando al la ruta del libro 05-2013

      No se que hacer!!

      Eliminar
    5. Si general la fórmula con el vínculo a un Libro, como comentaba más arriba, lógicamente mientras que no exista el libro te saltará un error... pero tambiéb es cierto que en el momento que el Libro se genere en esas carpeta (donde indica la ruta) el valor será devuelto.
      Poco más se pude hacer mientras no exista el Libro.
      Slds

      Eliminar
    6. Muchas gracias por tu ayuda...

      Eliminar
  15. Hola

    Resulta que tengo un problema con una ruta para ir a un disco en red para ir a una carpeta he intentado mucho y nada
    este es el codigo

    He puesto esta ruta y no funciona algo falta

    \\ newton \ users \ 9PRODUC \ RPeredo\ caracterizaciones \.



    Option Explicit

    Private Sub Worksheet_Change(ByVal Target As Range)

    Dim l1 As Worksheet
    Application.ScreenUpdating = False
    Set l1 = ThisWorkbook.Sheets("Base dato")
    On Error GoTo x

    Dim Carpeta As String

    Dim formato

    Dim fecha

    Carpeta = "aqui va la ruta"
    If Target.Text = "" Then Exit Sub

    formato = Format(Range("M5"), "mm-y")

    Workbooks.Open (Carpeta & formato)
    Sheets("TABLERO GESTIÓN").Range("A1:Q34").Copy

    l1.Range("B9").PasteSpecial _

    Paste:=xlPasteValuesAndNumberFormats, _

    Operation:=xlNone, _

    SkipBlanks:=False, _

    Transpose:=False
    ActiveWorkbook.Save

    ActiveWorkbook.Close

    Hoja13.Select

    Exit Sub

    x:
    fecha = Range("M5").Value
    Sheets("Base dato").Range("B12:R42").ClearContents
    MsgBox "Por el momento no existen datos manuales con Fecha ( " & fecha & " ) ,64,"Información"
    End Sub


    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola,
      es difícil decir... pero podrían ser un par de cosas.
      Una primera, la más probable, es que al definir la variable formato tendrías que haberlo hecho, no con Format, si no como cadenas contatenadas:
      ....
      Dim formato As String
      formato = Mid(Range("M5").Value, 4, 2) & "-" & Year(Range("M5").Value)
      Workbooks.Open (Carpeta & formato)
      ....

      La otra posibilidad es que la ruta no la esté reconociendo... quizá, la falte la unidad??

      Eliminar
  16. Hola ayuda por favor:
    Necesito cargar una imagen, cada vez que ingrese un código ejemplo.
    Ingreso código en la celda A2, se inserta imagen en la celda B2
    Ingreso código en la celda A3, se inserta imagen en la celda B3
    La idea es la misma las fotos las tendré en una carpeta junto con el excel.

    Saludos
    Frank

    ResponderEliminar
    Respuestas
    1. Hola Frank,
      el código explicado trabaja recorriendo rangos, por tanto lo que necesitas es rediseñar eliminando las partes FOR EACH y cmabiándolo por una evaluación de celda activa (por ejemplo), quizá con unmétodo INTERSECT sobre el rango A2:A100 (el que sea):
      http://excelforo.blogspot.com.es/2011/06/vba-el-metodo-intersect.html
      de tal forma que una vez seleciones alguna de esas celdas A2:A3 disponga (emplenado el método del post) en la celda contigua la imagen correspondiente.

      Slds cordiales

      Eliminar
  17. Hola Ismael!
    Tengo una duda. Resulta que estoy tratando de realizar unos gráficos mediante VBA, y todo me ha funcionado muy bien en cuanto a crearlos, y cambiarle los formatos de las series. Necesitaba que cada gráfico se ajustara en un determinado rango, para lo cual ocupé (dentro del código del gráfico), este código (lo que está después de la instrucción AddChart2)
    ActiveSheet.Shapes.AddChart2(233, xlLineMarkers).Select
    'Desde aquí hacia abajo, asigno el Rango.
    Set Rng= Range("$A$94:$D$115")
    With ActiveSheet.ChartObjects
    .Top = Rng.Top
    .Left = Rng.Left
    .Width = Rng.Width
    .Height = zona.Height

    Para un gráfico, funciona bien. El problema está cuando ocupo una instrucción similar (con otro rango, por ejemplo E94:H115). Al insertar este segundo gráfico, se me cambian ambos de posición.

    ¿Hay alguna forma de que estos no se cambien de posición?

    Muchas gracias!!

    Saludos,
    Mauricio.

    ResponderEliminar
    Respuestas
    1. Hola Mauricio,
      diría que podrías afinar más con la posición, definiendo qué Gráfico en particular es
      es decir, en lugar de
      With ActiveSheet.ChartObjects
      .Top = Rng.Top
      ...
      algo más concreto
      With ActiveSheet.ChartObjects(1)
      .Top = Rng.Top
      ...
      esto es, la numeración del gráfico.. así no habrá duda de a qué gráfico se refiere...
      Debería ser suficiente.
      Comentas cualquier cosa
      Un saludo

      Eliminar
    2. Buen dia en mi caso quisiera que me ayudarán.

      Yo quisiera que en un picture de VBA de excel 2007, pudiera incluir mas de una imagen ademas que las imagenes se cambiaran cada cierto tiempo, me podrian proporcionar dicho codigo

      Gracias

      Eliminar
    3. Hola,
      una Picture es una imagen, que además debe existir previamente (ser algún archivo con formato de imagen...), por tanto para 'incluir mas de una imagen' tendrías que trabajarlo fuera de Excel...
      Otra forma sería agrupar imágenes existentes en la hoja de cálculo (por cualquier medio), pero igualmente las imágenes debes existir.

      Respecto a que cambie cada cierto tiempo, podrías emplear el método OnTime, perotendrías que aplicar alguna regla que fuera 'bailando' entre ficheros de imágenes existentes...

      Lo que quiero transmitir es que una programación, de cualquier tipo, debe responder a modelos y reglas (algortimos) muy claramente definidos.

      Saludos

      Eliminar
  18. Muy buenas,

    Podrías apoyarme con una macro que logre hipervincular los nombres de varias imágenes (p.e. a.jpg, b.jpg, c.jpg, etc) que están en una columna, con las imágenes, propiamente dichas, que están en la siguiente carpeta: "D:\BancoFotos\". Para logra que con un click en el nombre de la imagen abra dicha imagen. Gracias de antemano.

    ResponderEliminar
    Respuestas
    1. Hola Juan,
      tendrías que generar un evento _doubleclick en esa hoja de trabajo, de tal forma que abra el fichero (imagen .jpg) en la ruta especificada...

      Escribiré un post en el blog en cuanto pueda, pero te adelanto que podrías emplear la función API ShellExecute.

      Te adjunto un detalle de la ayuda de Microsoft mientras tanto.
      Un cordial saludo

      Eliminar
  19. Seria posible extraer el icono del fichero e insertarlo en la hoja en vez de una imagen.

    ResponderEliminar
    Respuestas
    1. Hola, que tal. Un gusto saludarte igualmente.
      No entiendo a qué te refieres con 'extraer el icono del fichero'....
      Si puedes explicarlo algo mejor.
      Saludos

      Eliminar
    2. he realizado un código basado en tu ejemplo que recorre una carpeta determinada y muestra la información de los ficheros en la hoja de Excel.
      El nombre, la ruta, la localización del icono(objLink:IconLocation), etc.
      Ahora desearía poder extraer el icono y dibujarlo en la hoja de calculo.

      Eliminar
    3. Hola,
      te recomendaría emplearas la posibilidad de Insertar > Objeto...
      Guarda el código, y reemplaza las rutas por las que has conseguido previamente.
      Saludos cordiales

      Eliminar
  20. Ismael buenas tardes,

    Probé con la explicación que diste para que la imagen cambiara en función de un valor de una celda adyacente. Sin embargo, al cambiar "=INCRUSTAR("Paint.Picture";"")" por =foto, me sale un mensaje de error = "La referencia no es válida" pero al probar con este código me salen todas las gráficas de la carpeta. Existe la posibilidad de vincular las dos actividades, de tal forma que cada vez que seleccione de un filtro determinado valor, me inserte únicamente la gráfica correspondiente a ese valor. Gracias por adelantado por tu ayuda.

    ResponderEliminar
    Respuestas
    1. Hola,
      respecto al primer error que te devuelve, decirte que ese procedimiento funciona especialmente si trabajas con Excel 2007, y se deben seguir los pasos dados.. si falla algún nombre definido fallaría el modelo.
      Respecto a usar el código de esta entrada para replicar esa selección individual de fotos, si, claro es posible, sería necesario eliminar la primera parte de la macro que recorre la carpeta del Banco de fotos, quedándonos y retocando las líneas 45 a 65, eliminando de ahí el recorrido que hace por las celdas con las rutas...
      Bastaría entonces que le diéramos una sólo celda donde se encuentre la ruta para quedarnos con las líneas 47 a 64.

      Espero haberte orientado.
      Saludos

      Eliminar
  21. HOLA EXCEL FORO, estaba utilizando tu macro pero al ejecutar solo me copia el listado de las imagenes de la carpeta pero no me muestra las imagenes, como puedo hacer para que me ppueda mostrar, por otro lado estube utilizando una macro -- Range("B4").Select
    ActiveSheet.Pictures.Insert("C:\fotos PL\PL.jpg").Select
    Selection.ShapeRange.Height = 155.1417322835 --, pero cuando no encuantra una foto me arroja error, ¿como puedo hacer para que esta misma macro cuando no encuentre una imagen en la ruta simplemente no lo tome y pase a la siguiente", muchas gracias de antemano , este es mi mail si puedes ayudarme por favor, larrywiss@hotmail.com

    ResponderEliminar
    Respuestas
    1. Hola David,
      en primer lugar asegúrate que la ruta es la correcta, en el ejemplo aparece:
      Ruta = "D:\BancoFotos\"
      fíjate, es muy importante, de la última barra invertida \

      probablemente, si las fotos existen en esa dirección, ese sea el fallo.

      Para la otra cuestión, salvar la no existencia de la foto, podrías aplicar la instrucción
      On Error Resume Next
      .... aquí tu código
      On Error GoTo 0

      con esto conseguirás saltar a la siguiente instrucción de tu macro sin que te aparezca un error.

      un saludo

      Eliminar
  22. Hola, quisiera adaptar esta macro suponiendo que los nombres de las imágenes las tengo en la columna A (Se trata del numero de expediente de un alumno), y quisiera que al ejecutar la macro se colocara en la columna B, la imagen correspondiente a cada expediente, espero me puedan ayudar, de antemano se los agradezco infinitamente....

    ResponderEliminar
    Respuestas
    1. Hola Hugo
      ??
      no entiendo.. así es como está desarrollado en el ejemplo.
      En la columna A el nombre de la imagen y en la columna B la imagen
      ??

      Slds

      Eliminar
  23. Si pero en este caso, esos nombres no se necesitan cargar puesto que ya están capturados en la columna A, ahora en base a la que ya contiene esta columna A requiero que se inserten las fotos correspondientes. Dentro de mi carpeta tengo fotos numeradas del 0001 al 3000 consecutivamente, pero no requiero que se agreguen todas si no únicamente las que yo ya tenga registradas en mi columna A.

    Muchas gracias por su pronta respuesta
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Hugo,
      hay un par de alternativas...
      Una componer con un código muy similar una función VBA que cargue la foto correspondiente en base al nombre de foto indicada.
      Otra sería que del código del post quites la parte que inserta los nombres de las fotos, dejando sólo la que carga las imágenes en función de los valores de la columna A (filas 34-41 del código)

      Un saludo

      Eliminar
    2. Estimado Excelforo Ismael Romero; he intentado su segunda alternativa quitando únicamente las lineas que insertan los nombres, sin embargo no genera ningún resultado, no marca error alguno, a lo mejor se tenga que modificar alguna parte del la función que inserta las fotos, o alguna otra variable...

      Agradezco infinitamente su apreciable tiempo, saludos

      Eliminar
    3. ... hola.
      en principio bastaría con los nombres de las fotos estuvieran en la columna A
      ??
      Slds

      Eliminar
  24. Hola buenas noches tengo un problema porque nose como insertar imagenes tengo que hacer un macro de una base de datos por medio de codigo de barras y ya tengo todo pero nose como llamar las imagenes

    ResponderEliminar
    Respuestas
    1. Hola Roberto,
      no termino de comprender tu problema.
      Supongo dispondrás de una base de datos de imágenes.. cada imagen será un archivo (pdf, png, tif, etcétera) guardadas físicamente en alguna carpeta..
      Sólo tendrás que localizar para luego importarlo a Excel siguiendo el procedimiento expuesto.

      Espero haberte comprendido.
      Saludos

      Eliminar
  25. Hola Ismael,
    he creado un excel en el que en la hoja 1 insertas los datos y 2 imagenes.
    en las otras 7 hojas restantes, se autorrellenan con los datos de la hoja 1.
    Mi problema es que cuando el usuario inserta la imagen vba le asigna el nº 1 y el 2.
    Y depende del orden de inserción funciona Ok o no.
    Yo lo he tratado así:

    Sub Firmar()
    '
    ' Firmar Macro

    '
    Application.ScreenUpdating = False
    Sheets("Datos iniciales").Select
    'Selecciona la tercera imagen insertada
    Sheets("Datos iniciales").Shapes(2).Select
    Selection.CopyPicture

    End Sub
    Las imagenes se deben insertar dentro de un rango en este caso en el rango "B39:C45"
    Con el código de arriba funciona si insertan esta imagen en segundo lugar, si lo hacen en otro orden las copia al revés de lo deseado.
    Sabes como puedo hacer para que no haya esa obligacion de pegar en "orden".
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola!
      he releído un par de veces tu correo.. pero no termino de comprender el problema...
      mejor me envías una explicación más detallada a
      excelforo@gmail.com

      Slds

      Eliminar
  26. Hola Ismael,

    Una consulta como haría para cargar un imagen en una celda "D3", pero que dependa del nombre que yo le he asignado en una celda "C3". porque cuando yo hago todo el procedimiento me las carga pero no en el orden que yo las necesito.

    ResponderEliminar
    Respuestas
    1. Hola Mónica,
      la idea podría ser similar a la planteada en esta entrada, pero tratándolo como una función personalizada en VBA.. incluso algo más sencillo ya que no haría falta recorrer todos los archivos...

      Slds

      Eliminar
  27. Hola, Gracias por tus asesorías. Esta me ha funcionado bien excepto que no me puede insertar la imagen, aparece un recuadro que dice "no se puede ver la imagen vinculada", pero la ruta esta bien, sera un tema de formato de imagen, esta en PNG. que más puede ser?, gracias.

    ResponderEliminar
    Respuestas
    1. Hola Juan Manuel,
      es posible sólo admita jpg, bmp y algún otro formato.
      Normalmente el PNG no lo admite.

      Trata de convertilas a jpg y te funcionará
      :(

      Saludos

      Eliminar
    2. Hola, aún no me funciona, si me puedes ayudar dandole una revisada te lo agradeciari mucho:
      Sub FicherosCarpeta()

      Dim Ruta As String
      Dim Fotos As Object
      Dim rng As Range, celda As Range

      On Error Resume Next
      Application.ScreenUpdating = False

      Dim img As Shape

      On Error Resume Next
      For Each img In ActiveSheet.Shapes
      If img.Type = 11 Then img.Delete
      Next

      Set fso = CreateObject("Scripting.FileSystemObject")

      Ruta = ("C:\Users\Leidy Moreno\Desktop\Logos CC\")

      Set Carpeta = fso.GetFolder("C:\Users\Leidy Moreno\Desktop\Logos CC\")
      Set ficheros = Carpeta.Files

      With Range("A1")
      .Value = "Ficheros de la carpeta " & ("C:\Users\Leidy Moreno\Desktop\Logos CC\")
      .Font.Bold = True
      End With

      Range("A2").Select
      For Each archivo In ficheros

      ActiveCell = archivo.Name

      ActiveCell.Offset(1, 0).Select
      Next archivo
      ActiveCell.EntireColumn.AutoFit

      Set rng = Worksheets("Hoja1").Range("A2:A14")
      For Each celda In rng
      If Len(Trim(celda)) > 0 Then

      Set r1 = Cells(celda.Row, "B")
      r1.Select

      Set Fotos = ActiveSheet.Pictures.Insert("C:\Users\Leidy Moreno\Desktop\Logos CC")

      With Fotos
      .Top = r1.Top
      .Width = .Width / 1.5
      .Height = .Height / 1.5
      .Left = r1.Left + (r1.Width - Fotos.Width) / 2
      .ShapeRange.LockAspectRatio = msoFalse
      r1.EntireRow.RowHeight = .Height
      .Placement = xlMoveAndSize
      End With
      r1.Select
      End If
      Next celda

      Set fso = Nothing
      Set Carpeta = Nothing
      Set ficheros = Nothing
      Set rng = Nothing
      Set r1 = Nothing
      Set Fotos = Nothing

      Application.ScreenUpdating = True
      End Sub

      Eliminar
    3. Tu código, a simple vista, parece correcto....
      Tendría que ver el fichero con el que trabajas, con su estructura y tener el banco de fotos...
      Te recomiendo sigas literalmente lo expuesto, ya que está probado.
      Saludos

      Eliminar
  28. hola Ismael y como podría insertar solo imágenes?, copie tu código en Excel 2013, pero también me insertar los nombres de otros tipos de archivo.

    Se me ocurre colocar una condición con (If) en la parte de este código, pero no estoy seguro, es posible que me ayudes con esto.

    'escribimos los ficheros, a partir de A2
    Range("A2").Select
    For Each archivo In ficheros
    'escribimos el nombre del fichero
    ActiveCell = archivo.Name
    'bajamos una fila
    ActiveCell.Offset(1, 0).Select
    Next archivo
    ActiveCell.EntireColumn.AutoFit

    ResponderEliminar
    Respuestas
    1. Hola,
      puede ser una opción, colocar un IF..THEN para controlar la extensión
      IF right(archivo.Name,3)="jpg" THEN
      ....
      END IF

      dentro del bucle.
      Saludos

      Eliminar
  29. Gracias Ismael, ahora estoy intentando para guardar un rango como imagen con chart, la macro me funciona muy bien, pero cuando la automatice con un bucle para que me recorriera varios rangos y los fuera guardando, me funciona solo para dos rangos de hay en adelante me genera un error llamado "error en el método paste del objeto chart", pensaría que podría ser porque queda guardado en la memoria los objetos, pero la realidad es que no se que pueda estar ocasionando el error, sabes acerca del tema?

    ResponderEliminar
    Respuestas
    1. Hola,
      no sabría decirte... prueba limpiando el portapapeles después de caca copia/pega...
      Saludos
      P.D.: lee, por favor, las Normas de uso del blog

      Eliminar
  30. Buenas Tardes Ismael,

    Agradezco por tu colaboración en el tema, ha sido de gran ayuda, pero la verdad es que tengo un aproximado de 2781 imágenes las cuales ya monte en el libro de excel pero me solicitan que haga envió del archivo a un tercero para que lo pueda ver, el inconveniente es que la persona que tiene el archivo no puede ver las imágenes debido a que la macro enlazo las imágenes desde mi pc, por ende desearía tener conocimiento de como hago para que las imágenes se peguen en el libro de excel y no sea necesario las imágenes de mi pc.

    MUCHAS GRACIAS.

    ResponderEliminar
    Respuestas
    1. Hola Andrés,
      prueba con lo comentado por Carlos Ramirez en el comentario siguiente (más abajo).
      El método .AddPicture
      .AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height)
      permite guardar la imagen con el documento... La imagen insertada estará vinculada al archivo desde el que se creó.
      Saludos

      Eliminar
    2. Ismael Muchísimas Gracias,

      Por el momento me ha funcionado la formula pero para solo una imagen es decir, me escribe en la columna A los nombres de las 2781 imágenes pero en la columna B solo me inserta una sola imagen en todas las celdas, mira la macro que tengo es la siguiente:

      Sub FicherosCarpeta()

      Dim Ruta As String
      Dim Fotos As Object
      Dim rng As Range, celda As Range


      On Error Resume Next
      Application.ScreenUpdating = False

      Dim img As Shape

      On Error Resume Next
      For Each img In ActiveSheet.Shapes
      If img.Type = 11 Then img.Delete
      Next

      Set fso = CreateObject("Scripting.FileSystemObject")

      Ruta = "D:\BancoFotos\"

      Set Carpeta = fso.GetFolder(Ruta)
      Set ficheros = Carpeta.Files

      With Range("A1")
      .Value = "Ficheros de la carpeta " & Ruta
      .Font.Bold = True
      End With

      Range("A2").Select
      For Each archivo In ficheros

      ActiveCell = archivo.Name

      ActiveCell.Offset(1, 0).Select
      Next archivo
      ActiveCell.EntireColumn.AutoFit

      Set rng = Worksheets("Hoja1").Range("A2:A5")
      For Each celda In rng
      If Len(Trim(celda)) > 0 Then

      Set r1 = Cells(celda.Row, "B")
      r1.Select

      Set Fotos = ActiveSheet.Shapes.AddPicture("C:\Users\User\Desktop\DIMA\02D205.jpg", True, True, 100, 100, 70, 70)

      With Fotos
      .Top = r1.Top
      .Width = .Width / 1.5
      .Height = .Height / 1.5
      .Left = r1.Left + (r1.Width - Fotos.Width) / 2
      .ShapeRange.LockAspectRatio = msoFalse
      r1.EntireRow.RowHeight = .Height
      .Placement = xlMoveAndSize
      End With
      r1.Select
      End If
      Next celda

      Set fso = Nothing
      Set Carpeta = Nothing
      Set ficheros = Nothing
      Set rng = Nothing
      Set r1 = Nothing
      Set Fotos = Nothing

      Application.ScreenUpdating = True
      End Sub

      Quisiera saber si vez algún error en el que me puedas asesorar debido a que he pensado insertar los 2781 vínculos para traer todas las imágenes con la formula .AddPicture(Filename, LinkToFile, SaveWithDocument, Left, Top, Width, Height) .

      MUCHISIMAS GRACIAS.

      Eliminar
    3. Hola,
      tendrías que convertir en variable el parámetro 'filename' de
      ActiveSheet.Shapes.AddPicture("C:\Users\User\Desktop\DIMA\02D205.jpg", True, True, 100, 100, 70, 70)
      es decir, donde pones
      C:\Users\User\Desktop\DIMA\02D205.jpg
      deberías añadir un String (cadena de texto) que recoja el nombre de cada fichero...

      Saludos!

      Eliminar
    4. Hola Ismael,

      Que pena por la molestia, mira he intentado crear la variable que me ayude con este dilema que tengo,mira la verdad no soy muy bueno en VBA pero desearía saber si este string esta bien y recibir una asesoria tuya:

      Dim Img As String
      Img.Select

      Set Fotos = ActiveSheet.Shapes.AddPicture("C:\Users\User\Pictures\Juguetes\Nombre Nuevo\=Img", True, True, 100, 100, 70, 70)

      Muchs Gracias.

      Eliminar
    5. Si previamente has generado un String con el nombre del fichero de la imagen, más bien sería:
      Set Fotos = ActiveSheet.Shapes.AddPicture("C:\Users\User\Pictures\Juguetes\Nombre Nuevo\" & img, True, True, 100, 100, 70, 70)
      siendo img la variable String con el nombre de la imagen...
      Saludos

      Eliminar
  31. hola ismael!!!
    tu cidog me ayudo muchisimo y funciona bien en problema es cuando mando el archivo a otra maquina, se pierde en vinculo con de la imagenes.
    como puedo hacer para evitar esto?

    ResponderEliminar
    Respuestas
    1. A LOS QUE PERDIAN EL VINCULO
      de la imagen al copiar el archivo...
      Solucione mi problema agregando shapes en lugar de pictures

      Sheets(3).Shapes.AddPicture "C:\Users\..............\rojo.jpg", True, True, 100, 100, 70, 70
      El tercer parametro indica que la imagen se copiara en el archivo de excel
      lo probe y funciona perfectamente, no se pierden la imagenes al copiar a otra ubicacion

      Eliminar
    2. Muchas gracias por el aporte Carlos!

      Un saludo

      Eliminar
  32. Hola,
    Como podría añadir una fila entre imagen e imagen?
    Muchas gracias por tu gran ayuda

    ResponderEliminar
    Respuestas
    1. Hola Rubén,
      podrías localizar la fila donde comienza cada imagen con la propiedad .TopLeftCell, y una vez seleccionada aplicar el método Insert.

      Espero te oriente
      Saludos

      Eliminar
    2. Gracias! Voy a intentarlo. Por cierto, estoy utilizando tu macro para hacer una especie de catálogo. Mil gracias!

      Eliminar
    3. Hola Ismael, lo he conseguido pero he usado otro método:
      insertando la imagen cada dos filas con ActiveCell.Offset(2, 0).Select.

      Tengo una ultima duda...Estoy insertando las imágenes entre bordes y haga lo que haga simpre hay un borde que me queda tapado. Lo estoy haciendo de la siguiente manera:

      With Fotos
      .Top = r1.Top + 5
      .Width = 200
      .Height = 200
      .Left = r1.Left + 5
      .ShapeRange.LockAspectRatio = msoFalse
      .Placement = xlMoveAndSize

      El +5 de Top y de Left me deja al descubierto los bordes de arriba y de la izquierda, pero de esta manera el borde inferior me queda debajo de la imagen. ¿alguna idea de como solucionarlo? Gracias!

      Eliminar
    4. Hola Rubén,
      tendrás que ajustar el alto y ancho de la imagen al de la celda, adaptándolo según corresponda.
      Saludos

      Eliminar
    5. El problema es que cuando redefino los valores de la imagen la celda se autoajusta a esos valores. Es decir que si también muevo manualmente el alto de la fila, la imagen también se ajusta...

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

    ResponderEliminar
  34. Hola. Mi problema es el mismo que exponían mis compañeros en los comienzos de este foro (hace mil años): necesitaría que las imágenes estuvieran incrustadas y no vinculadas. He leído casi todo lo escrito anteriormente por vosotros e intuyo que no tenemos solución, verdad?
    Muchas gracias. Saludos

    ResponderEliminar
    Respuestas
    1. Hola Lida,
      leí en algún sitio sobre un método para conseguir lo que indicas:
      Shapes.AddPicture
      Buscaré algo más al respecto y subiré un post al blog.
      Slds

      Eliminar
  35. Te lo agradecería mucho Ismael. Investigaré yo también por ahí. Gracias
    Un saludo

    ResponderEliminar
    Respuestas
    1. Hola Lida, ¿encontraste alguna solución al respecto? Estamos buscando como incrustar imagenes, según el valor de 2 celdas, tipo código + color y que adquiera la imagen desde un directorio.

      Gracias y saludos!

      Eliminar
    2. Hola Pedro. En realidad yo solo busco colocar un montón de fotos que hay en una carpeta, en una columna de excel, una debajo de otra de forma estética, sin tener que hacerlo una a una. El código de este foro me lo hace perfectamente, pero las imágenes quedan vinculadas. He comprobado que una vez colocadas las imágenes, si las pego en la columna de al lado usando PEGADO ESPECIAL --> PEGAR COMO IMAGEN (y lo añado a la macro), quedarían incrustadas, pero me parece de lo más zafio jajaja. Seguiré investigando. Muchas gracias!!!

      Eliminar
    3. Hola Lida,
      en breve subiré un post explicando cómo incrustar imágenes ;-)

      Pedro,
      si quieres asociar la ruta a los valores de dos celdas tendrás que componer en la fila 24 del código algo así:
      Ruta=range("A1").value & "\" & range("A2").value & "\"
      según la ubicación y nombre...(tipo código+color)
      para componer la ubicación del fichero concreto.
      Ya no haría falta recorrer la carpeta, puesto has indicado la ubicación exacta...

      Slds

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

      Eliminar
    5. Hola Ismael,

      creo que no me he explicado bien. El objetivo sigue siendo incrustar imágenes que se encuentran en un directorio, el tema es que la imagen que se incruste (imágen fija), será en función a los valores de los campos de 2 celdas, por ejemplo una celda con nombre código y otro con nombre color.

      Gracias por tu ayuda y saludos,
      Pedro!

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

    ResponderEliminar
  37. Hola a todos.
    Es muy buena el excelforo.blogspot; consigues de todo; mucha información importante... Mi caso no lo he conseguido, ya me tiene verde con dolor de cabeza y pienso que no es muy complicado, pero no domino el tema, solo lo básico.
    Me explico: Tengo un archivo en excel 2007, el cual consiste en Evaluar a un Grupo de Funcionarios en su labor diaria. Los resultados me lo da la Hoja3, en donde se exponen quienes fueron los mas destacados; el trabajo ya lo tengo casi listo. Lo que deseo saber es si es posible que automáticamente se presente la foto tipo carnet utilizando el Control ActiveX, y le explico el porque, porque a través de ésta herramienta me permite presentar la foto en donde se quiere; hasta la fecha no lo he logrado.
    Tengo la ruta c:\COP\ en donde se guardan las fotos, las fotos son .JPG, de tamaño pequeñas de poco kb. Las fotos tienen el mismo nombre del código que se utiliza para llamarlas a las celdas. Es un archivo que a diario se modifica varia siempre los 1er, 2do y 3er lugar; por lo que deseo que las imágenes no se monten sobre otra, sino que cada vez que haya variación en el orden de mérito se reemplace la foto por la otra o se borre una y se coloque la otra que se solicita automáticamente.
    También puede ser a través de un Botón que se realice la acción de colocar la foto o actualizar el archivo.
    Otra cosa que me he dado cuenta es que como trabajo con formulas, el código que llama a la foto es un formula y no el nombre de la foto; por lo que pensé que se pudiera trabajar de forma manual en otra celda, colocando el nombre del archivofoto en una celda inmediata a la celda donde va la foto.
    Ahorita tengo en Hoja3 el código en las celdas:
    B16 para 1er lugar y la foto para ella en las celdas combinadas N11xQ11:N19xQ19
    B17=2do Lugar, Foto en N23xQ23:N31xQ31
    B18=3er Lugar, Foto en N35xQ35:N43xQ43

    También creo que me funcionaría manteniendo lo anterior, pero hago un llamado a la celda Q10=B16 para el 1er lugar. Q22=B17 para el 2do Lugar y Q34=B18 para el 3er lugar. De sea forma se podría llamar a la foto automaticamente a las mismas celdas ya combinadas; pero de forma manual sin dañar la formula de B16, B17 y B18.

    Espero me haya explicado; agradecería el apoyo a los muy respetados Expertos. Por favor.

    ResponderEliminar
    Respuestas
    1. Hola,
      el asunto de añadir imágenes/fotos es siempre delicado.
      Puedes echa un vistazo también a:
      http://excelforo.blogspot.com.es/2016/05/vba-el-metodo-shapesaddpicture-para.html

      Espero te oriente
      Saludos

      Eliminar
  38. Hola !
    Muy buena la pagina y los ejemplos.
    Te consulto ...
    Tengo una planilla con la que trabajo para hacer catalogo con precios y fotos.
    El siguiente codigo me permite insertar la foto del producto en una celda en cada una de las filas que contiene cada articulo de la lista.
    El codigo funciona perfecto en excel 2003 .... pero en excel 2007 no me incluye fisicamente la foto sino una referencia a la foto y esto no me sirva ya que no envio la carpeta con las fotos a mis clientes ( o sea en 2007 funciona perfecto localmente , pero no al usar el archivo en otra maquina )
    Me podrias indicar que modificar para que el codigo funcione en excel 2007

    -----

    While ActiveCell.Value <> ""
    valor = ActiveCell.Value
    ActiveCell.Offset(0, 1).Select
    ActiveSheet.Pictures.Insert(ThisWorkbook.Path & "\foto\" & valor & ".jpg").Select
    With Selection
    .ShapeRange.LockAspectRatio = msoFalse
    .ShapeRange.Height = 148 'Alto de la imagen
    .ShapeRange.Width = 148 'Ancho de la imagen
    .ShapeRange.Left = .ShapeRange.Left + 1 'Añadimos 1 para que se vea la línea divisoria de la celda (izquierda)
    .ShapeRange.Top = .ShapeRange.Top + 1 'Añadimos 1 para que se vea la línea divisoria de la celda (superior)
    End With
    ActiveCell.Offset(0, -1).Select
    cuenta = cuenta + 1
    ActiveCell.Offset(1, 0).Select
    Wend

    ---------

    Desde ya muchas gracias.
    romi

    ResponderEliminar