Error '13' en tiempo de ejecución: No coinciden los tipos (excel)

Ya he leído en otro post que no se puede usar el Worksheet Change para realizar acciones cuando cambia el "value" de una o varias celdas (a través de una fórmula de concatenar previamente ubicada en las mismas, por ejemplo) sino que estas deben ser modificadas en su contenido manualmente. Para automatizar ese cambio he creado un botón de comando "Concatenar", asociado a un macro que lo que hace es concatenar los valores que necesito y los ubica en las celdas monitoreadas por el Worksheet Change. En principio anda bien pero me aparece un error '13' en tiempo de ejecución: No coinciden los tipos, al ejecutar el Worksheet Change a partir del segundo cambio de celda. Este es mi código tanto del macro de concatenación como del Worksheet:

Private Sub Concatenar_Click()
Range("A4:A8").Select
ActiveCell.FormulaR1C1 = "=CONCATENATE(R2C2,RC[1])"
Selection.AutoFill Destination:=Range("A4:A13"), Type:=xlFillDefault
Range("A4:A13").Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim foto As String
Dim ruta As String
If Target.Column = 1 Then
foto = Target.Value & ".jpg"
ruta = ThisWorkbook.Path & "\Fotos\" & foto
MsgBox ruta, vbYesNo, "Prueba"
End If
End Sub

En esta sentencia solo utilizo 2 celdas de cambio para probar pero en realidad necesito modificar varias más de manera simultanea con el macro Concatenar. Les agradecería si me pudiesen ayudar con ese error. Les pido disculpas por el desconocimiento. Recién estoy haciendo mis primeras armas en el uso de VBA. Muchas Gracias

1 respuesta

Respuesta
1

Sí es posible modificar varias celdas con el evento change.

Explícame lo que necesitas y adapto la macro.

Saludos. Dante Amor

En realidad lo que necesitaría es lo siguiente: En la columna A, las celdas tienen la fórmula concatenar, concatenando el contenido de otra celda (encabezado de la tabla) y un número de orden. Lo que en realidad se modifica es ese encabezado y automáticamente se modifican los valores de las celdas a través de la formula de concatenación. Tenia entendido (y ademas lo probé) que Worksheet Change no detecta esos cambios en los valores de celdas que se ven modificadas por la formula de concatenación (en realidad el contenido de la celda no se modifica, pero si su valor). Por ejemplo en la celda B1 esta la celda "encabezado" con el valor: Colonia. En la columna A, desde la celda A2 hasta la A16, las celdas concatenan el valor de $B$1 + un número de orden (1,2,3,etc.). Estos valores se corresponden con el nombre de fotos que tengo en una carpeta. Lo que quiero lograr es que automáticamente al cambiar el encabezado (en el ejemplo "Colonia"), cambien las celdas de la columna A y se inserten las fotos correspondientes. Como estoy aprendiendo empecé probando lo del Worksheet incluyendo unos MsgBox para ir viendo como funciona y estoy trabado allí (todavía no entre en el tema de insertar las fotos). Espero haberme explicado correctamente. Desde ya muchas gracias por tu tiempo y conocimientos... Saludos

Efectivamente si en la celda tienes una fórmula y modificas otros valores que afectan el resultado de la fórmula, el evento change no detecta el cambio en esa celda.

Por ejemplo si en la celda A1 tienes está fórmula:

=concatenar($B$1,B2)

Y modificas la celda B1, el evento change no detecta el cambio en la celda A1, porque el cambio que hiciste fue en la celda B1, entonces el evento change se tiene que hacer con la celda B1. ¿Me explico?

Ahora si no quieres hacer el evento change para la celda B1, puedes utilizar el evento calculate, este evento detecta cualquier cambio en el resultado de las fórmulas de la hoja, incluso si el cambio se realiza en otra hoja pero afecta el resultado de nuestra hoja en cuestión el evento calcuate se activa.

Regresando a tu petición. Supongo que tienes esto

A B

1 Colonia

2 =CONCATENAR($B$1,B2) 1

3 =CONCATENAR($B$1,B3) 2

4 =CONCATENAR($B$1,B4) 3

Y se ve de esta manera

A B
1 Colonia
2 Colonia1 1
3 Colonia2 2
4 Colonia3 3

Entonces el evento change deberá quedar así:

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.DAM
If Not Intersect(Target, Range("B1")) Is Nothing Then
    On Error Resume Next
    ruta = ThisWorkbook.Path & "\fotos\"
    ActiveSheet.DrawingObjects.Delete
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        archivo = Cells(i, "A") & ".jpg"
        ActiveSheet.Pictures.Insert(ruta & archivo).Select
    Next
End If
End Sub

Las imagenes son insertadas una encima de otra, queda pendiente en dónde quieres cada una de las imágenes. Esto te lo paso en la otra pregunta que hiciste.

Sos un maestro, Dante... ahi adapté tu código en mi planilla y funciona... ademas entendí bastante lo que hace el código linea a linea lo que que ayuda mucho para aprender, que es el objetivo final de todo esto. Ahora me pongo a ver como ubicar las fotos. Muchas Gracias.

Añade tu respuesta

Haz clic para o