sábado, 17 de julio de 2021

46 - Eventos de Hoja (Parte 2)

EVENTOS: SELECTIONCHANGE y CHANGE

2 - Evento SelectionChange: Este evento se ejecuta al seleccionar una celda o rango de celdas. 

Como permanentemente seleccionamos celdas dentro de una hoja (al revisar contenido, o ingresar datos, etc) se deberá evaluar correctamente en qué celdas o rangos debe ser ejecutado este evento. Por eso este evento generalmente se utiliza al seleccionar celdas de títulos. 

Ejemplo 1:  pasar a la hoja del mes seleccionado.


 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'col donde se puede seleccionar para ejecutar macro de avance

If Target.Column >= 7 And Target.Column <= 10 Then

    'se controla si no es una celda numérica

    If Not IsNumeric(Target.Value) Then

        'se controla posible error en el nombre de hoja 

        On Error Resume Next

        'se selecciona hoja cuyo nombre coincida con el texto del título. Previamente se la visibiliza

        With Sheets(Target.Text)

            .Visible = True

            .Select

        End With

    End If

End If

End Sub


Ejemplo 2: al seleccionar alguna celda de título se ordena la tabla por esa columna.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'se ejecuta al seleccionar alguna celda en columnas 8 a 11 de la fila 4

If Target.Column >= 8 And Target.Column <= 11 And Target.Row = 4 Then

    On Error Resume Next

    'si la celda no está vacía se ordena la col de la celda seleccionada

    If Target.Value <> "" Then

       Call ordenaTabla(Target.Column)

    End If

End If

End Sub

Y en un módulo se colocará la siguiente macro de ordenamiento. Como en la macro de llamada se asigna la columna que debe ser ordenada, aquí también debe colocarse ese argumento.

Sub ordenaTabla(nrocol)

'variables: última fila del rango, la col a filtrar y el rango total de datos

finx = Cells(4, nrocol).CurrentRegion.Rows.Count + 2

rgoFilt = Range(Cells(4, nrocol), Cells(finx, nrocol)).Address

rgoTot = Range("H4:K" & finx).Address

'ordenamiento

    ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear

    ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Range(rgoFilt), _

        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

    With ActiveWorkbook.ActiveSheet.Sort

        .SetRange Range(rgoTot)

        .Header = xlYes

        .MatchCase = False

        .Orientation = xlTopToBottom

        .SortMethod = xlPinYin

        .Apply

    End With

End Sub

3 - Evento: Change

A diferencia del evento anterior donde se ejecuta un proceso al seleccionar una celda o rango, aquí con el evento Change se ejecutará al modificar la celda o rango.

Ejemplo 1: al modificar las celdas de la última columna de una tabla, se completan los campos de las 2 primeras columnas de ese registro. Al mismo tiempo también se ordena la tabla por columna de Concepto (col D)


Private Sub Worksheet_Change(ByVal Target As Range)

'se ejecuta en la tabla (col B:F)

If Target.Column = 6 And Target.Row > 2 Then

    If Target.Count = 1 Then

        'se coloca la fecha del día en col B y el nro correlativo en col C

        Range("B" & Target.Row) = Date     

        Range("C" & Target.Row) = Application.WorksheetFunction.Max(Range("Analisis346[[#All],[ID]]")) + 1

        'se ordena la tabla

        Call macroOrdena

        'se posiciona en la fila siguiente, col D

        Range("D" & Target.Row + 1).Select

    End If

End If

End Sub



Ejemplo 2:  En otra tabla, al modificar las celdas de la primera columna (J) se coloca una fórmula en la última (O).

NOTA: como solo se puede tener un evento de cada tipo en la misma hoja, al tener dos procesos se deberá establecer correctamente el rango de acción de cada uno de ellos. Así nos quedará entonces el código para este evento en la hoja donde se encuentren las 2 tablas.

Private Sub Worksheet_Change(ByVal Target As Range)

'se ejecuta en la tabla (col B:F)

If Target.Column = 6 And Target.Row > 2 Then

    If Target.Count = 1 Then

        Range("B" & Target.Row) = Date

        Range("C" & Target.Row) = Application.WorksheetFunction.Max(Range("Analisis346[[#All],[ID]]")) + 1

        'Call macroOrdena

        Range("D" & Target.Row + 1).Select

    End If

Else

    'se ejecuta en el rango J:O

    If Target.Column = 9 And Target.Row > 2 Then

        If Target.Count = 1 Then

            Range("O" & Target.Row).FormulaR1C1 = "=IF(RC[-5]="""","""",MONTH(RC[-5]))"

        End If

    End If

End If

End Sub



Descargar libro de ejemplo desde aquí.

Ver Video N° 46 aquí.

No hay comentarios.:

Publicar un comentario