Upload
niltonsss
View
214
Download
1
Embed Size (px)
DESCRIPTION
Macros
Citation preview
Macros
Prof. ALI MERES
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 12
saludo = "Buenos días"
Case 12 To 18
saludo = "Buenas tardes"
Case Else
saludo = "Buenas noches"
End Select
MsgBox saludo & " Saludos de SISE"
End Sub
Equivalente a auto_open existe otra macro Workbook_Open, pero ésta ha de ser guardada no en un
módulo normal, sino en ThisWorkbook. Pruebe lo siguiente:
El siguiente procedimiento permite abrir automáticamente el libro Balance.xlsx al abrir el libro
Informe.xlsx. El procedimiento ha de estar en ThisWorkbook del libro Informe.xlsx.
Sub Workbook_Open()
'Apertura de libro Balance
Workbooks.Open Filename:="C:/Temp/Balance.xlsx"
'Activación del libro Informe
Windows("Informe.xlsx").Activate
End Sub
2
Saludo al arrancar
Crear un libro Personal.xlsx como se ha indicado anteriormente con la macro de autoarranque siguiente:
Sub Auto_open()
MsgBox ("Que tengas un buen día")
End Sub
Esta macro creada en el libro Personal.xlsx hace que al iniciar Excel nos salga un mensaje
saludándonos.
3
Exportar un módulo
1. Pase al editor de visual basic y active el módulo a exportar.
2. Seleccione Archivo/ Exportar archivo. Aparece un cuadro de diálogo.
3. En cuadro de edición Nombre de Archivo, teclee el nombre para el archivo donde se guardará el
módulo, por ejemplo "General.Bas", observe que .BAS es la extensión de estos archivos.
4. Pulse sobre el botón Guardar.
5
Importar un módulo
1. Active el editor Visual Basic.
2. Seleccione Archivo/ Importar Archivo. Aparece un cuadro de diálogo.
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
Debug.Print
Esta expresión permite efectuar la depuración del programa de forma más cómoda. 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
Macros
Prof. ALI MERES
Después de efectuada la depuración se quita la línea que contiene el comando Debug.Print.
7
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.).
8
Propiedad LinKedCell del ComboBox
En esta propiedad debe especificar en qué 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 números o fechas, por lo que en estos casos, a veces será necesario aplicar
funciones de conversión de datos antes que el dato se copie en la hoja. Por ejemplo, si alguna vez
construye una lista con números verá que el dato seleccionado se alinea a la derecha, si son fechas, no
se muestra con el formato correspondiente.
9
Propiedad ListIndex del ComboBox
Mediante esta propiedad podremos saber que elemento de la lista es el seleccionado por su número de
orden. Es decir, si está seleccionado el primero, ListIndex valdrá 0, si está seleccionado el segundo
valdrá 1, etc. Si no hay ningún elemento seleccionado valdrá -1. Tenga en cuenta que esta propiedad
sólo está disponible en tiempo de ejecución, es decir la podremos leer mientras esté funcionando el
programa, no se puede establecer en modo diseño, observe que no aparece en la ventana propiedades
del cuadro combinado.
10
Cambiar el nombre de un Módulo
Al insertar módulos en el Editor de Visual Basic, se utilizan los nombres: Módulo 1, Módulo 2, etc.
Podemos cambiar el nombre el un módulo en sus propiedades (F4). La única propiedad de un Módulo
es 'name'.
11
Nombre de usuario: UserName
Vamos a crear una función que proporcione el nombre de usuario. Primero utilizando la Grabadora de
Macros. Haga lo siguiente. Active la Grabadora y luego seleccione Archivo, Opciones, 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()
'Macro grabada el 05/10/2011 por ALI MERES
With Application
.UserName = "FUAD MERES"
.StandardFont = "Adobe Arabic"
.StandardFontSize = "14"
.SheetsInNewWorkbook = 2
End With
End Sub
Ahora vamos a crear la función =Usuario siguiendo el procedimiento inverso.
Function Usuario()
Usuario = Application.UserName
End Function
Puede probarla. La encontrará en la categoría de Funciones Definidas por el usuario.
12 Exit Sub, Exit Function
Se usan eventualmente para salir de un procedimiento o función.
13
Macro que pregunta si se desea salir de la aplicación
Sub SalirAplic()
If MsgBox("¿Quiere salir de la aplicación", vbQuestion + vbYesNo, "Ultima pregunta") = vbYes Then
Application.Quit
End If
End Sub
14
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 paréntesis 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 módulo
Macros
Prof. ALI MERES
NombreDelMódulo.NombreDelProcedimiento
Ejemplo: ThisWorkbook.SalirAplic
Para llamar a un procedimiento de otro libro
Application.Run "NombreDelLibro!NombreDelMódulo.NombreDelProcedimiento"
Ejemplo: Application.Run "Informe.xlsx!ThisWorkbook.SalirAplic.xlsx"
Al ejecutar este comando, el libro Informe.xlsx debe estar abierto.
15
Proteger con contraseña las macros
Alt + F11
Herramientas => Propiedades de VBAProject => Protección => Bloquear proyecto para visualización
=> Contraseña
16
Convertir una función en un Complemento
Podemos hacer que una función creada por el usuario este disponible en todos los Libros. Para ello,
hemos de convertir el Libro que contiene la función en un Complemento.
Los Complementos disponibles se ven haciendo: Herramientas => Complementos.
Excel carga los complementos guardados en el directorio donde tengáis instalado MsOffice y luego en
una carpeta que varía con la versión que tengas instalada. Para XP puede ser:
C:\Documents and Settings\ALI MERES\Datos de programa\Microsoft\AddIns\
Para convertir el libro que contiene nuestra Función en un Complemento, bastara ir al Menú
Archivo/Guardar como y elegir el formato Complemento de Microsoft Excel (*.xla). Si lo guardáis en
el directorio que tiene tu versión asignado estará siempre disponible. Un aspecto a tener en cuenta es
que los Complementos no son editables, es decir no podrás modificar o añadir mas Funciones. Por eso
es recomendable guardar primero el Libro en formato *.xls y luego como *.xla.
17
Para localizar la última celda de una lista
Sub Final()
While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Wend
End Sub
18
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
19
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
20
Creación de una Fórmula personalizada
Cálculo del término amortizativo de un préstamo tipo francés (de pagos constantes). Similar a la
fórmula =PAGO pero en este caso usando tipo nominal y con fraccionamiento.
Function Termino(Principal@, Años As Byte, tipo_nominal!, fraccionamiento As Byte)
Dim im! 'Tipo efectivo del subperiodo
im = tipo_nominal / fraccionamiento / 100
Termino = Principal * im / (1 - (1 + im) ^ (-Años * fraccionamiento))
End Function
Pongamos un ejemplo para un principal de 100.000 €, 10 años, tipo nominal anual del 6%, con
fraccionamiento mensual. En este caso, al ser el fraccionamiento mensual el término obtenido es la
mensualidad.
Macros
Prof. ALI MERES
Sub ejemplo()
End Sub
21
Macro que cierra Excel Se puede asociar a un botón o a un icono.
Sub Auto_Close()
Application.Quit
End Sub
22
Macro que elimina las barras de desplazamiento
Sub Desbarra()
With ActiveWindow
.DisplayHorizontalScrollBar = False
.DisplayVerticalScrollBar = False
End With
End Sub
23
Macro que protege el libro y la hoja
Sub Blindaje()
ActiveWorkbook.Protect Password:="1234"
Sheets("Hoja1").Protect Password:="1234"
End Sub
24
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 sólo se quieren ocultar los ceros se ha de poner formato de celda personalizado de #.###
25
Función 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
26
Función que muestra la fórmula de una celda
Devuelve la fórmula 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 fórmula en inglés.
27
Evitar los movimientos de pantalla mientras se ejecuta una macro Para evitar que durante la ejecución 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
28
Evitar que al ejecutar una macro nos haga preguntas Al principio de la macro escribe
Application.DisplayAlerts= False
y al final
Application.DisplayAlerts=True
29
While...Wend
Esta estructura permite ejecutar las instrucciones contenidas mientras la condición 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 <> ""
Macros
Prof. ALI MERES
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.
30
Manejo de Rangos
Para señalar 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
31
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
32
Determinar la fila hasta la que llega un rango
Podemos determinar fácilmente la fila hasta la que llega un rango. Supongamos el rango B5:B100, del
que sabemos en qué fila acaba (la 100), pero no sabemos en qué 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
33 Retardar el tiempo de ejecución de una Macro Application.Wait Now + TimeValue("00:00:3")
34
Dejar una fórmula en una celda
Lo mejor de las Macros es que pueden interactuar con la hoja de cálculo. Todas las funciones de Excel
están disponibles para ser utilizadas en las macros. Por ejemplo, podemos hacer la media del valor de
dos celdas y dejar el cálculo en otra celda.
Range("I3") =Application.WorksheetFunction.Average(Range("H3"), Range("J3"))
Pero si lo que queremos es dejar no el valor del cálculo sino la propia fórmula se debería hacer de esta
forma:
Range("I3").Formula ="=average(H3,J3)"
Si queremos introducir la fórmula de la TIR para toda una columna, podemos escribir el siguiente
código: Range("I7").Formula ="=IRR(C:C)"
Si lo que deseamos es introducir en una celda, no la fórmula, sino el cálculo de la TIR aplicada a toda
una columna, el código será el siguiente:
Range("I7") = Application.WorksheetFunction.IRR(Columns("C:C").EntireColumn)
Y si de paso queremos poner formato lo hacemos así:
Range("H3:J3").NumberFormat ="##.#0%"