![]() |
Trucos de Macros |
|
Adolfo Aparicio |
|
| 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()
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.xls al abrir el libro Informe.xls. El procedimiento ha de estar en ThisWorkbook del libro Informe.xls.
Sub
Workbook_Open() Workbooks.Open Filename:="C:/Temp/Balance.xls" 'Activación 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()
Esta macro creada en el libro Personal.xls hace que al iniciar Excel nos salga un mensaje saludándonos. |
|
| 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() |
|
| 4 |
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 |
La cláusula Private Puede anteponer la cláusula private a todos los procedimientos y funciones que sean llamados sólo desde el mismo módulo, es una forma de ahorrar memoria y hacer que el programa corra un poco más rápido. Si necesita llamar un procedimiento o función desde otro módulo, nunca debe precederlo por la cláusula private, recuerde que esta cláusula restringe el ámbito de utilización de un procedimiento a su propio módulo. |
|
| 7 |
Inspección rápida de variables Cuando ejecuta un programa paso a paso, si sitúa el puntero de ratón sobre una variable, se muestra el valor de la misma. |
|
| 8 |
Modificar el valor de una variable en tiempo de ejecución 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 inspección la variable que desee cambiar, cambie su valor sobre la propia ventana de inspección y continúe la ejecución 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 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() Después de efectuada la depuración se quita la línea 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.). |
|
| 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 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. |
|
| 13 |
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. |
|
| 14 |
Cambiar el nombre de un Móludo 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'. |
|
| 15 |
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 Herramientas, Opciones, pestaña 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()
Ahora vamos a crear la función =Usuario siguiendo el procedimiento inverso.
Funcition Usuario() Usuario = Application.UserName End Function
Puede probarla. La encontrará en la categoría de Funciones Definidas por el usuario. |
|
| 16 |
Extensiones de los nombres de macro - Módulos de clase. Extensión .cls. - Formularios. Extensión .frm. - Módulos estandar. Extensión .bas. |
|
| 17 |
Exit Sub, Exit Function Se usan eventualmente para salir de un procedimiento o función. |
|
| 18 |
Macro que pregunta si se desea salir de la aplicación Sub SalirAplic() |
|
| 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 paréntesis y pueden ser valores o variables. Sub
Suma(a As Byte,
b As Byte)
Para llamar a un procedimiento de otro módulo NombreDelMódulo.NombreDelProcedimiento Ejemplo: ThisWorkbook.SalirAplic
Para llamar a un procedimiento de otro libro Application.Run "NombreDelLibro!NombreDelMódulo.NombreDelProcedimiento" Ejemplo: Application.Run "Informe.xls!ThisWorkbook.SalirAplic.xls" Al ejecutar este comando, el libro Informe.xls debe estar abierto. |
|
| 20 |
Proteger con contraseña las macros Alt + F11 |
|
| 21 |
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\Adolfo\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. |
|
| 22 |
Para localizar la última celda de una lista Sub Final() |
|
| 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() |
|
| 25 |
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) 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. Sub
ejemplo() End Sub |
|
| 26 |
Macro que cierra Excel Se puede asociar a un botón o a un icono. Sub Auto_Close()
Application.Quit |
|
| 27 |
Macro que elimina las barras de desplazamiento
Sub Desbarra() With ActiveWindow |
|
| 28 |
Macro que protege el libro y la hoja
Sub Blindaje()
ActiveWorkbook.Protect Password:="1234" |
|
| 29 |
Macro que borra los ceros de un rango Sub
BorrarCeros() Si sólo se quieren ocultar los ceros se ha de poner formato de celda personalizado de #.### |
|
| 30 |
Macro que reemplaza una palabra por otra Sub
RemplazarPalabra() En este caso reemplazamos por "", lo que supone borrar la palabra buscada. |
|
| 31 |
Calculo del NIF Esta función calcula el NIF (Número de Identificación Fiscal) utilizado en España. Function
nif(dni As Long) As String |
|
| 32 |
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 |
|
| 33 |
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
Si se quita la palabra 'Local' devuelve la fórmula en inglés. |
|
| 34 |
Determinación de si un número es primo o no es primo Sub
primo() |
|
| 35 |
Factorial Function facto(n) |
|
| 36 |
Inicializar una matriz Se inicializa con ERASE
|
|
| 37 |
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: |
|
| 38 |
Evitar que al ejecutar una macro nos haga preguntas Al principio de la macro escribe |
|
| 39 |
While...Wend Esta
estructura permite ejecutar las instrucciones contenidas mientras la
condición sea verdadera. i = 1 While Worksheets("Hoja1").Cells(i, 1).Value <> "" Worksheets("Hoja1").Cells(i, 1).Select i = i + 1 Wend End Sub
Sub final2() La
segunda macro requiere posicionar inicialmente el cursor en la primera
celda llena. |
|
| 40 |
Manejo de Rangos Para señalar una tabla se hace con CurrentRegion. Un ejemplo:
|
|
| 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.
|
|
| 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.
|
|
| 43 |
Retardar el tiempo de ejecución de una Macro Application.Wait Now + TimeValue("00:00:3") |
|
| 44 |
Utilización de un Array Sub
ColumnaArray() |
|
| 45 |
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 estan 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%"
|
| Página de Inicio | Excel | Financieras | Macros | Otros Trucos |
Adolfo Aparicio © 2004-2010