Buen día.
He logrado compilar un buen código; con él puedo crear una página nueva en Excel, se le asigna automáticamente
un nombre que he seleccionado con una variable que cambia dependiendo del número de copias que quiera crear.
Hasta ahora el código se ve así:
Sub Grab()
Dim x As Integer, numtimes As Integer
x = InputBox("¿Cuántas solicitudes desea crear?")
For numtimes = 1 To x
ActiveWorkbook.Sheets("Plantilla").Copy _
After:=ActiveWorkbook.Sheets("Plantilla")
ActiveSheet.Name = "SC-I" & Format(numtimes, "000")
Next
End Sub
Ahora, mis preguntas son las siguientes:
1) He notado que cuando se abre el diálogo donde ingreso el número de copias que quiero realizar y lo cancelo
o no agrego ningún número me marca un error, ¿cómo podría hacer para que sencillamente se cierre el diálogo y ya?
2) Cuando creé una copia de la plantilla y quedó bajo el nombre de "SC-I001", quiero crear otra copia y me marca error,
ya que se está intentando crear otra página con ese mismo nombre, ¿no hay manera de que el código haga el consecutivo?,
es decir, ¿cree una página "SC-I002" automáticamente ?
De antemano, muchas gracias por todo, estoy que me comrpo ese libro :P .
1) a tu primera pregunta sobre el inputbox
en X estás almacenando la respuesta del usuario,
Pero no siempre devuelve un número, por ejemplo porque cancela, o porque se equivoca y escribe un texto.
yo declararía la variable x sin definir el tipo explícitamente
luego comprobaría si el valor introducido es o no un número
algo así:
Dim x, numtimes As Integer
x = InputBox("¿Cuántas solicitudes desea crear?")
If Not IsNumeric(x) Then Exit Sub
...
2) Sobre la duplicidad de nombres.
Si intentas crear un nombre duplicado se producirá un error.
Si buscas una hoja con un nombre que no existe se producirá un error.
Opción 1. Interceptar ese error
en esta página http://www.mrexcel.com/forum/excel-questions/3228-visual-basic-applications-check-if-worksheet-exists.html#post1970649 he encontrado la siguiente función para comprobar si una hoja existe, basado en controlar el error
Public Function WorksheetExists(ByVal WorksheetName As String) As Boolean
On Error Resume Next
WorksheetExists = (Sheets(WorksheetName).Name <> "")
On Error GoTo 0
End Function
Opcion 2. Evitar el error.
Recorre todas las hojas al principio, buscando cuál es el número más alto y luego aplicas nombres a partir de ahí.
podría ser algo así:
Function UltimoNumeroHoja(Optional prefijo As String) As Integer
Dim hoja As Worksheet, numeroenhoja As Integer
UltimoNumeroHoja = 0
For Each hoja In Worksheets
If hoja.Name Like prefijo & "*" Then
numeroenhoja = Val(Right(hoja.Name, Len(hoja.Name) - Len(prefijo)))
UltimoNumeroHoja = Application.WorksheetFunction.Max(UltimoNumeroHoja, numeroenhoja)
End If
Next
End Function
Tu procedimiento Grab, podría quedar parecido a esto:
Sub Grab()
Dim x, numtimes As Integer
Dim desfasenumeracion As Integer
desfasenumeracion = UltimoNumeroHoja("SC-I")
x = InputBox("¿Cuántas solicitudes desea crear?")
If Not IsNumeric(x) Then Exit Sub
For numtimes = 1 To x
ActiveWorkbook.Sheets("Plantilla").Copy _
After:=ActiveWorkbook.Sheets("Plantilla")
ActiveSheet.Name = "SC-I" & Format(numtimes + desfasenumeracion, "000")
Next
End Sub
------
Ya sé Excel, pero necesito más.