Agregar Hojas de Trabajo
Para agregar una hoja de trabajo en VBA se usa el método Worksheets.Add.
Puedes agregar una hoja sin ningún argumento, pero en la práctica también debes pensar en ponerle nombre, agregarla al final y qué ocurre si ya existe una hoja con el mismo nombre.
Este artículo explica el código básico, cómo indicar nombre y posición, agregar varias hojas y manejar errores, con ejemplos de código.
Código básico para agregar una hoja de trabajo
Private Sub AddWorksheet()
ThisWorkbook.Worksheets.Add
End Sub
Al ejecutarlo, se agrega una hoja nueva antes de la hoja activa de ThisWorkbook (el libro que contiene la macro) y la hoja nueva pasa a ser la activa.
Si escribes solo Worksheets.Add, la hoja se agrega al libro activo en ese momento, que no es necesariamente el libro que contiene la macro. Al trabajar con varios libros, indica explícitamente ThisWorkbook o ActiveWorkbook.
Argumentos del método Worksheets.Add
Add admite los siguientes argumentos, todos opcionales.
| Argumento | Descripción |
|---|---|
Before | Agrega la hoja antes de la hoja indicada |
After | Agrega la hoja después de la hoja indicada |
Count | Número de hojas que se agregan (por defecto 1) |
Type | Tipo de hoja (normalmente se puede omitir con Worksheets.Add, ya que agrega hojas de cálculo) |
Before y After no se pueden indicar a la vez. Si se omiten ambos, la hoja se agrega antes de la hoja activa.
Ponerle nombre a la hoja
Worksheets.Add devuelve la hoja agregada, por lo que puedes asignarle el nombre de inmediato.
Private Sub AddNamedWorksheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "Nueva Hoja"
End Sub
Si recibes el nombre como argumento, es más fácil reutilizarlo.
Private Sub AddNamedWorksheetByArg(ByVal sheetName As String)
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = sheetName
End Sub
Los nombres de hoja tienen las siguientes restricciones. Si no se cumplen, se produce el error en tiempo de ejecución 1004.
- De 1 a 31 caracteres
- No puede contener
: \ / ? * [ ] - No puede estar vacío
- No puede empezar ni terminar con
'(comilla simple) - No puede repetir el nombre de una hoja existente (no distingue mayúsculas de minúsculas)
- “Historial” (History) es una palabra reservada y no se puede usar
Agregar una hoja en una posición concreta
Usa Before o After para indicar dónde va la hoja.
Private Sub AddWorksheetAtPosition()
Dim ws As Worksheet
' Agregar al principio
Set ws = ThisWorkbook.Worksheets.Add(Before:=ThisWorkbook.Worksheets(1))
ws.Name = "Primera"
' Agregar después de la primera hoja
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(1))
ws.Name = "DespuesDePrimera"
' Agregar al final
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
ws.Name = "Ultima"
End Sub
Para agregar al final, usa Worksheets.Count (el número de hojas) para referirte a la última hoja.
Agregar varias hojas de trabajo
Para agregar varias hojas con nombre, recorre un bucle y agrégalas una a una.
Private Sub AddMultipleWorksheets()
Dim i As Long
Dim ws As Worksheet
For i = 1 To 5
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
ws.Name = "Hoja" & i
Next i
End Sub
Esto agrega cinco hojas, de “Hoja1” a “Hoja5”, en orden al final. Si no necesitas nombres, Worksheets.Add Count:=5 las agrega de una vez.
Ejemplos prácticos
Crear una hoja con datos
Este ejemplo genera una hoja con una fila de encabezado y filas de datos.
Private Sub AddAndFillWorksheet()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "HojaDatos"
' Agregar la fila de encabezado
ws.Cells(1, 1).Value = "ID"
ws.Cells(1, 2).Value = "Nombre"
ws.Cells(1, 3).Value = "Edad"
' Agregar las filas de datos
Dim data As Variant
data = Array( _
Array(1, "Taro Tanaka", 30), _
Array(2, "Hanako Yamada", 25), _
Array(3, "Jiro Sato", 35) _
)
Dim i As Long
For i = 0 To UBound(data)
ws.Cells(i + 2, 1).Value = data(i)(0)
ws.Cells(i + 2, 2).Value = data(i)(1)
ws.Cells(i + 2, 3).Value = data(i)(2)
Next i
End Sub
Se agrega una hoja llamada “HojaDatos” con la fila de encabezado y las filas de datos.
Agregar una hoja según una condición
Este ejemplo agrega una hoja solo cuando la celda A1 de la hoja activa contiene “Agregar”.
Private Sub AddWorksheetIfConditionMet()
If ActiveSheet.Range("A1").Value = "Agregar" Then
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "HojaCondicional"
End If
End Sub
Solución de problemas
Error de nombre de hoja duplicado
Asignar un nombre que ya usa otra hoja produce el error en tiempo de ejecución 1004. Peor aún, la hoja creada por Add se queda con su nombre predeterminado.
Para evitarlo, comprueba si existe una hoja con el mismo nombre antes de agregar.
Private Function SheetExists(ByVal sheetName As String) As Boolean
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If StrComp(ws.Name, sheetName, vbTextCompare) = 0 Then
SheetExists = True
Exit Function
End If
Next ws
End Function
Private Sub AddUniqueWorksheet()
Const SHEET_NAME As String = "HojaUnica"
If SheetExists(SHEET_NAME) Then
MsgBox "Ya existe una hoja con el mismo nombre"
Exit Sub
End If
ThisWorkbook.Worksheets.Add.Name = SHEET_NAME
End Sub
Los nombres de hoja no distinguen mayúsculas de minúsculas, por lo que la comparación usa StrComp con vbTextCompare.
No se puede agregar una hoja
Si la estructura del libro está protegida, no se pueden agregar hojas. Quita la protección con ThisWorkbook.Unprotect y luego agrega la hoja.
La hoja se agrega en una posición distinta a la esperada
Si omites Before / After, la hoja se agrega antes de la hoja activa. Cuando la posición importa, indica siempre Before o After.
Resumen
- Agrega una hoja con
Worksheets.Adde indica explícitamente el libro de destino, por ejemplo conThisWorkbook - Usa
Before/Afterpara la posición yCountpara el número de hojas; por defecto la hoja va antes de la hoja activa - Los nombres de hoja deben tener 31 caracteres o menos, no pueden contener
: \ / ? * [ ]y deben ser únicos - Evita el error de nombre duplicado comprobando si la hoja existe antes de agregarla