martes, 6 de julio de 2021

45 - Eventos de Hoja (Primera parte)

1 - EVENTO:  BEFOREDOUBLECLICK

Si bien algo ya se comentó en la planilla de Turnos (videos 43 y 44) acerca del uso de un evento de hoja vamos a desarrollar a lo largo de un par de entradas los principales Eventos de Hoja y de Libro.

En esta entrada veremos algunos ejemplos del evento: BeforeDoubleClick

NOTA: El evento BeforeRightClick cumple la misma función y se programa del mismo modo. Pero como el clic derecho se utiliza en la hoja para otras funciones es más recomendable el 'doble clic'.

IMPORTANTE: Las macros de los Eventos de Hojas se colocan en cada objeto HOJA donde se vaya a trabajar.


Ejemplo 1:
  Doble clic para ejecutar macro que inserta filas a medida que se rellena cada tabla.de Conceptos. Se evalúa si el Target (celda donde se hizo el doble clic) se encuentra en col 1 y si se trata de una celda combinada. En ese caso se avanza con el proceso de insertar la fila.


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'control de ubicación
If Target.Column <> 1 Then Exit Sub
If Target.MergeCells = False Then Exit Sub

'control de filas aún disponibles
X = Target.Row - 1
If Range("D" & X) = "" And Range("E" & X) = "" Then
    MsgBox "Debes completar las filas vacías antes de habilitar nuevas.", , "Atención"
    Range("D" & X).Select
    Exit Sub
End If
'se habilitan nuevas filas
Call nuevo_Ingreso(X)
    'MsgBox "Se agrega fila " & X + 1
Target.Offset(0, 1).Select
End Sub

Ejemplo 2: Doble clic para filtrar una tabla por el valor de la celda seleccionada. Esta opción permite ir haciendo filtrado por diferentes columnas. 

En la imagen se observan 2 tipos de tablas. En la macro se evalúa si el doble clic se realizó dentro de las primeras 5 col de la hoja. En ese caso se trata de un objeto Tabla y la instrucción de filtro varía con respecto a la del rango común. 

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

On Error Resume Next

'se evalúa que la celda tenga un valor para filtrar

If Target.Value <> "" Then

    'se evalúa si Target se encuentra entre las primeras 5 columnas

    If Target.Column <= 5 Then

        'se resta 1 columna porque la tabla se inicia en B

        colx = Target.Column - 1

        'se filtra por el valor del Target

        ActiveSheet.ListObjects("Analisis34").Range.AutoFilter Field:=colx, Criteria1:=Target.Value

    Else

        ' se trata de filtrar un rango que se inicia en col H (col 8)

        colx = Target.Column - 7

        'se establece el fin de rango

        fini = Range("H" & Rows.Count).End(xlUp).Row

        'se filtra el rango por el valor del Target

        ActiveSheet.Range("$H$4:$K$" & fini).AutoFilter Field:=colx, Criteria1:=Target.Value

    End If

End If

End Sub

Como se trata de un libro donde habrá 12 hojas mensuales con el mismo diseño de tabla, habrá que colocar el código en el evento BeforeDoubleClick de cada hoja, ajustando el nombre de la Tabla en cada una de las macros.

NOTA: en casos como éste conviene entonces colocar la macro solamente en el objeto LIBRO (ThisWorkBook) y quitarlas de las hojas.

Aquí hay que tener el cuidado de no nombrar las hojas por su nombre sino por su valor de índice.

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
'se exceptúan las hojas donde no se encuentren estas tablas
If ActiveSheet.Name <> "CAJA-1" Then
    On Error Resume Next
    If Target.Value <> "" Then
        If Target.Column <= 5 Then
            colx = Target.Column - 1
            ActiveSheet.ListObjects(1).Range.AutoFilter Field:=colx, Criteria1:=Target.Value
        Else
            colx = Target.Column - 7
            fini = Range("H" & Rows.Count).End(xlUp).Row
            ActiveSheet.Range("$H$4:$K$" & fini).AutoFilter Field:=colx, Criteria1:=Target.Value
        End If
    End If
End If
End Sub


Descargar libro de ejemplo desde aquí.


Ver Video N° 45 aquí.



No hay comentarios.:

Publicar un comentario