Hola!
hace unos días preparé el siguiente procedimiento que en excel 2003 funciona
perfectamente, sin embargo en excel 2007 no, a pesar de que en algún momento
lo ha hecho y ningún cambio ha sido sustancial como para ello, el error es
"No se puede obtener la propiedad Insert de la clase Pictures." y se produce
en la linea marcada con <<<<<<, es decir en el momento de insertar la
imagen.
Le he dado mil vueltas pero ya no sé por donde mas mirar, ¿alguna idea?
Muchas gracias.
'*******************************************************************************
'* InsertaImagen
'* inserta una imagen en una hoja excel, posicionandola sobre la hoja/celda
'* indicadas, eliminando previamente uno ya existente del mismo nombre si se
'* llega a pasar el nombre
'* Argumentos: strRutaImagen => ruta completa del archivo de imagen a
insertar
'* strCelda => Celda en que posicionarla
'* strHoja => (opcional) hoja en que insertarla
'* intAnchomm => (opcional) ancho en milimetros (la altura
será
'* proporcional a anchura)
'* strNombre => (opcional) nombre del gráfico
'* uso: InsertaImagen "C:\temp\prueba.png" , "E20",,100, "Grafico1"
'* Si utilizas este código, respeta la autoría y los créditos
'* ESH 17/10/08 18:36
'*******************************************************************************
Public Sub InsertaImagen(strRutaImagen As String, strCelda As String,
Optional strHoja As String, Optional intAnchomm As Integer, Optional
strNombre As String)
Dim strHojaActiva As String, _
Imagen As Object
Const Punto = 0.35278 ' 1 punto es equivalente a 0.35 mm
On Error GoTo InsertaImagen_TratamientoErrores
Application.ScreenUpdating = False
strHojaActiva = ActiveSheet.Name
' si no se ha pasado nombre de hoja, tomo la activa por defecto
If SiEsNulo(strHoja, "") = "" Then
strHoja = ActiveSheet.Name
Else
Worksheets(strHoja).Activate
End If
' elimino la imagen si es que existe
If Not SiEsNulo(strNombre, "") = "" Then
For Each Imagen In ActiveSheet.Pictures
If Imagen.Name = strNombre Then Imagen.Delete
Next Imagen
Else
strNombre = "Grafico"
End If
' inserto la imagen
ActiveSheet.Pictures.Insert(strRutaImagen).Name = strNombre ' <<<<<<<<<<
ActiveSheet.Pictures(strNombre).Select
' bloqueo la relación de aspecto
Selection.ShapeRange.LockAspectRatio = True
' si se ha pasado ancho lo aplico, sino, mantengo el original
If Not SiEsNulo(intAnchomm, 0) = 0 Then
Selection.ShapeRange.Width = intAnchomm / Punto
End If
' posiciono la imagen en la celda
With Worksheets(strHoja).Range(strCelda)
Selection.ShapeRange.Left = .Left
Selection.ShapeRange.Top = .Top
End With
' activo la hoja que estaba activa al iniciar el proceso
Worksheets(strHojaActiva).Activate
InsertaImagen_Salir:
Set Imagen = Nothing
Application.ScreenUpdating = True
On Error GoTo 0
Exit Sub
InsertaImagen_TratamientoErrores:
MsgBox "Error " & Err & " en proc.: InsertaImagen de Módulo: Módulo1 (" &
Err.Description & ")", vbCritical + vbOKOnly, "ATENCION"
Resume InsertaImagen_Salir
End Sub ' InsertaImagen
'***********************************************************************************
'* Emula la función Nz de Access, es decir devuelve el valor pasado como
parámetro o
'* si se le pasa un argumento opcional, ese valor o en su defecto 0
'* Argumentos: vntValor => dato a comprobar
'* vntDevuelve => valor a devolver si el dato es nulo
'* uso: SiEsNulo(vntValor, True) devuelve True si vntValor es nulo o ""
'* SiEsNulo(vntValor) devuelve 0 si vntValor es nulo o ""
'* SiEsNulo(vntValor, "Null") devuelve Nulo si vntValor es nulo o ""
'* ESH 09/10/03 20:15
'* Si utilizas este código, respeta la autoría y los créditos
'*******************************************************************************
Public Function SiEsNulo(vntValor As Variant, Optional vntDevuelve As
Variant) As Variant
If IsMissing(vntDevuelve) Then vntDevuelve = 0
If IsNull(vntValor) Or vntValor = "" Then
SiEsNulo = vntDevuelve
Else
SiEsNulo = vntValor
End If
End Function ' SiEsNulo
Saludos a tod@s
Emilio [MS-MVP Access 2006/8]
miliuco56 ALGARROBA hotmail.com
http://www.mvp-access.com/foro
http://www.mvp-access.es/emilio
Leer las respuestas