En este artículo 19 secciones
- Dónde se escriben las macros.
- Seleccionar y escribir en celdas.
- Dar formato.
- Copiar, cortar y pegar.
- Ordenar y buscar.
- Insertar y eliminar filas y columnas.
- Borrar el contenido de las celdas.
- Recorrer rangos y encontrar la última fila.
- Mensajes, hojas y libros.
- Asignar una macro a un botón.
- Descargar los códigos.
- Preguntas frecuentes.
- Artículos relacionados
Quien empieza a programar macros en Excel termina usando una y otra vez las mismas instrucciones: seleccionar celdas, escribir datos, dar formato, copiar y pegar, borrar, insertar filas o recorrer un rango. Reunimos los códigos de VBA más comunes, con una explicación breve de cada uno, para copiarlos y adaptarlos. ¿Dónde se escriben y cuáles son?
Dónde se escriben las macros.
Las macros se escriben en el editor de Visual Basic, que se abre con Alt + F11. Allí se elige «Insertar», «Módulo» y se escribe el código entre Sub NombreMacro() y End Sub. Para ejecutarla, se presiona F5 dentro de la macro o Alt + F8 desde la hoja. El libro debe guardarse como habilitado para macros (.xlsm), como se explica en el artículo sobre cómo guardar un libro de Excel con macros.
En los ejemplos se usa Range("A1") para referirse a una celda fija y Selection para lo que el usuario tenga seleccionado. Un apóstrofo convierte el resto de la línea en un comentario que la macro no ejecuta.
- Liquidador de renta personas naturales
- Liquidador de intereses propiedad horizontal
- Proyección y planeación pensional
Seleccionar y escribir en celdas.
Estos son los códigos para moverse por la hoja y escribir datos o fórmulas:
| Código | Qué hace |
|---|---|
| Range("A1").Select | Selecciona la celda A1 |
| Range("A1:C10").Select | Selecciona un rango |
| Cells(5, 2).Select | Selecciona la fila 5, columna 2 (B5) |
| ActiveCell.Offset(1, 0).Select | Baja una celda desde la activa |
| Range("A1").Value = "Ventas" | Escribe un texto o un número |
| Range("B1").Formula = "=SUM(B2:B10)" | Escribe una fórmula |
| Range("C1").Value = Range("A1").Value | Copia el valor de una celda en otra |
Las fórmulas se escriben en inglés y con coma como separador, aunque Excel esté en español; si se prefiere escribirlas en español, se usa la propiedad FormulaLocal. No hace falta seleccionar una celda para escribir en ella: Range("A1").Value = "Ventas" funciona sin el Select, y la macro es más rápida.
Dar formato.
El formato de la fuente se agrupa con With para no repetir el objeto en cada línea:
With Selection.Font
.Bold = True ' negrilla
.Italic = True ' cursiva
.Underline = xlUnderlineStyleSingle ' subrayado
.Name = "Calibri" ' tipo de letra
.Size = 12 ' tamaño
.Color = RGB(31, 56, 100) ' color
End With
Para la alineación, el relleno y el formato de número se usan propiedades del rango:
| Código | Qué hace |
|---|---|
| Selection.HorizontalAlignment = xlCenter | Centra (xlLeft a la izquierda, xlRight a la derecha) |
| Selection.Interior.Color = RGB(255, 242, 204) | Color de relleno |
| Selection.NumberFormat = "#,##0" | Formato de número con separador de miles |
| Columns("A:D").AutoFit | Ajusta el ancho de las columnas |
Los colores se indican con RGB, que combina rojo, verde y azul con valores de 0 a 255.
Copiar, cortar y pegar.
Las instrucciones para copiar y pegar son las siguientes:
| Código | Qué hace |
|---|---|
| Range("A1:C10").Copy Range("E1") | Copia y pega en una sola línea |
| Selection.Copy | Copia la selección |
| Selection.Cut | Corta la selección |
| ActiveSheet.Paste | Pega en la celda activa |
| Range("E1").PasteSpecial Paste:=xlPasteValues | Pega solo los valores |
| Application.CutCopyMode = False | Quita el borde punteado de la copia |
La primera forma es la más eficiente, porque copia sin pasar por el portapapeles ni seleccionar celdas.
Ordenar y buscar.
Para ordenar la tabla que empieza en A1 por la primera columna, con encabezado:
Range("A1").CurrentRegion.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes
Con Order1:=xlDescending el orden es de mayor a menor. Para buscar un texto, conviene guardar el resultado en una variable y comprobar si se encontró, porque si no existe la macro se detiene con un error:
Dim c As Range
Set c = Cells.Find(What:="Ramón", LookIn:=xlValues, LookAt:=xlPart)
If c Is Nothing Then MsgBox "No se encontró." Else c.Select
LookAt:=xlPart encuentra el texto aunque sea parte del contenido de la celda; con xlWhole, la celda debe contener exactamente ese texto.
Insertar y eliminar filas y columnas.
Las filas y columnas se insertan o eliminan con estas instrucciones:
| Código | Qué hace |
|---|---|
| Rows(5).Insert | Inserta una fila antes de la 5 |
| Selection.EntireRow.Insert | Inserta filas en la selección |
| Rows(5).Delete | Elimina la fila 5 |
| Columns("C").Insert | Inserta una columna antes de la C |
| Selection.EntireColumn.Delete | Elimina las columnas seleccionadas |
Para eliminar varias filas que cumplen una condición se recorre el rango de abajo hacia arriba, como se explica en el artículo sobre cómo eliminar filas en Excel que cumplan una condición.
Borrar el contenido de las celdas.
Hay un método distinto según lo que se quiera borrar:
| Código | Qué borra |
|---|---|
| Range("F2:H4").ClearContents | Solo el contenido; conserva el formato |
| Range("F2:H4").ClearFormats | Solo el formato |
| Range("F2:H4").Clear | Contenido, formato y comentarios |
| Range("F2:H4").ClearComments | Solo los comentarios |
| Range("F2:H4").Hyperlinks.Delete | Solo los hipervínculos |
ClearContents equivale a la tecla Supr, y los demás, a las opciones del botón «Borrar» del grupo «Edición» de la pestaña «Inicio»: «Borrar todo», «Borrar formatos», «Borrar contenido», «Borrar comentarios» y «Borrar hipervínculos». En una tabla con formato de tabla, Supr borra los datos pero no el estilo de la tabla; para quitarlo todo se usa «Borrar todo».
Borrar los textos que superen un número de caracteres.
Un lector preguntó por una macro que borre los textos de más de 60 caracteres. Recorre las celdas seleccionadas y borra las que superan ese largo:
Sub BorrarTextosLargos()
Dim c As Range
For Each c In Selection
If Len(c.Value) > 60 Then c.ClearContents
Next c
End Sub
Si en lugar de borrar el texto se quiere recortarlo a 60 caracteres, la línea del If se cambia por If Len(c.Value) > 60 Then c.Value = Left(c.Value, 60).
Recorrer rangos y encontrar la última fila.
Muchas macros necesitan saber hasta dónde llegan los datos. La última fila con datos de la columna A se obtiene así:
u = Cells(Rows.Count, "A").End(xlUp).Row
La instrucción va a la última fila de la hoja y sube hasta encontrar un dato, igual que Ctrl + flecha arriba. Con Cells(u + 1, "A").Select se llega a la primera celda vacía debajo de los datos. Las fórmulas para traer el último dato se explican en el artículo sobre cómo llamar el último dato de una columna.
Para hacer algo con cada celda de un rango se usa For Each. Por ejemplo, marcar en rojo los valores negativos:
Dim c As Range
For Each c In Range("B2:B100")
If IsNumeric(c.Value) And c.Value < 0 Then c.Font.Color = vbRed
Next c
IsNumeric evita que la macro se detenga si una celda tiene texto.
Mensajes, hojas y libros.
Para comunicarse con el usuario y trabajar con hojas y libros, los códigos más usados son estos:
| Código | Qué hace |
|---|---|
| MsgBox "Proceso terminado" | Muestra un mensaje |
| nombre = InputBox("Escriba el nombre") | Pide un dato |
| Worksheets("Resumen").Activate | Va a una hoja |
| Worksheets.Add.Name = "Resumen" | Agrega una hoja con nombre |
| ActiveSheet.Protect Password:="1234" | Protege la hoja (Unprotect la desprotege) |
| Workbooks.Open Filename:="C:\Documentos\Ventas.xlsx" | Abre un libro |
| ActiveWorkbook.SaveAs Filename:="C:\Documentos\Copia.xlsx", FileFormat:=51 | Guarda como .xlsx (52 para .xlsm) |
| Application.ScreenUpdating = False | Evita el parpadeo y acelera la macro |
Cuando se desactiva ScreenUpdating, hay que volver a activarlo con True al final de la macro. Las macros para abrir libros y para exportar a PDF se explican en los artículos sobre cómo abrir un libro de Excel desde otro libro y cómo guardar una hoja de Excel en PDF.
Asignar una macro a un botón.
Para ejecutar una macro con un clic se inserta una forma desde «Insertar», «Ilustraciones», «Formas», se dibuja en la hoja, se hace clic derecho sobre ella y se elige «Asignar macro». El procedimiento completo está en el artículo sobre cómo crear un botón en Excel.
Descargar los códigos.
El archivo de texto contiene dieciséis macros de ejemplo con los códigos del artículo: escribir en celdas, formato, alineación, pegar valores, ordenar, buscar, insertar y eliminar, borrar, borrar textos largos, última fila, recorrer un rango, pedir un dato, hojas, proteger, abrir y guardar, y acelerar macros.
Preguntas frecuentes.
A continuación respondemos las preguntas frecuentes de nuestros lectores.
¿Dónde se escriben los códigos de macros en Excel?
En el editor de Visual Basic (Alt + F11), en un módulo creado con «Insertar», «Módulo».
¿Cuál es el código para borrar el contenido de una celda sin borrar el formato?
Range("A1").ClearContents.
¿Qué diferencia hay entre Clear y ClearContents?
Clear borra el contenido y el formato; ClearContents solo el contenido.
¿Cómo escribo una fórmula con una macro?
Con Range("B1").Formula = "=SUM(B2:B10)", en inglés y con coma, o con FormulaLocal en español.
¿Cómo encuentro la última fila con datos en VBA?
Con Cells(Rows.Count, "A").End(xlUp).Row.