Celdas combinadas en Worksheet_Change dan error

Mi intención es que en algunas celdas se ponga determinados valores y si no corresponde a aquella celda el valor pues como medida de llamar la atención se ponga el fondo de color rojo y la fuente color negro y se vuelva a la celda del error (quiero intentar evitar el MsgBox). La linea 2 de Worksheet_Change la puse con la intencionalidad de que si le daban a la tecla delete o un espacio quedase la celda con fondo blanco y sin datos.
Hasta ahi me iba bien, pero al hacer las prueba con un campo combinado, X15 esta combinado con Y15 (por cuestion de diseño de la plantilla), me da error 13 no coinciden los tipos ???? No sé que hacerle!
Private Sub Worksheet_Change(ByVal Target As Range)
    Target.Interior.ColorIndex = xlNone
    If Target.Cells.Count > 1 Or IsEmpty(Target) Or Target.Value = " " Then Exit Sub
    If Not Intersect(Target, Range("X15")) Is Nothing Then
    Select Case Target.Value
    Case "A", "B"
    Target.Font.ColorIndex = 3 ' Rojo
    Target.Interior.ColorIndex = xlNone ' Nada
    Case Else
    Target.Font.ColorIndex = 1 ' Nego
    Target.Interior.ColorIndex = 3 ' Rojo
    Target.Select
    End Select
    End If
    If Not Intersect(Target, Range("E16,F16")) Is Nothing Then
    If IsEmpty(Target) Or Target.Value = " " Then Exit Sub
    Select Case Target.Value
    Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
    Target.Font.ColorIndex = 3 ' Rojo
    Target.Interior.ColorIndex = xlNone ' Nada
    Case Else
    Target.Font.ColorIndex = 1 ' Nego
    Target.Interior.ColorIndex = 3 ' Rojo
    Target.Select
    End Select
    End If
    If Not Intersect(Target, Range("J23:J34")) Is Nothing Then
    Select Case Target.Value
    Case 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55
    Target.Interior.ColorIndex = xlNone
    Case Else
    Target.Interior.ColorIndex = 3
    Target.Select
    End Select
    End If
    End Sub

1 Respuesta

Respuesta
1
A diferencia de otros lenguajes, VBA evalúa todas las condiciones del IF (tres en tu caso), aunque bastaría con que la primera condición se cumpliese para no tener que evaluar el resto. En fin, una solución es dividir ese IF en dos.
Te pongo en negrita los cambios que tienes que hacer:
    Private Sub Worksheet_Change(ByVal Target As Range)
        Target.Interior.ColorIndex = xlNone
        If Target.Cells.Count > 1 Then Exit Sub
        If IsEmpty(Target) Or Target.Value = " " Then Exit Sub
        If Not Intersect(Target, Range("X15")) Is Nothing Then
            Select Case Target.Value
                Case "A", "B"
                    Target.Font.ColorIndex = 3 ' Rojo
                    Target.Interior.ColorIndex = xlNone ' Nada
                Case Else
                    Target.Font.ColorIndex = 1 ' Nego
                    Target.Interior.ColorIndex = 3 ' Rojo
                    Target.Select
            End Select
        End If
        If Not Intersect(Target, Range("E16,F16")) Is Nothing Then
            If IsEmpty(Target) Or Target.Value = " " Then Exit Sub
            Select Case Target.Value
                Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
                    Target.Font.ColorIndex = 3 ' Rojo
                    Target.Interior.ColorIndex = xlNone ' Nada
                Case Else
                    Target.Font.ColorIndex = 1 ' Nego
                    Target.Interior.ColorIndex = 3 ' Rojo
                    Target.Select
            End Select
        End If
        If Not Intersect(Target, Range("J23:J34")) Is Nothing Then
            Select Case Target.Value
                Case 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55
                    Target.Interior.ColorIndex = xlNone
                Case Else
                    Target.Interior.ColorIndex = 3
                    Target.Select
            End Select
        End If
    End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas