Macro de mayúsculas, con un problema

Tengo esta macro para todo mayúsculas:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(" A12:A41,C12:C41")) Is Nothing Then
Target.Value = AMayusculas(Target.Value)
End If
End Sub

Y en un modulo:

Public Function AMayusculas(strTexto As String) As String
AMayusculas = UCase(strTexto)
End Function

Todo perfecto.

Pero al eliminar filas o líneas, me da error en:

Target.Value = AMayusculas(Target.Value)

Aunque le digo finalizar, y me lo hace bien

2 respuestas

Respuesta
1

Luis Herrero!

·

Hay dos problemas, cuando el Target tiene una celda vacía y cuando tiene varias celdas.

Para solucionar los dos problemas pon esta subrutina en lugar de la que tienes:

·

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim celda As Range
   For Each celda In Target
       If Not Intersect(celda, Range("A12:A41,C12:C41")) Is Nothing Then
            If celda.Value <> "" Then celda.Value = AMayusculas(celda.Value)
       End If
   Next
End Sub

·

Asimismo, si la función AMayusculas solo va a contener esa orden que has puesto es mejor que no la uses y pongas directamente esta línea en la subrutina de arriba en lugar de la que hay:

If celda.Value <> "" Then celda.Value = UCase(celda.Value)

En ningún caso usaría yo la instrucción

on error resume next

Es más yo pienso que debería estar prohibida.

Luego se produce un error en cualquier otro lugar y no te avisa de ello y pueden suceder cosas extrañísimas y no te enteras de donde procede el error.

La forma correcta de proceder es averiguar cuáles son los problemas, que son dos:

Target.Value da error cuando la celda está vacia

Target.Value da error cuando Target son varias celdas

Y darles la solución específica tal como se la he dado.

No olvides puntuar, veo que la otra respuesta ya la puntuaste y esta no.

¡Gracias! 

Matizando un poco lo del "on error resume next"

Se puede emplear cuando tenemos localizado un error que no merece la pena el desembolso necesario para evitarlo y con esa instrucción salimos del paso.

Pero así como hemos puesto el "on error resume next" debemos ser rápidos en quitarlo inmediatamente después de pasar por el error con

on error goto 0

De esta forma seremos informados de los errores que haya en otros sitios del programa.

He recibido muchas macros que hacían cosas extrañisimas y todo era por un

on error resume next

Que se había quedado activado y ya no salía ningún error pero sucedían cosas terribles.

Esa sentencia no soluciona problemas, simplemente los calla.

Respuesta
1

Yo le agregaría una condición de verificación de error, quedaría algo así

Private Sub Worksheet_Change(ByVal Target As Range)
on error resume next
If Not Intersect(Target, Range(" A12:A41,C12:C41")) Is Nothing Then Target.Value = UCase(Target.Value)
End Sub

Cuando sea error, simplemente lo ignora (y además evitás la llamada a función por una sola línea

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas