Excel - Macro para detectar cambios en varias celdas a la vez

 
Vista:
sin imagen de perfil

Macro para detectar cambios en varias celdas a la vez

Publicado por Juan (4 intervenciones) el 02/08/2021 06:52:05
He creado una macro que detecta cambios de valores en un rango de celdas y le cambia el color de fondo a la celda cambiada y 6 celdas a su izquierda, de color verde si se ingresa una fecha de egreso y de color blanco si se borra una fecha existente.
En mi proyecto de una base de datos de empleados, si se pone una fecha de egreso en la columna G (rango G5:G495) o se elimina una existente, se producen los cambios.

La macro funciona bien pero tiene algunas limitaciones que deseo resolver:
1) Al ingresar la fecha de egreso hay que pulsar la tecla enter o la flecha del teclado abajo, porque si se lo hace de otra manera (ejemplo la tecla tabulador) el rango de celdas a pintar no se respeta ya que el código toma la celda activa para efectuar los cambios.
2) El código funciona si los cambios se hacen de a una celda a la vez, si selecciono un rango de celdas para cambiar sus valores simultáneamente da error ("No coinciden los tipos".

¿Es posible solucionar estás 2 limitaciones o al menos la 2da.?

CODIGO:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Private Sub Worksheet_Change(ByVal Target As Range)
'Comenté las 2 líneas siguientes para que vean las LIMITACIONES
'Application.EnableEvents = False
'On Error GoTo Error
 
 
    Dim KeyCells As Range
 
 
' La variable KeyCells contiene el rango
    ' de las celdas que se controlará su cambio.
    ' para este caso he creado un nombre de rango para G5:G495
    'que corresponde a la columna de Fecha de Egreso
    Set KeyCells = Range("FechaEgreso")
 
 
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
        'Si el cambio en una de las celdas contiene un valor
        'es distinto que vacio le pondrá color de relleno verde
        If Range(Target.Address).Value <> "" Then
         'pintará la celda cambiada y 6 celdas hacia su izquierda
         'a la celda cambiada le pongo -1 porque al ingresar un valor
         'y dar enter la celda activa es la de abajo de esa (LIMITACION)
         Range(ActiveCell.Offset(-1, 0), ActiveCell.Offset(-1, -6)).Select
            'elige un color verde para el rango a pintar
            With Selection.Interior
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
            .Color = 65280
             End With
        'luego de pintar posiciona el cursor
        'una celda + abajo que la cambiada
        ActiveCell.Offset(1, 6).Select
        End If
        'si el cambio en la celda fue borrar un valor
        If Range(Target.Address).Value = "" Then
        'remueve el color verde de todo el rango
         Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(0, -6)).Select
            'eligiendo un color de relleno blanco
            With Selection.Interior
            .ColorIndex = 0
 
            End With
        'luego de revertir el color de relleno a blanco
        'posiciona el cursor en la misma celda que se
        'borró el valor
        ActiveCell.Offset(0, 6).Select
 
        End If
End If
'Comenté las 2 líneas siguientes para que vean las LIMITACIONES
'Error:
'Application.EnableEvents = True
 
 
End Sub

CAPTURA DE PANTALLA CAMBIANDO VALOR A UNA CELDA: :)

base_empleados-png

ERROR SI INTENTO CAMBIAR VARIAS CELDAS A LA VEZ: :(

base_empleados_error-png

Adjunto archivo de Excel Microsoft 365

Muchas gracias por la ayuda que me puedan brindar.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder