Está en la página 1de 10

Ejemplos de Macros

Nro
Macro y Descripcin
1
Auto_Open() y Auto_Close()
Existe una macro de autoarranque que se ejecuta cuando se abre el libro. Se llama auto_open().
Y existe otra que se ejecuta justo antes de cerrar el libro que se llama auto_close().

Sub Auto_Open()
Dim hora As Double
Dim saludo As String
hora = (Now - Int(Now)) * 24
Select Case hora
Case 6 To 14
saludo = "Buenos das"
Case 14 To 21
saludo = "Buenas tardes"
Case Else
saludo = "Buenas noches"
End Select
MsgBox saludo & " Amo"
End Sub

Equivalente a auto_open existe otra macro Workbook_Open, pero sta ha de ser guardada no en un
mdulo normal, sino en ThisWorkbook. Pruebe lo siguiente:

El siguiente procedimiento permite abrir automticamente el libro Balance.xls al abrir el libro Informe.xls.
El procedimiento ha de estar en ThisWorkbook del libro Informe.xls.

Sub Workbook_Open()
'Apertura de libro Balance
Workbooks.Open Filename:="C:/Temp/Balance.xls"
'Activacin del libro Informe
Windows("Informe.xls").Activate
End Sub
2
Saludo al arrancar
Crear un libro Personal.xls como se ha indicado anteriormente con la macro de autoarranque siguiente:

Sub Auto_open()
MsgBox ("Que tengas un buen da")
End Sub

Esta macro creada en el libro Personal.xls hace que al iniciar Excel nos salga un mensaje saludndonos.
3
Nombrar Hoja desde una celda
Esta macro permite asignar el nombre que pongamos en la celda A1 como nombre de la Hoja actual.

Sub NombreHoja()
ActiveSheet.Name = Range("A1").Value
End Sub
4
Exportar un mdulo
1. Pase al editor de visual basic y active el mdulo a exportar.
2. Seleccione Archivo/ Exportar archivo. Aparece un cuadro de dilogo.
3. En cuadro de edicin Nombre de Archivo, teclee el nombre para el archivo donde se guardar el
mdulo, por ejemplo "General.Bas", observe que .BAS es la extensin de estos archivos.
4. Pulse sobre el botn Guardar.
Nro
Macro y Descripcin
5
Importar un mdulo
1. Active el editor Visual Basic.
2. Seleccione Archivo/ Importar Archivo. Aparece un cuadro de dilogo.
3. Seleccione en la lista Buscar en: la carpeta donde tiene ubicado el archivo a importar.
4. Una vez localizada la carpeta, seleccione el archivo a importar (General.Bas en el ejemplo) y pulse
sobre Abrir.

6
La clusula Private
Puede anteponer la clusula private a todos los procedimientos y funciones que sean llamados slo desde
el mismo mdulo, es una forma de ahorrar memoria y hacer que el programa corra un poco ms rpido. Si
necesita llamar un procedimiento o funcin desde otro mdulo, nunca debe precederlo por la clusula
private, recuerde que esta clusula restringe el mbito de utilizacin de un procedimiento a su propio
mdulo.

7
Inspeccin rpida de variables
Cuando ejecuta un programa paso a paso, si sita el puntero de ratn sobre una variable, se muestra el
valor de la misma.

8
Modificar el valor de una variable en tiempo de ejecucin
A veces resulta interesante cambiar el valor de alguna variable cuando se est ejecutando el programa,
para ver que ocurre si coge determinados valores, para terminar un bucle, etc.
Para ello agregue a la ventana de inspeccin la variable que desee cambiar, cambie su valor sobre la
propia ventana de inspeccin y contine la ejecucin del programa.
9
Ventana Inmediato
Puedes inspeccionar variables desde esta ventana anteponiendo la palabra print antes de la variable, o el
signo ?.
10

Debug.Print
Esta expresin permite efectuar la depuracin del programa de forma ms cmoda. Se introduce en un
programa antecediendo a una variable que se desea comprobar en la ventana Inmediato. De esta forma
conseguiremos ver todos los valores que toma la variable cada vez que el programa pasa por este
comando. Se ven en la Ventana Inmediato [Ctr+G].
.
Ejemplo:
Sub Dos_a_la_diez()
Dim i As Integer
Dim t As Integer
t = 1
For i = 1 To 10
t = t * 2
Debug.Print "Dos a la " & i & " = " & t
Next
MsgBox t
End Sub
Despus de efectuada la depuracin se quita la lnea que contiene el comando Debug.Print.

11

Propiedad ListFillRange del ComboBox
Con esta propiedad deberemos definir los elementos que debe mostrar la lista, debe especificarse el
rango que contiene los elementos a mostrar, el rango debe ser una columna (o dos , o tres, etc.).
Nro
Macro y Descripcin

12
Propiedad LinKedCell del ComboBox
En esta propiedad debe especificar en que celda debe copiarse el elemento seleccionado de la lista.
Cuidado con esta propiedad, tenga en cuenta que los elementos de la lista son tratados como datos de
tipo String aunque contenga nmeros o fechas, por lo que en estos casos, a veces ser necesario aplicar
funciones de conversin de datos antes que el dato se copie en la hoja. Por ejemplo, si alguna vez
construye una lista con nmeros ver que el dato seleccionado se alinea a la derecha, si son fechas, no se
muestra con el formato correspondiente.
13
Propiedad ListIndex del ComboBox
Mediante esta propiedad podremos saber que elemento de la lista es el seleccionado por su nmero de
orden. Es decir, si est seleccionado el primero, ListIndex valdr 0, si est seleccionado el segundo valdr
1, etc. Si no hay ningn elemento seleccionado valdr -1. Tenga en cuenta que esta propiedad slo est
disponible en tiempo de ejecucin, es decir la podremos leer mientras est funcionando el programa, no
se puede establecer en modo diseo, observe que no aparece en la ventana propiedades del cuadro
combinado.

14
Cambiar el nombre de un Mludo
Al insertar mdulos en el Editor de Visual Basic, se utilizan los nombres: Mdulo 1, Mdulo 2, etc.
Podemos cambiar el nombre el un mdulo en sus propiedades (F4). La nica propiedad de un Mdulo es
'name'.
15
Nombre de usuario: UserName
Vamos a crear una funcin que proporcione el nombre de usuario. Primero utilizando la Grabadora de
Macros. Haga lo siguiente. Active la Grabadora y luego seleccione Herramientas, Opciones, pestaa
General. Realice un cambio en el nombre de usuario. Cerrar la ventana de Opciones pulsando en Aceptar.
Y detener la Grabadora. La macro obtenida ser la siguiente:

Sub Macro1()
'
' Macro1 Macro
' Macro grabada el 06/08/2004 por Adolfo
'

'
With Application
.UserName = "Adolfo Aparicio"
.StandardFont = "Arial"
.StandardFontSize = "10"
.DefaultFilePath = "C:\Documents and Settings\Adolfo\Mis documentos"
.EnableSound = False
.RollZoom = False
End With
End Sub


Ahora vamos a crear la funcin =Usuario siguiendo el procedimiento inverso.

Funcition Usuario()
Usuario = Application.UserName
End Function


Puede probarla. La encontrar en la categora de Funciones Definidas por el usuario.
Nro
Macro y Descripcin
16
Extensiones de los nombres de macro
- Mdulos de clase. Extensin .cls.
- Formularios. Extensin .frm.
- Mdulos estandar. Extensin .bas.
17
Exit Sub, Exit Function
Se usan eventualmente para salir de un procedimiento o funcin.
18
Macro que pregunta si se desea salir de la aplicacin
Sub SalirAplic()
If MsgBox("Quiere salir de la aplicacin", vbQuestion + vbYesNo, "Ultima pregunta") = vbYes Then
Application.Quit
End If
End Sub
19
Llamada a un procedimiento
[Call] NombreProc [(lista de argumentos)]
La palabra clave Call es opcional para llamar a un procedimiento, salvo que existan argumentos, en cuyo
caso es obligatoria. Los argumentos deben ir entre parntesis y pueden ser valores o variables.
Sub Suma(a As Byte, b As Byte)
MsgBox "La suma es " & a + b
End Sub
Sub sumar()
Call Suma(3, 4)
End Sub
Para llamar a un procedimiento de otro mdulo
NombreDelMdulo.NombreDelProcedimiento
Ejemplo: ThisWorkbook.SalirAplic
Para llamar a un procedimiento de otro libro
Application.Run "NombreDelLibro!NombreDelMdulo.NombreDelProcedimiento"
Ejemplo: Application.Run "Informe.xls!ThisWorkbook.SalirAplic.xls"
Al ejecutar este comando, el libro Informe.xls debe estar abierto.
20
Proteger con contrasea las macros
Alt + F11
Herramientas => Propiedades de VBAProject => Proteccin => Bloquear proyecto para visualizacin =>
Contrasea
21
Convertir una funcin en un Complemento
Podemos hacer que una funcin creada por el usuario este disponible en todos los Libros. Para ello,
hemos de convertir el Libro que contiene la funcin en un Complemento.
Los Complementos disponibles se ven haciendo: Herramientas => Complementos.
Excel carga los complementos guardados en el directorio donde tengis instalado MsOffice y luego en una
carpeta que vara con la versin que tengas instalada. Para XP puede ser:
C:\Documents and Settings\Adolfo\Datos de programa\Microsoft\AddIns\
Para convertir el libro que contiene nuestra Funcin en un Complemento, bastara ir al Men
Archivo/Guardar como y elegir el formato Complemento de Microsoft Excel (*.xla). Si lo guardis en el
directorio que tiene tu versin asignado estar siempre disponible.
Un aspecto a tener en cuenta es que los Complementos no son editables, es decir no podrs modificar o
aadir mas Funciones. Por eso es recomendable guardar primero el Libro en formato *.xls y luego como
*.xla.
Nro
Macro y Descripcin
22
Para localizar la ltima celda de una lista
Sub Final()
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Wend
End Sub
23
Abrir un libro existente:
Sub AbrirLibro()
Workbooks.Open ("C:\Mis documentos\Ejemplo.xls")
End Sub
Activar un libro ya abierto:
Sub ACtivarLibro()
Workbooks("Ejemplo.xls").Activate
End Sub
Crear un libro nuevo:
Sub NuevoLibro()
Workbooks.Add
End Sub

24
Borrar un registro de una tabla que contenga un dato concreto
Sub BorrarFilas()
While ActiveCell.Value <> ""
If ActiveCell.Value <> "Cadiz" Then
ActiveCell.Offset(1, 0).Range("A1").Select
Else
Selection.EntireRow.Delete
End If
Wend
End Sub

25
Creacin de una Frmula personalizada
Clculo del trmino amortizativo de un prstamo tipo francs (de pagos constantes). Similar a la frmula
=PAGO pero en este caso usando tipo nominal y con fraccionamiento.
Function Termino(Principal@, Aos As Byte, tipo_nominal!, fraccionamiento As Byte)
Dim im! 'Tipo efectivo del subperiodo
im = tipo_nominal / fraccionamiento / 100
Termino = Principal * im / (1 - (1 + im) ^ (-Aos * fraccionamiento))
End Function
Pongamos un ejemplo para un principal de 100.000 , 10 aos, tipo nominal anual del 6%, con
fraccionamiento mensual. En este caso, al ser el fraccionamiento mensual el trmino obtenido es la
mensualidad.
Sub ejemplo()
End Sub
26
Macro que cierra Excel
Se puede asociar a un botn o a un icono.
Sub Auto_Close()
Application.Quit
End Sub
Nro
Macro y Descripcin
27
Macro que elimina las barras de desplazamiento
Sub Desbarra()
With ActiveWindow
.DisplayHorizontalScrollBar = False
.DisplayVerticalScrollBar = False
End With
End Sub
28
Macro que protege el libro y la hoja

Sub Blindaje()
ActiveWorkbook.Protect Password:="1234"
Sheets("Hoja1").Protect Password:="1234"
End Sub
29
Macro que borra los ceros de un rango
Sub BorrarCeros()
For Each Celda In Range("C11:G24")
If Celda.Value = 0 Then Celda.ClearContents
Next
End Sub
Si slo se quieren ocultar los ceros se ha de poner formato de celda personalizado de #.###
30
Macro que reemplaza una palabra por otra
Sub RemplazarPalabra()
Dim Palabra As String
Dim Hoja As Long
Palabra = Trim(InputBox("Introduzca la palabra a buscar: "))
For Hoja = 1 To Sheets.Count
Sheets(Hoja).Activate
Cells.Replace What:=Palabra, Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next Hoja
End Sub
En este caso reemplazamos por "", lo que supone borrar la palabra buscada.
31
Calculo del NIF
Esta funcin calcula el NIF (Nmero de Identificacin Fiscal) utilizado en Espaa.
Function nif(dni As Long) As String
nif = Mid("TRWAGMYFPDXBNJZSQVHLCKE", (dni Mod 23) + 1, 1)
End Function
32
Funcin que calcula la fila que ocupa cierto valor en una tabla
Est pensado para que la matriz se ponga comenzando en la celda A1, sin encabezado y sin que se repitan
los elementos.
Function DimeFila(Rango As Range, Valor_a_buscar) As Integer
For Each c In Rango
If c.Value = Valor_a_buscar Then
DimeFila = c.Row
End If
Next
End Function
Nro
Macro y Descripcin
33
Funcin que muestra la frmula de una celda
Devuelve la frmula que contiene una celda en lenguaje local

Function DisplayCellFormula(InputCell As Range) As String
DisplayCellFormula = InputCell.FormulaLocal
End Function
Si se quita la palabra 'Local' devuelve la frmula en ingls.
34
Determinacin de si un nmero es primo o no es primo
Sub primo()
Dim primo As Boolean
Dim n As Long
Dim d As Long
n = Val(InputBox("Introduce un nmero natural", "Entrada de Datos"))
d = 2
primo = True
Do While primo And d < n
If n Mod d = 0 Then
primo = False
End If
d = d + 1
Loop
If primo Then
MsgBox (n & " es primo")
Else
MsgBox (n & " no es primo")
End If
End Sub
35
Factorial
Function facto(n)
Dim i As Integer
facto = 1
i = 0
Do
i = i + 1
facto = facto * i
Loop While i <> n
End Function
36
Inicializar una matriz
Se inicializa con ERASE
'En este caso se ponen todos los valores a Empty
Sub test()
Dim c(1 To 20, 1 To 10) As Variant
For i = 1 To 20
For j = 1 To 10
c(i, j) = RND
Next j
Next i
MsgBox c(1,1)
Erase c
MsgBox c(1,1)
End Sub
Nro
Macro y Descripcin

'En este caso se pone la variable c a su estado inicial
'Borrandose los valores, las dimensiones y recuperandose
'la memoria usada.
Sub test1()
Dim c As Variant
c = ActiveSheet.Range("A1:J20").Value
MsgBox c(1, 1)
Erase c
'Esto dara error ya que no hay ninguna matriz
MsgBox c(1, 1)
End Sub
37
Evitar los movimientos de pantalla mientras se ejecuta una macro
Para evitar que durante la ejecucin de una macro se vean todos los movimientos y cambios del cursor,
para evitar las "chirivitas" que se ven al ejecutar una macro:

Al principio de la macro escribe

Application.ScreenUpdating = False

y al final

Application.ScreenUpdating = True
38
Evitar que al ejecutar una macro nos haga preguntas
Al principio de la macro escribe

Application.DisplayAlerts= False

y al final

Application.DisplayAlerts=True
39
While...Wend
Esta estructura permite ejecutar las instrucciones contenidas mientras la condicin sea verdadera.

La siguiente macro posiciona el cursor en la ltima celda llena de la columna A de la Hoja1.
Sub final1()
i = 1
While Worksheets("Hoja1").Cells(i, 1).Value <> ""
Worksheets("Hoja1").Cells(i, 1).Select
i = i + 1
Wend
End Sub
Otra variante:
Sub final2()
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell.Offset(-1, 0).Select
End Sub
La segunda macro requiere posicionar inicialmente el cursor en la primera celda llena.

Nro
Macro y Descripcin
40

Manejo de Rangos
Para sealar una tabla se hace con CurrentRegion. Un ejemplo:

Dim R As Range
Dim filas As Long
Set R = Range("A1").CurrentRegion
filas = R.Rows.Count

41

Ocultar Hojas
Podemos ocultar o mostrar Hojas de un libro. En el ejemplo siguiente, la Hoja2 esta inicialmente oculta, y
para poder trabajar con ella la macro la mustra, y al finalizar la vuelve a ocultar.

Sub oculta()
Sheets("Hoja2").Visible = True
ActiveWorkbook.Sheets("Hoja2").Activate
'... ...
Sheets("Hoja2").Visible = False
End Sub

42
Determinar la fila hasta la que llega un rango
Podemos determinar facilmente la fila hasta la que llega un rango. Supongamos el rango B5:B100, del que
sabemos en que fila acaba (la 100), pero no sabemos en que fila comienza. Ejecutando la macro la variable
n tomar el valor 5, que es la fila de comienzo del rango.

Dim n As Long
Range("B100").End(xlUp).Select
n = Selection.Row

43
Retardar el tiempo de ejecucin de una Macro
Application.Wait Now + TimeValue("00:00:3")

44

Utilizacin de un Array
Sub ColumnaArray()
Dim i As Byte
Dim uso
uso = Array("AS", "AT", "BC", "BM", "BV", "BB", "BO", "DI", "EN", "FB")
Worksheets("Hoja1").Activate
Range("B4").Select
For i = 1 To 10
ActiveCell.Value = i
ActiveCell.Offset(0, 1).Value = uso(i - 1)
ActiveCell.Offset(1, 0).Activate
Next i
End Sub

Nro
Macro y Descripcin
45
Dejar una frmula en una celda
Lo mejor de las Macros es que pueden interactuar con la hoja de clculo. Todas las funciones de Excel
estan disponibles para ser utilizadas en las macros. Por ejemplo, podemos hacer la media del valor de dos
celdas y dejar el clculo en otra celda.
Range("I3") =Application.WorksheetFunction.Average(Range("H3"), Range("J3"))
Pero si lo que queremos es dejar no el valor del clculo sino la propia frmula se debera hacer de esta
forma:
Range("I3").Formula ="=average(H3,J3)"
Si queremos introducir la frmula de la TIR para toda una columna, podemos escribir el siguiente cdigo:
Range("I7").Formula ="=IRR(C:C)"
Si lo que deseamos es introducir en una celda, no la frmula, sino el clculo de la TIR aplicada a toda una
columna, el cdigo ser el siguiente:

Range("I7") = Application.WorksheetFunction.IRR(Columns("C:C").EntireColumn)
Y si de paso queremos poner formato lo hacemos as:

También podría gustarte