Escribir macros de VBA desde cero

La grabadora de macros de Excel tiene mucha potencia, pero tiene sus limitaciones. Como se explica en otro artículo, la grabadora de macros a menudo registra código innecesario y no puede registrar cosas como la lógica o las interacciones con otros programas. También puede ser difícil de usar para macros más largas; es posible que tenga que hacer un guión gráfico de sus acciones de antemano solo para evitar cometer errores costosos.

Este artículo tiene como objetivo ayudarlo a comenzar a codificar macros desde cero en VBA. Aprenderá dónde se almacenan las macros, escribirá una macro básica y aprenderá los conceptos básicos de la programación en VBA utilizando variables, lógica y bucles.

Empezando

VBA y el editor de Visual Basic

VBA, o Visual Basic para aplicaciones, es el lenguaje en el que se escriben las macros. Todas las macros se almacenan como código VBA, ya sea que estén codificadas a mano o creadas con la grabadora de macros.

Puede acceder a todo el código VBA en un libro de trabajo utilizando el Editor de Visual Basic. Se trata de un depurador y editor de texto especial que está integrado en todas las aplicaciones de Office, incluido Excel. Normalmente, abrirá este editor con el ALT + F11 método abreviado de teclado en Excel, pero también puede acceder a él desde Excel Desarrollador pestaña si la tiene habilitada.

El explorador de proyectos

los Explorador de proyectos es una ventana dentro del VB Editor que le muestra todos los elementos que pueden tener código VBA en ellos. Si no ve esta ventana, presione F5 para que aparezca o seleccione Explorador de proyectos desde el Vista menú.

Al hacer doble clic en un elemento en el Explorador de proyectos, se mostrará el código de ese elemento. Hay varios tipos de elementos que pueden aparecer en el Explorador de proyectos:

  • Libros de trabajo
  • Hojas de trabajo
  • UserForms
  • Módulos de clase
  • Módulos (las macros se almacenan en estos elementos)

Aunque todos estos tipos de elementos pueden incluir código VBA, la mejor práctica es codificar macros en módulos.

Haciendo su primera macro

Usar la lista de macros

La lista de macros le muestra todas las macros en su libro de trabajo. Desde esta lista puede editar una macro existente o crear una nueva.

Para crear una nueva macro usando la lista Macros:

  • Seleccione la pestaña Desarrollador y haga clic en Macros (o presione ALT + F8)

  • Escriba un nuevo nombre para su macro, luego haga clic en "Crear"

Después de hacer clic en "Crear", aparecerá el editor VB, mostrando la macro recién creada. Excel creará un nuevo módulo para la macro si es necesario.

Manualmente en el editor de VB

Puede agregar una nueva macro manualmente sin la lista de Macros. Esta es la mejor opción si desea especificar el módulo en el que se guarda la macro.

Para agregar una macro manualmente:

  • Abra el editor de VB (ALT + F11)
  • Cualquiera:
    • Agregue un nuevo módulo haciendo clic en Insertar> Módulo en el menú (el módulo se abrirá automáticamente)

    • O, haga doble clic en un módulo existente en el Explorador de proyectos para abrirlo

  • En el módulo, escriba el código de su nueva macro
Sub MyMacro () End Sub

Estas dos líneas indican el comienzo y el final de una macro denominada "MyMacro" (tenga en cuenta los paréntesis, que son obligatorios). Esto se mostrará en el cuadro de diálogo "Ver macros" en Excel y se puede asignar a un botón (aunque todavía no hace nada).

Agregue algo de código a la macro

Ahora, agreguemos algo de código entre las líneas "Sub" y "End Sub" para que esta macro realmente haga algo:

Sub MyMacro () Range ("A1"). Valor = "¡Hola, mundo!" End Sub

Estructuras de código básicas

El objeto de rango

Excel VBA usa el objeto de rango para representar celdas en una hoja de trabajo. En el ejemplo anterior, se crea un objeto Range con el código Rango ("A1") para acceder al valor de la celda A1.
Los objetos de rango se utilizan principalmente para establecer valores de celda:

Rango ("A1"). Valor = 1
Rango ("A1"). Valor = "Primera celda"

Tenga en cuenta que al definir valores de celda como números, simplemente ingrese el número, pero al ingresar texto debe rodear el texto con comillas.

Los rangos también se pueden usar para acceder a muchas propiedades de las celdas, como su fuente, bordes, fórmulas y más.
Por ejemplo, puede establecer la fuente de una celda en Negrita de esta manera:

Rango ("A1"). Font.Bold = True

También puede establecer la fórmula de una celda:

Rango ("A1"). Fórmula = "= Suma (A2: A10)"

En Excel, puede seleccionar un bloque de celdas con el cursor (por ejemplo, de A1 a D10) y ponerlas todas en negrita. Los objetos de rango pueden acceder a bloques de celdas como este:

Rango ("A1: D10"). Font.Bold = True

También puede hacer referencia a varias celdas / bloques a la vez:

Rango ("A1: D10, A12: D12, G1"). Font.Bold = True

El formato para esto es el mismo que el formato que usaría al seleccionar celdas para la fórmula SUM () en Excel. Cada bloque está separado por una coma y los bloques se indican con las celdas superior izquierda e inferior derecha separadas por dos puntos.

Finalmente, los objetos Range tienen métodos integrados para realizar operaciones comunes en una hoja de trabajo. Por ejemplo, es posible que desee copiar algunos datos de un lugar a otro. Aquí tienes un ejemplo:

Rango ("A1: D10"). Copiar rango ("F1"). PasteSpecial xlPasteValues ​​Rango ("F1"). PasteSpecial xlPasteFormats

Esto copia las celdas A1: D10 al portapapeles y luego hace un PasteSpecial () comenzando en la celda C1, tal como lo haría manualmente en Excel. Tenga en cuenta que este ejemplo muestra cómo usar PasteSpecial () para pegar solo valores y formatos; hay parámetros para todas las opciones que verá en el cuadro de diálogo Pegado especial.

A continuación, se muestra un ejemplo de pegar "Todo" en otra hoja de trabajo:

Rango ("A1: D10"). Copiar hojas ("Hoja2"). Rango ("A1"). PasteSpecial xlPasteAll

Si declaraciones

Con un Si declaración, puede hacer que una sección de código se ejecute sólo "si" una determinada declaración es verdadera.

Por ejemplo, es posible que desee poner una celda en negrita y colorearla en rojo, pero solo "si" el valor en la celda es menor que 100.

Si Rango ("A4"). Valor <100 Entonces Rango ("A4"). Font.Bold = Rango verdadero ("A4"). Interior.Color = vbRed End If 

La estructura adecuada de una declaración If es la siguiente (los corchetes indican componentes opcionales):

Si entonces

[De lo contrario, si entonces]

[Demás]

Terminara si

Puedes incluir tantos De lo contrario bloques como desee para probar múltiples condiciones. También puede agregar un Demás bloque que solo se ejecuta si no se cumple ninguna de las otras condiciones de la instrucción If.

Aquí hay otro ejemplo basado en el anterior, donde la celda se formatea de varias formas diferentes según el valor:

Si Rango ("A4"). Valor <100 Entonces Rango ("A4"). Font.Bold = Rango verdadero ("A4"). Interior.Color = vbRed ElseIf Rango ("A4"). Valor <200 Entonces Rango ( "A4"). Font.Bold = Rango falso ("A4"). Interior.Color = vbYellow Else Range ("A4"). Font.Bold = Rango falso ("A4"). Interior.Color = vbGreen End If

En el ejemplo anterior, la celda no está en negrita en los bloques ElseIf donde el valor no es inferior a 100. Puede nido If declaraciones para evitar la duplicación de código, como esta:

Si Rango ("A4"). Valor <100 Entonces Rango ("A4"). Font.Bold = True Range ("A4"). Interior.Color = vbRed Else Range ("A4"). Font.Bold = False ' desbloqueo de la fuente solo una vez If Rango ("A4"). Valor <200 Entonces Rango ("A4"). Interior.Color = vbYellow Else Range ("A4"). Interior.Color = vbGreen End If End If

Variables

A Variable es una pieza de memoria que se utiliza para almacenar información temporal mientras se ejecuta una macro. A menudo se usan en bucles como iteradores o para contener el resultado de una operación que desea usar varias veces en una macro.

