Problema al borrar fila o varias celdas

Tengo una base de datos de varias personas que se ordena alfabéticamente al inserte el valor y cambiar de celda en la columna 11, a más de eso la columna 2 cambia a mayúsculas cualquier texto, lo primero esta es mi línea de código en la hoja 1:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 And Target.Value <> "" Then
       Target = UCase(Target)
    End If
    If Target.Column = 11 Then
        Call ordenar
    End If
End Sub

El Problema es el siguiente, cuando borro una fila por completo o varias celdas me aparece el siguiente error:

Se ha producido el error '13' en tiempo de ejecución:

No coinciden los tipos

Le doy a depurar y me marca esta línea de código:

If Target.Column = 2 And Target.Value <> "" Then

Alguna solución o algo que este realizando mal?

Para terminar podrían ayudarme empleando el código de las mayúsculas a varias columnas, ejemplo 2, 7 y 9.

2 respuestas

Respuesta
2

Te explico por qué tienes el error

Se ha producido el error '13' en tiempo de ejecución:
No coinciden los tipos

En el objeto Target tienes el conjunto de todos los objetos modificados, entonces cuando eliminas una fila, en Target tienes en un arreglo todas las celdas.

Si comparas

Target.Column = 2

En Target tienes en un arreglo el número de todas las columnas y no lo puedes comparar solamente contra un dato por eso el mensaje: "No coinciden los tipos".


Si solamente vas a modificar una celda y esperas resultados de una sola celda, entonces el error se puede solucionar verificando el contador de target.

También te puse un Case para seleccionar el número de columna.

Y por último, agregué la instrucción Application.EnableEvents = False, te explico: Cuando pones esta instrucción:

Target.Value = UCase(Target.Value)

Lo que haces es modificar target, entonces vuelves a modificar la misma celda, entonces la macro se ejecuta nuevamente, y así se ejecuta varias veces y puede entrar en un loop interminable.

Por eso con esta instrucción Application. EnableEvents, se apagan los eventos, se modifica la celda, ya no se ejecuta nuevamente la macro, y después se habilitan los eventos.

La macro quedaría así:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    Select Case Target.Column
        Case 2, 4, 7
            If Target.Value <> "" Then
                Application.EnableEvents = False
                Target.Value = UCase(Target.Value)
                Application.EnableEvents = True
            End If
        Case 11
            Call ordenar
    End Select
End Sub

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda
Respuesta
1
Private Sub Worksheet_Change(ByVal Target As Range)
valida = Intersect(Target, Range("b:b")) Is Nothing
If valida Then
    If Target.Column = 2 And Target.Value <> "" Then
       Target = UCase(Target)
    End If
    If Target.Column = 11 Then
        'Call ordenar
    End If
End If
End Sub

prueba esta macro 

¿Respecto a tu 2o requerimiento puedes ser más especifico?, no entiendo que es lo que necesitas

Gracias ahora lo prueba, en lo segundo como me explique y podrás apreciar:

If Target.Column = 2 And Target.Value <> "" Then
       Target = UCase(Target)
End If

En la columna 2 se convierte en mayúsculas, entonces es posible acatar esto a varias columnas diferentes, por ejemplo 2,4 y 7?

Lo probé, ahora el problema es que no me cambia a mayúsculas la columna "B", solución?

Entonces prueba esta macro

Private Sub Worksheet_Change(ByVal Target As Range)
valida = Not Intersect(Target, Range("b:g")) Is Nothing
If valida Then
On Error Resume Next
If Target.Column = 2 Or Target.Column = 4 Or Target.Column = 7 And Target.Value <> "" Then
Target = UCase(Target)
End If
If Target.Column = 11 Then
'Call ordenar
End If
On Error GoTo 0
End If
End Sub

Me equivoque en las columnas solo corrige los valores a como los quieres y esta línea la modificas valida = Not Intersect(Target, Range("b:g")) Is Nothing por esta otra valida = Not Intersect(Target, Range("b:i")) Is Nothing, así te cambiara a mayúsculas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas