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

Código
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 omites el libro, se usa el libro activo

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.

ArgumentoDescripción
BeforeAgrega la hoja antes de la hoja indicada
AfterAgrega la hoja después de la hoja indicada
CountNúmero de hojas que se agregan (por defecto 1)
TypeTipo 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.

Agregar
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.

Indicar
Private Sub AddNamedWorksheetByArg(ByVal sheetName As String)
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = sheetName
End Sub
Reglas para los nombres de hoja

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.

Agregar
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.

Agregar
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.

Comprobar
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.Add e indica explícitamente el libro de destino, por ejemplo con ThisWorkbook
  • Usa Before / After para la posición y Count para 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
#vba #excel #worksheet #hoja de trabajo