Cuando tienes una tabla en Excel con muchas columnas es fácil perder de vista la fila a la que pertenecen los datos. Hoy aprenderemos cómo resaltar la fila de la celda activa de manera que podamos distinguir fácilmente todos los valores de una fila.
Nuestro objetivo será crear un apoyo visual para identificar fácilmente los datos que pertenecen a la misma fila de la celda activa. Al momento de seleccionar una nueva celda, la fila anterior quedará sin resaltar y la nueva fila será resaltada. Observa la siguiente animación donde queda claro nuestro objetivo:
El código VBA que desarrollaremos hará que todas las hojas de nuestro libro tengan este comportamiento sin necesidad de copiarlo en cada una de ellas. Así que sin mayor preámbulo, comencemos con el desarrollo de esta funcionalidad.
Crear una variable VBA global
El primer paso será crear una variable global en VBA donde almacenaremos el valor de la celda activa “actual” y el de la celda activa “anterior”. Esto es necesario ya que al movernos a una nueva fila debemos quitar cualquier formato de la fila previamente resaltada y por lo tanto necesito almacenar una referencia a dicha fila. Para crear esta variable debes abrir el Editor de Visual Basic y agregar un módulo de código haciendo clic derecho sobre el nombre del proyecto > Insertar > Módulo:
Una vez creado este módulo debemos colocar la siguiente línea de código:
Public celdaActiva(1) As Range
El hecho de que la variable sea Public nos permite tener acceso a ella desde cualquier otro módulo de código. Esta variable es un arreglo en VBA que no es más que una colección de “casillas” donde podemos almacenar valores. En este caso la variable celdaActiva tiene dos casillas del tipo Range las cuales podemos acceder con los índices 0 y 1.
Inicializar la variable celdaActiva
En este punto la variable celdaActiva creada en el paso anterior aún está vacía, así que haremos uso del evento Workbook_Open para indicarle cuál es la celda activa al momento de abrir nuestro libro de Excel. Inserta el siguiente código dentro del evento Workbook_Open del objeto ThisWorkbook:
Private Sub Workbook_Open() Set celdaActiva(1) = ActiveCell ActiveCell.EntireRow.Interior.Color = RGB(255, 145, 145) End Sub
Al abrir nuestro libro se ejecutará el código del evento WorkbookOpen y por lo tanto el elemento 1 del arreglo celdaActiva tendrá una referencia a la celda activa de nuestro libro. La segunda instrucción que se ejecuta cambiará el valor de la propiedad ActiveCell.EntireRow.Interior.Color para establecer un color de fondo para toda la fila de la celda activa. En este caso utilizo la función RGB para elegir un color de fondo con una combinación específica de colores rojo, verde y azul. Si quieres saber un poco más sobre los colores en Excel y la función RGB, consulta el artículo Evaluar el color de fondo de una celda.
Además de inicializar la variable celdaActiva al momento de abrir nuestro libro de Excel, lo haremos también al momento de activar una nueva hoja lo que significa que debemos hacer uso del evento Workbook_SheetActivate que también se encuentra dentro del objeto ThisWorkbook. Después de haber insertado el mismo código para ambos eventos, deberás tener una vista en el Editor de Visual Basic como la siguiente:
Resaltar la fila de la celda activa
Ahora solo nos resta resaltar la fila de la celda activa en el momento en que seleccionamos una nueva celda. Ese instante está representado en Excel por el evento Workbook_SheetSelectionChange donde colocaremos el siguiente código:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Set celdaActiva(0) = celdaActiva(1) Set celdaActiva(1) = Target On Error Resume Next celdaActiva(0).EntireRow.Interior.Color = xlNone Target.EntireRow.Interior.Color = RGB(255, 145, 145) End Sub
Ya que este evento se “dispara” en el momento en que seleccionamos una nueva celda, la primera instrucción almacena el valor de la celda activa anterior dentro de celdaActiva(0) e inmediatamente después guardamos la referencia a la nueva celda activa dentro de celdaActiva(1) y que en ese instante está referenciada por la variable Target. Las últimas dos instrucciones cambian el color de fondo de las filas. Primero igualamos el color de celda activa anterior a xlNone que significa que removeremos cualquier color de fondo y enseguida establecemos un color de fondo con la función RGB para la fila de la nueva celda activa. Al finalizar todos estos pasos tendremos un código como el siguiente:
Eso será todo. Al haber seguido estos pasos tendrás un libro de Excel que resaltará la fila de la celda activa en todas las hojas.
Observaciones sobre el método utilizado
El método utilizado para resaltar la fila de la celda activa en Excel mostrado en este artículo modifica el valor de la propiedad Interior.Color de cada una de las celdas de la fila. Por esta razón, si tus celdas tienen aplicado algún color, éste será removido al momento de seleccionar una celda de la misma fila.
Es importante recordar que los colores que serán removidos serán los aplicados en el relleno de las celdas a través de las herramientas de formato. Los colores aplicados por formato condicional quedarán intactos ya que dichos colores se almacenan en una propiedad diferente. De hecho, si tus datos tienen reglas de formato condicional, dichos colores estarán sobre puestos al color aplicado por el código de este ejemplo.
Resaltar fila y columna de la celda activa
Una variante interesante del ejemplo mostrado anteriormente es agregar algunas líneas de código para resaltar la columna de la celda activa y de esa manera ubicarla tanto horizontal como verticalmente. El código a utilizar será el siguiente:
Private Sub Workbook_Open() Set celdaActiva(1) = ActiveCell ActiveCell.EntireRow.Interior.Color = RGB(255, 145, 145) ActiveCell.EntireColumn.Interior.Color = RGB(255, 145, 145) End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object) Set celdaActiva(1) = ActiveCell ActiveCell.EntireRow.Interior.Color = RGB(255, 145, 145) ActiveCell.EntireColumn.Interior.Color = RGB(255, 145, 145) End Sub Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Set celdaActiva(0) = celdaActiva(1) Set celdaActiva(1) = Target On Error Resume Next celdaActiva(0).EntireRow.Interior.Color = xlNone celdaActiva(0).EntireColumn.Interior.Color = xlNone Target.EntireRow.Interior.Color = RGB(255, 145, 145) Target.EntireColumn.Interior.Color = RGB(255, 145, 145) End Sub
Observa que lo único que he hecho es agregar las líneas de código que hacen referencia a la propiedad EntireColumn.Interior.Color que resaltan la columna de la celda activa. Por supuesto que esta versión de código también necesitará de una variable global declarada en un Módulo de manera similar que en el primer ejemplo. El resultado de utilizar este código es el siguiente:
Descarga el archivo comprimido donde encontrarás dos libros de Excel. El primero contiene el ejemplo que resalta la fila de la celda activa y el segundo el que resalta tanto la fila como la columna.