Supongamos que tenemos una hoja en un cuaderno con la lista de los meses del año.

Queremos que una macro genere 12 hojas en el cuaderno, un para cada mes, y les ponga el nombre del mes

Esto podemos hacerlo con una macro bastante sencilla
Sub crear_hojas()
Dim Lista As Range
Dim iX As Long
Set Lista = Application.InputBox(prompt:="Señalar rango de la lista", _
Title:="Lista de nombres", Type:=8)
Application.ScreenUpdating = False
For iX = Lista.Count To 1 Step -1
Sheets.Add.Name = Lista(iX)
Next iX
Sheets(1).Select
Application.ScreenUpdating = True
End Sub
Al correr esta macro, se abre un diálogo donde ponemos el rango que contiene la lista (pueden ser meses, días de semana o cualquier otra cosa); al pulsar el botón Aceptar

se generarán las hojas en el orden de la lista.
Si queremos usar esta macro con cierta frecuencia o pasársela a un compañero del trabajo, descubriremos que tenemos que hacer algunas mejoras.
Por ejemplo, si en el diálogo de elegir rango pulsamos Cancelar, se abrirá el editor de Vba y veremos este mensaje de error

Para evitar esto usamos la sentencia On Error
Sub crear_hojas()
Dim Lista As Range
Dim iX As Long
On Error GoTo Cancelar
Set Lista = Application.InputBox(prompt:="Señalar rango de la lista", _
Title:="Lista de nombres", Type:=8)
Application.ScreenUpdating = False
For iX = Lista.Count To 1 Step -1
Sheets.Add.Name = Lista(iX)
Next iX
Sheets(1).Select
Application.ScreenUpdating = True
Cancelar:End Sub
Otro problema puede generarse cuando ya existe en el cuaderno una hoja con uno de los nombres que aparecen en la lista. Por ejemplo, si la hoja Enero existe antes de correr la macro, obtenemos este resultado

Para evitar este problema tendremos que hacer algunas modificaciones a nuestra macro. Primero creamos una función para verificar si una hoja a crear ya existe
Function chequear_hoja(sheetName As String) As Boolean
Dim wkb As Worksheet
On Error Resume Next
Set wkb = Sheets(sheetName)
On Error GoTo 0
chequear_hoja = IIf(Not wkb Is Nothing, True, False)
End Function
Esta función da como resultado FALSE si la hoja no existe, y TRUE si la hoja ya existe en el cuaderno.
Lo que hacemos es usar esta función (adaptada de la propuesta por Colo) en nuestra macro para crear una condición. Si la hoja no existe, entonces creamos una nueva con el nombre correspondiente; de existir, pasamos a verificar el próximo nombre en la lista.
Sub crear_hojas2()
Dim Lista As Range
Dim iX As Long
On Error GoTo Cancelar
Set Lista = Application.InputBox(prompt:="Señalar rango de la lista", _
Title:="Lista de nombres", Type:=8)
Application.ScreenUpdating = False
For iX = Lista.Count To 1 Step -1
If chequear_hoja(Lista(iX)) = False Then
Sheets.Add.Name = Lista(iX)
End If
Next iX
Sheets("Hoja1").Activate
Application.ScreenUpdating = True
Cancelar:
End Sub
El cuaderno con las macros se puede descargar aquí
Technorati Tags: MS Excel