En mi anterior post nos introducimos un poco en la temática de los eventos que dispara excel ante determiandas acciones, y como tomar provecho de ellos para insertar nuestro código. Vimos algunos eventos del objeto WorkBook (libro), y ahora avanzaremos al objeto WorkSheet (hoja).
Nuevamente ingresamos al Editor de Visual Basic (alt + f11) y nos dirigimos al Explorador de Proyectos:
Private Sub Worksheet_Deactivate()
'nuestro código aqui, que se ejecutará cada vez que el usuario cambie de esta hoja hacia otra
End Sub
Existen otros eventos, probablemente menos utilizados, los cuales iremos viendo en futuros post sobre el tema.
Nuevamente ingresamos al Editor de Visual Basic (alt + f11) y nos dirigimos al Explorador de Proyectos:
Hacemos doble click en cualquiera de los nodos correspondientes a las hojas y dejamos la ventana de código de esta forma:
al seleccionar worksheet de la lista desplegable inzquierda, excel nos trae el Sub por defecto.
Vamos a reconocer y programar dentro de algunos de los eventos mas comunes:
1) Worksheet_SelectionChange(ByVal Target As Range): nos será de mucha utilidad para restringir la seleccion de determinados rangos. Si el usuario selecciona alguna celda "prohibida" por nosotros, avisamos y borramos su contenido, por si lo alteró:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'hago uso de la propiedad Addres de Target, para averiguar el nombre de la celda seleccionada:
'hago uso de la propiedad Addres de Target, para averiguar el nombre de la celda seleccionada:
If Target.Address = "$A$1" Then
MsgBox "La celda A1 no puede modificarse", vbExclamation
[a1].ClearContents
[a2].Select
End If
End Sub
MsgBox "La celda A1 no puede modificarse", vbExclamation
[a1].ClearContents
[a2].Select
End If
End Sub
También podríamos averiguar la cantidad de columnas y/o filas del rango seleccionado, para saber si nuestro usuario está seleccionando de acuerdo a lo indicado:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'tomo la cantidad de columnas y filas de Target
'tomo la cantidad de columnas y filas de Target
colu = Target.Columns.Count
fila = Target.Rows.Count
'en este ejemplo, la seleccion que realice el usuario no podrá tener
'mas de cinco columnas ni diez filas
If colu > 5 Or fila > 10 Then
MsgBox "el rango seleccionado no tiene el tamaño previsto", vbExclamation
[a1].Select
Else
'si está bien seleccionado, lo copio a otra hoja
Target.Copy Sheets("Hoja2").Range("a1")
End If
End Sub
fila = Target.Rows.Count
'en este ejemplo, la seleccion que realice el usuario no podrá tener
'mas de cinco columnas ni diez filas
If colu > 5 Or fila > 10 Then
MsgBox "el rango seleccionado no tiene el tamaño previsto", vbExclamation
[a1].Select
Else
'si está bien seleccionado, lo copio a otra hoja
Target.Copy Sheets("Hoja2").Range("a1")
End If
End Sub
en efecto, el usuario seleccionó un rango de 12 filas, así que cancelo cualquier otra accion
2) Worksheet_Change(ByVal Target As Range)
si bien es uno de los eventos que mas utilizaremos, no me detendré mucho en él, dado que es similar al anterior ejemplo, con la diferencia que aquí el evento se produce cada vez que el usuario cambia el valor de una celda. Tambien recibimos como argumento la celda / rango en cuestion.
Nos sería de mucha utilidad, por ejemplo, para controlar los cambios que el usuario realiza sobre una tabla o formulario, llevando un registro de sus acciones en una hoja oculta o archivo externo:
Private Sub Worksheet_Change(ByVal Target As Range)
'tomo el nombre de la celda cuyo valor cambió:
nombre = Target.Address
'agrego una fila a la hoja en donde llevo los registros:
With Sheets("registro_oculto")
.Range("a2").EntireRow.Insert
.Cells(2, 1).Value = Now
.Cells(2, 2).Value = Application.UserName
.Cells(2, 3).Value = "modificacion celda " & nombre & " por el valor: '" & Target.Value & "'"
End With
End Sub
'tomo el nombre de la celda cuyo valor cambió:
nombre = Target.Address
'agrego una fila a la hoja en donde llevo los registros:
With Sheets("registro_oculto")
.Range("a2").EntireRow.Insert
.Cells(2, 1).Value = Now
.Cells(2, 2).Value = Application.UserName
.Cells(2, 3).Value = "modificacion celda " & nombre & " por el valor: '" & Target.Value & "'"
End With
End Sub
y si luego voy a la hoja "registro_oculto" observaré lo siguiente:
si, cada cambio quedó debidamente registrado.
3) Worksheet_Activate(): sin argumentos, se producirá cada vez que la hoja se "active", o sea cuando abramos la hoja.
Private Sub Worksheet_Activate()
MsgBox "abriste la hoja " & ActiveSheet.Name
'quizas aprovechemos este evento para, por ejemplo,
'guardar el libro:
ActiveWorkbook.Save
End Sub
MsgBox "abriste la hoja " & ActiveSheet.Name
'quizas aprovechemos este evento para, por ejemplo,
'guardar el libro:
ActiveWorkbook.Save
End Sub
4) Worksheet_Deactivate(): idem al anterior, pero al desactivarse la hoja. Por ejemplo, si de la Hoja1 pasamos a la Hoja2, se produce el evento "deactivate" de la Hoja1 (que dejó de estar activa)
Private Sub Worksheet_Deactivate()
'nuestro código aqui, que se ejecutará cada vez que el usuario cambie de esta hoja hacia otra
End Sub
Existen otros eventos, probablemente menos utilizados, los cuales iremos viendo en futuros post sobre el tema.
- Obtener enlace
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario