VBA
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
End Sub
La primera y ltima lnea es marcan el inicio y el final de la macro respectivamente. La primea lnea
marca el principio de la macro y vamos a desglosar esta lnea para entender un poco mejor esta
macro:
Private Sub: significa Subrutina (Sub) o macro de acceso Privado (Private) y este acceso se aplica
cuando se intenta ejecutar desde otra macro.
Worsheet: Corresponde a una macro que se aplicar al objeto hoja de Excel (Worksheet) sobre la
que estemos ubicados desde la venta de explorador de proyectos
SelectionChange(ByVal Target As Range): Corresponde al evento Cambio de seleccin y
significa que los cdigos que vayamos a programar en esta macro se ejecutaran automticamente al
presentarse un cambio en la seleccin de las celdas (Target) que indiquemos. Un cambio es por
ejemplo ingresar un valor en una celda, eliminar una fila, o seleccionar una celda. As que al
momento de seleccionar una celda, Excel activa esta macro y ejecuta los cdigos que tengamos
dentro de esta hasta la ltima lnea.
On Error Resume Next: La segunda lnea tambin la vamos a tener siempre pues lo que hace es
que ante un error en la programacin de la macro, evite detenerla abruptamente y que en lugar de
un mensaje de error que muestra Excel a nivel tcnico, simplemente termine la ejecucin de la
macro.
: Aqu es donde se coloca el cdigo que deseemos ejecutar.
End Sub: marca el final de la macro.
Objetos
Workbook: Corresponde a la indicacin de que la macro se aplicar sobre el libro de Excel
(Workbook).
Worsheet: Corresponde a una macro que se aplicar al objeto hoja de Excel (Worksheet) sobre la
que estemos ubicados desde la venta de explorador de proyectos
Objects: ActiveSheet.ChartObjects("Grfico 4").Activate
Eventos
Es importante marcar que hay varios eventos o acciones que se pueden dar en la interaccin de las
hojas de un libro de Excel como es Activar, Calcular, Cambiar Seleccin, entre otras y es
precisamente desde la aplicacin de estos eventos que se pueden ejecutar macros
SelectionChange(ByVal Target As Range): Corresponde al evento Cambio de seleccin y
significa que los cdigos que vayamos a programar en esta macro se ejecutaran automticamente al
presentarse un cambio en la seleccin de las celdas (Target) que indiquemos. Un cambio es por
ejemplo ingresar un valor en una celda, eliminar una fila, o seleccionar una celda. As que al
momento de seleccionar una celda, Excel activa esta macro y ejecuta los cdigos que tengamos
dentro de esta hasta la ltima lnea.
Deactivate(): Corresponde al evento desactivar. En este caso, vamos a programar Excel para que
ejecute una macro de manera automtica cuando cambiemos de hoja, es decir, una vez que se
desactive la hoja.
NewSheet(ByVal HojaNueva As Object): Corresponde al evento nueva hoja, es decir, cuando se
inserte una nueva hoja en el libro excel.
(ByVal HojaNueva As Object): Es la definicin de un objeto que damos como nombre HojaNueva en
el cual se referencia la hoja nueva que se intente insertar. Este objeto es necesario ya que en
realidad lo que sucede es que una vez se inserte una nueva hoja, inmediatamente es eliminada, es
decir, no se impide que se inserte una hoja sino que una vez insertada se elimina, as que se requiere
de este objeto para poder eliminar la hoja.
NewSheet(ByVal Sh As Object): Corresponde al evento Nueva Hoja, es decir, cuando se inserte
una nueva hoja al libro de trabajo se van a ejecutar unas lneas de cdigo.
SheetBeforeDelete(ByVal Sh As Object): Corresponde al evento Antes de Eliminar una Hoja del
libro, es decir, cuando se intente eliminar una hoja del libro de trabajo, antes de ejecutar dicha
accin, vamos a aplicar unas lneas de cdigo.
SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean):
Corresponde al evento Clic Derecho, es decir, cuando de clic derecho sobre una celda de cualquier
hoja del libro de trabajo, ejecutaremos algunas lneas de cdigo.
BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean): Corresponde al evento antes de
Guardar, es decir, cuando se intente guardar el libro de trabajo, antes de ejecutar dicha accin,
vamos a aplicar unas lneas de cdigo.
(ByVal SaveAsUI As Boolean, Cancel As Boolean): Es la definicin de dos posibles resultados que
puede retornar el uso de esta macro y son de tipo booleano.
BeforeClose(Cancel As Boolean): Corresponde al evento antes de Cerrar, es decir, cuando se
vaya a cerrar el libro de trabajo se van a ejecutar unas lneas de cdigo.
(Cancel As Boolean): Es la definicin del resultado que puede retornar el uso de esta macro y es de
tipo booleano.
Open(): Corresponde al evento Abrir, es decir, cuando se abra el libro de trabajo se van a ejecutar
unas lneas de cdigo.
Elementos
InputBox: nos sirve para obtener informacin con el usuario mediante un mensaje de texto; la
informacin que ingrese el usuario es almacenada en una variable para su posterior tratamiento.
Cdigos
Mostrar Un Mensaje Informativo
MsgBox ""
Colorear Hoja
Cells.Interior.ColorIndex = 0
Colorear Filas
Target.EntireRow.Interior.ColorIndex = 0
Colorear Columnas
Target.EntireColumn.Interior.ColorIndex = 0
Colorear Rangos
Range("C11:K30").Interior.ColorIndex = 0
Nota: El # 0 es blanco y el 42 es turquesa
Limitar Filas y Columnas
R = ActiveCell.Row
C = ActiveCell.Column
Condicionales
If R < 11 Or R > 30 Or C < 3 Or C > 11 Then
Exit Sub
Else
Range("C" & R & ":K" & R).Interior.ColorIndex = 42
End If
Nombrar Hoja
Nombrehoja = ""
Impedir cambio del Nombre de las Hojas
Nombrehoja = ""
If Hoja1.Name <> Nombrehoja Then Hoja1.Name = Nombrehoja
Solicitar nombre de hoja nueva
Private Sub Workbook_NewSheet(ByVal Sh As Object)
On Error Resume Next
NombreHoja = (InputBox("Digite el nombre de la nueva hoja"))
ActiveSheet.Name = NombreHoja
End Sub
Impedir eliminar hoja
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
ThisWorkbook.Protect Structure:=True
MsgBox "No es posible eliminar la hoja"
End Sub
Impedir Insertar Hojas
Private Sub Workbook_NewSheet(ByVal HojaNueva As Object)
Application.DisplayAlerts = False
MsgBox "No se permite adicionar mas hojas en este libro."
HojaNueva.Delete
Application.DisplayAlerts = True
End Sub
Desactivar / Activar mensajes de confirmacin que tiene Excel
Application.DisplayAlerts = False
Application.DisplayAlerts = True
(Application.DisplayAlerts = False) lo que est haciendo es que no se muestres ninguno de los
mensaje de confirmacin que tiene Excel como guardar cambios, eliminar hoja, entre otros, es decir,
al eliminar una hoja Excel pide confirmar dicha accin, as que con esta lnea lo que se hace es
desactivar el mensaje de confirmacin de eliminacin de la hoja para evitar que no sea eliminada. Al
dar el valor False al final de esta lnea se est desactivando la confirmacin de eliminacin.
(Application.DisplayAlerts = True) lo que hace es activar nuevamente los mensajes de confirmacin
de Excel para cualquier otra accin por ejemplo, si cerramos el libro sin guardar, Excel primero
pregunta si se desean guardar los cambios, as que es necesario dejar el valor True para que se
puedan seguir mostrando los mensajes de confirmacin de Excel.
Impedir Guardar el Libro de Trabajo
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox "No est permitido guardar este libro de trabajo"
Cancel = True
End Sub
Registrar Fecha y Hora al Cerrar Libro
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Range("A2").Formula = "=NOW()"
End Sub
Insertar Frmulas
Range("A2").Formula = "=NOW()"
Mostrar hora al abrir libro
Private Sub Workbook_Open()
MsgBox "La hora actual en el sistema es: " & Time
End Sub
Detectar nombre de usuario
Private Sub Workbook_Open()
On Error Resume Next
Usuario = Application.UserName
MsgBox "El nombre de Usuario es " & Usuario
End Sub
Insertar el nombre de usuario en una celda
Private Sub Workbook_Open()
On Error Resume Next
Usuario = Application.UserName
MsgBox "El nombre de Usuario es " & Usuario
Range("B2") = Application.UserName
End Sub
Solicitar su nombre e insertarlo en una celda
Private Sub Workbook_Open()
On Error Resume Next
Range("B2") = (InputBox("Digite su nombre"))
End Sub
Deshabilitar men de clic derecho
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As
Boolean)
MsgBox "Las opciones del Men Clic derecho estan deshabilitadas"
Cancel = True
End Sub
Abrir libro automticamente
Sub Workbook_Open()
On Error Resume Next
Workbooks.Open Filename:="C:\Users\Laura Daniela\Desktop\Abrir Libro Automaticamente Libro
2.xlsx"
End Sub
No abrir libro despus de determinada hora
Private Sub Workbook_Open()
hora = (Now - Int(Now)) * 24
If hora > 17 Then
MsgBox "No es horario para abrir el archivo"
ActiveWorkbook.Save
ActiveWorkbook.Close
End If
End Sub
Mensaje de descanso
Macro
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:30:00"), "Descanso"
End Sub
Mdulo: Para programar la macro Descanso primero debemos insertar un Mdulo en el Editor de
Visual Basic y para ello nos ubicamos en el Explorador de Proyectos sobre el objeto ThisWorkbook,
damos clic derecho, seleccionamos la opcin Insertar y elegimos Mdulo.
Sub Descanso()
MsgBox "Es hora de un receso"
End Sub
Mensaje de saludo de acuerdo a la hora
Private Sub Workbook_Open()
Hora = (Now - Int(Now)) * 24
Select Case Hora
Case 6 To 12
MsgBox "Buenos das"
Case 12 To 18
MsgBox "Buenas tardes"
Case Else
MsgBox "Buenas noches"
End Select
End Sub
Ejecutar macro a una hora determinada (Guardar el libro)
Macro
Private Sub Workbook_Open()
Application.OnTime TimeValue("11:55:00"), "MedioDia"
End Sub
Mdulo
Sub MedioDia()
ActiveWorkbook.Save
MsgBox "Se ha Guardado el Libro. Faltan 5 minutos para el medio dia"
End Sub
Ejecutar macro segn da y hora (Guardar el libro)
Macro
Private Sub Workbook_Open()
Select Case Day
Case Monday To Wednesday
Application.OnTime TimeValue("11:55:00"), "MedioDia"
Case Else
Application.OnTime TimeValue("13:55:00"), "Tarde"
End Select
End Sub
Mdulos
Sub MedioDia()
ActiveWorkbook.Save
MsgBox "Se ha Guardado el Libro. Faltan 5 minutos para el medio dia"
End Sub
Sub Tarde()
ActiveWorkbook.Save
MsgBox "Se ha Guardado el Libro. Faltan 5 minutos para las 2 de la tarde"
End Sub
Activar vista en pantalla completa
Private Sub Workbook_Open()
Application.DisplayFullScreen = True
ActiveWindow.DisplayHeadings = False
End Sub
Cuadro de dialogo Abrir Archivo programado a una hora determinada
Private Sub Workbook_Open()
Application.OnTime TimeValue("16:55:00"), "Abrir"
End Sub
Mdulo
Sub Abrir()
On Error Resume Next
Application.FileDialog(msoFileDialogOpen).Show
End Sub
Cuadro de dialogo Guardar Como programado a una hora determinada
Private Sub Workbook_Open()
Application.OnTime TimeValue("16:55:00"), "GuardarComo"
End Sub
Mdulo
Sub GuardarComo()
On Error Resume Next
Application.GetSaveAsFilename.Show
End Sub
Copias de seguridad cada hora
Private Sub Workbook_Open()
Application.OnTime TimeValue("09:00:00"),
Application.OnTime TimeValue("10:00:00"),
Application.OnTime TimeValue("11:00:00"),
Application.OnTime TimeValue("12:00:00"),
Application.OnTime TimeValue("13:00:00"),
Application.OnTime TimeValue("14:00:00"),
Application.OnTime TimeValue("15:00:00"),
Application.OnTime TimeValue("16:00:00"),
Application.OnTime TimeValue("17:00:00"),
End Sub
"Copia"
"Copia"
"Copia"
"Copia"
"Copia"
"Copia"
"Copia"
"Copia"
"Copia"
Mdulo
Sub Copia()
On Error Resume Next
Application.GetSaveAsFilename.Show
End Sub
Obtener informacin adicional de la computadora
Private Sub Workbook_Open()
On Error Resume Next
Usuario = Environ("USERNAME")
Dominio = Environ("USERDOMAIN")
NombreComputadora = Environ("COMPUTERNAME")
MsgBox "Usuario: " & Usuario & vbCrLf & "Dominio: " & Dominio & vbCrLf & "Nombre
Computador: " & NombreComputadora
End Sub
Propiedad Environ:
ALLUSERSPROFILE
APPDATA
AVENGINE
CLIENTNAME
CommonProgramFiles
COMPUTERNAME
ComSpec
FP_NO_HOST_CHECK
HOMEDRIVE
HOMEPATH
INCLUDE
INOCULAN
LIB
LOGONSERVER
NUMBER_OF_PROCESSORS
OS
Path
PATHEXT
PROCESSOR_ARCHITECTURE
PROCESSOR_IDENTIFIER
PROCESSOR_LEVEL
PROCESSOR_REVISION
ProgramFiles
SESSIONNAME
SystemDrive
SystemRoot
TEMP
TMP
USERDOMAIN
USERNAME
USERPROFILE
Autenticacin Utilizar nombre de usuario
Private Sub Workbook_Open()
On Error Resume Next
Usuario = Environ("USERNAME")
If Usuario <> "MiUsuario" Then
MsgBox "No estas autorizado para abrir este Libro"
ActiveWorkbook.Close
Exit Sub
End If
End Sub
Mensaje saludo personalizado - usuario y pas
Private Sub Workbook_Open()
On Error Resume Next
Usuario = Environ("USERNAME")
Hora = (Now - Int(Now)) * 24
Idioma = Application.International(xlCountryCode)
If Idioma = 1 Then
Select Case Hora
Case 6 To 12
MsgBox "Good Morning " & Usuario
Case 12 To 18
MsgBox "Good Afternoon " & Usuario
Case Else
MsgBox "Good Evening " & Usuario
End Select
Else
Select Case Hora
Case 6 To 12
MsgBox "Buenos Dias " & Usuario
Case 12 To 18
MsgBox "Buenas Tardes " & Usuario
Case Else
MsgBox "Buenas Noches " & Usuario
End Select
End If
End Sub
Tiempo de espera en la ejecucin de una macro
Private Sub Workbook_Open()
On Error Resume Next
FormularioSaludo.Show
End Sub
Formulario
Private Sub UserForm_Activate()
Application.Wait Now + TimeValue("00:00:05")
FormularioSaludo.Hide
End Sub
Ocultar hojas del libro
Private Sub Workbook_Open()
On Error Resume Next
NroHojas = ActiveWorkbook.Sheets.Count
For N = 2 To NroHojas
Sheets(N).Visible = False
Next
End Sub
Ocultar lneas de celdas
Private Sub Workbook_Open()
On Error Resume Next
NroHojas = ActiveWorkbook.Sheets.Count
For N = 1 To NroHojas
Sheets(N).Activate
ActiveWindow.DisplayGridlines = Not (ActiveWindow.DisplayGridlines)
Next
End Sub
Autoborrado de la informacin
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
NroHojas = ActiveWorkbook.Sheets.Count
For N = 1 To NroHojas
Sheets(N).Select
Cells.Select
Selection.Cells.ClearContents
Next
ActiveWorkbook.Close savechanges:=True
End Sub
Auto Eliminacin de Hojas Despus de Cerrar el Libro
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Usuario = Environ("USERNAME")
If Usuario <> "MiUsuario" Then
Application.DisplayAlerts = False
NroHojas = ActiveWorkbook.Sheets.Count
Sheets(NroHojas).Select
Sheets.Add After:=ActiveSheet
For N = 1 To NroHojas
Sheets(N).Delete
Next
ActiveWorkbook.Close savechanges:=True
Application.DisplayAlerts = True
End If
End Sub
MsgBox en primer plano
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:30:00"), "Receso"
End Sub
Mdulo
Sub Receso()
MsgBox "Es hora de un receso", vbOKOnly + vbSystemModal
End Sub
Aumentar zoom a un grfico
Public Sub Aumentar()
ActiveSheet.ChartObjects("Grfico 4").Activate
ActiveChart.Axes(xlValue).MinimumScale = 80
ActiveChart.Axes(xlValue).MaximumScale = 100
End Sub
Disminuir zoom a un grfico
Public Sub Disminuir()
ActiveSheet.ChartObjects("Grfico 4").Activate
ActiveChart.Axes(xlValue).MinimumScaleIsAuto = True
ActiveChart.Axes(xlValue).MaximumScaleIsAuto = True
End Sub
Conteo Regresivo
Mdulo
Sub ProgramaCuentaRegresiva()
Dim CuentaRegresiva As Date
CuentaRegresiva = Now + TimeValue("00:00:01")
Application.OnTime CuentaRegresiva, "ProgramaCuenta"
End Sub
Sub ProgramaCuenta()
Dim Cuenta As Range
Set Cuenta = [A2]
Cuenta.Value = Cuenta.Value - TimeSerial(0, 0, 1)
If Cuenta <= 0 Then
MsgBox "Termin el Conteo", vbExclamation, "Cuenta Regresiva"
Exit Sub
End If
Call ProgramaCuentaRegresiva
End Sub
Contador de veces
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Row = 1 And Target.Column = 1 Then
Range("A2").Value = Range("A2").Value + 1
Range("A2").Select
End If
End Sub
En caso de que queramos cambiar la celda sobre la cual al dar clic se incremente el valor de la
celda A2 modificamos la lnea 2:
If Target.Row = 1 And Target.Column = 1 Then
Especficamente el nmero 1 en TargetRow hace referencia al nmero de Fila y en TargetColumn
hace referencia a la columna; de esta manera, si queremos que la celda sobre la cual al dar clic
se realice el conteo sea la C5, entonces la lnea quedara de la siguiente manera:
If Target.Row = 5 And Target.Column = 3 Then