A continuación, se muestra un ejemplo de una variable y cómo se puede utilizar:

Sub ExtractSerialNumber () Dim strSerial As String 'esta es la declaración de variable' 'As String' significa que esta variable debe contener texto 'configurando un número de serie simulado: Rango ("A4"). Valor = “serial # 804567-88 ”'Analizar el número de serie de la celda A4 y asignarlo a la variable strSerial = Mid (Rango (“ A4 ”). Valor, 9)' ahora use la variable dos veces, en lugar de tener que analizar el número de serie dos veces Rango (“ B4 ”). Valor = strSerial MsgBox strSerial End Sub 

En este ejemplo básico, la variable "strSerial" se usa para extraer el número de serie de la celda A4 usando la función Mid (), y luego se usa en otros dos lugares.

La forma estándar de declarar una variable es la siguiente:

Oscuro cualquier nombre [Como escribe]

  • cualquier nombre es el nombre que decides darle a tu variable
  • escribe es el tipo de datos de la variable

El "[Como escribe] ”Se puede omitir; si es así, la variable se declara como un tipo Variant, que puede contener cualquier tipo de datos. Si bien son perfectamente válidos, los tipos de variantes deben evitarse, ya que pueden dar lugar a resultados inesperados si no se tiene cuidado.

Existen normas para nombres de variables. Deben comenzar con una letra o un carácter de subrayado, no pueden tener espacios, puntos, comas, comillas o los caracteres "! PS

A continuación, se muestran algunos ejemplos de declaraciones de variables:

Dim strFilename As String 'estilo de nombre correcto - descriptivo y usa el prefijo Dim i As Long' estilo de nombre incorrecto - aceptable solo para algunos iteradores Dim SalePrice As Double 'estilo de nombre correcto - descriptivo, pero no usa un prefijo Dim iCounter' nombre correcto - no demasiado descriptivo, usa prefijo, sin tipo de datos

Todos estos ejemplos utilizan esquemas de nomenclatura ligeramente diferentes, pero todos son válidos. No es una mala idea anteponer un nombre de variable con una forma corta de su tipo de datos (según algunos de estos ejemplos), ya que hace que su código sea más legible de un vistazo.

VBA incluye muchos elementos básicos tipos de datos. Los más populares incluyen:

  • Cuerda (usado para contener datos de texto)
  • Largo (usado para contener números enteros, es decir, sin decimales)
  • Doble (usado para contener números de punto flotante, es decir, lugares decimales)

Puede encontrar una lista completa de los tipos de datos intrínsecos de VBA aquí: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

Variables de objeto de rango

También es posible crear variables que hagan referencia a objetos de rango. Esto es útil si desea hacer referencia a un rango específico en su código en varios lugares; de esa manera, si necesita cambiar el rango, solo necesita cambiarlo en un lugar.

Cuando crea una variable de objeto Range, debe "establecerla" en una instancia de Range. Por ejemplo:

Atenuar rMyRange como rango Establecer rMyRange = Rango (“A1: A10; D1: J10”)

Dejar la declaración "Establecer" al asignar una variable de rango resultará en un error.

Bucles

Los bucles son bloques que repiten el código dentro de ellos una cierta cantidad de veces. Son útiles para reducir la cantidad de código que tiene que escribir y le permiten escribir un fragmento de código que realiza las mismas acciones en muchos elementos relacionados diferentes.

Para el siguiente

A Para el siguiente block es un bucle que se repite un cierto número de veces. Utiliza una variable como iterador para contar cuántas veces se ha ejecutado, y esta variable de iterador se puede usar dentro del ciclo. Esto hace que los bucles For-Next sean muy útiles para iterar a través de celdas o matrices.

A continuación, se muestra un ejemplo que recorre las celdas de las filas 1 a 100, columna 1, y establece sus valores en el valor de la variable de iterador:

Dim i siempre que i = 1 a 100 celdas (i, 1) .Valor = i Siguiente i

La línea “For i = 1 To 100” significa que el ciclo comienza desde 1 y termina después de 100. Puede establecer cualquier número inicial y final que desee; también puede utilizar variables para estos números.

De forma predeterminada, los bucles For-Next cuentan de uno en uno. Si desea contar con un número diferente, puede escribir el bucle con un Paso cláusula:

Para i = 5 a 100 Paso 5

Este bucle comenzará en 5, luego agregará 5 a "i" cada vez que el bucle se repita (por lo que "i" será 10 en la segunda repetición, 15 en la tercera, y así sucesivamente).

Utilizando Paso, también puedes hacer que un bucle cuente hacia atrás:

Para i = 100 a 1 paso -1

Tú también puedes nido Bucles For-Next. Cada bloque requiere su propia variable para contar, pero puede usar esas variables en cualquier lugar que desee. A continuación, se muestra un ejemplo de lo útil que es eso en Excel VBA:

Dim i Tan largo, j Tan largo Para i = 1 a 100 Para j = 1 a 100 celdas (i, j) .Valor = i * j Siguiente j Siguiente i

Esto le permite recorrer tanto filas como columnas.

ADVERTENCIA: aunque está permitido, NUNCA debe MODIFICAR la variable del iterador dentro de un bloque For-Next, ya que usa ese iterador para realizar un seguimiento del ciclo. Modificar el iterador puede causar un bucle infinito y bloquear su macro. Por ejemplo:

Para i = 1 Hasta 100 i = 1 Siguiente i

En este ciclo, "I" nunca pasará de 2 antes de restablecerse a 1, y el ciclo se repetirá para siempre.

Para cada

Para cada Los bloques son muy similares a los bloques For-Next, excepto que no usan un contador para especificar cuántas veces se repiten. En cambio, un bloque For-Each toma una "colección" de objetos (como un rango de celdas) y se ejecuta tantas veces como objetos haya en esa colección.

Aquí tienes un ejemplo:

Atenuar r como rango para cada r dentro del rango ("A15: J54") Si r.Value> 0 Entonces r.Font.Bold = True End If Next r

Observe el uso de la variable de objeto Range "r". Esta es la variable de iterador utilizada en el ciclo For-Each: cada vez que pasa por el ciclo, "r" obtiene una referencia a la siguiente celda del rango.

Una ventaja de usar bucles For-Each en Excel VBA es que puede recorrer todas las celdas en un rango sin bucles anidados. Esto puede ser útil si necesita recorrer todas las celdas en un rango complejo como Rango ("A1: D12, J13, M1: Y12").

Una desventaja de los bucles For-Each es que no tiene control sobre el orden en que se procesan las celdas. A pesar de que en la práctica Excel recorrerá las celdas en orden, En teoria podría procesar las células en un orden completamente aleatorio. Si necesita procesar celdas en un orden particular, debe usar bucles For-Next en su lugar.

Do-Loop

Mientras que los bloques For-Next usan contadores para saber cuándo detenerse, Do-Loop los bloques se ejecutan hasta que se cumple una condición. Para hacer esto, usa un Hasta que cláusula al principio o al final del bloque, que prueba la condición y hace que el bucle se detenga cuando se cumple esa condición.

Ejemplo:

Dim str As String str = "Buffalo" Do hasta str = “Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo” str = str & "" & "Buffalo" Rango de bucle ("A1"). Valor = str

En este bucle, "Buffalo" se concatena a "str" ​​cada vez que pasa por el bucle hasta que coincide con la oración esperada. En este caso, la prueba se realiza al comienzo del ciclo, si 'str' ya era la oración esperada (lo cual no es porque no la comenzamos de esa manera, pero si) el ciclo ni siquiera se ejecutaría .

Puede hacer que el bucle se ejecute al menos una vez moviendo la cláusula Hasta al final, así:

Haz str = str & "" & "Buffalo" Loop hasta str = "Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo"

Puede usar la versión que tenga sentido en su macro.

ADVERTENCIA: puede provocar un bucle infinito con un bloque Do-Loop si nunca se cumple la condición Hasta. Siempre escriba su código para que la condición Hasta se cumpla definitivamente cuando use este tipo de bucle.

¿Que sigue?

Una vez que haya comprendido los conceptos básicos, ¿por qué no intentar aprender algunas técnicas más avanzadas? Nuestro tutorial en https://easyexcel.net/excel/learn-vba-tutorial/ se basará en todo lo que ha aprendido aquí y ampliará sus habilidades con eventos, formularios de usuario, optimización de código y mucho más.

wave wave wave wave wave