Preguntas varias.

2 envíos / 0 nuevos
Último envío
Mancha Azul
Imagen de Mancha Azul
Offline
última acción: Hace 9 años 7 meses
alta: 09/01/2014 - 03:03
Puntos: 135
Preguntas varias.

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 .

pacomegia
Imagen de pacomegia
Offline
última acción: Hace 3 días 11 horas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntosadministrador
alta: 27/12/2006 - 23:26
Puntos: 11175
Re: Preguntas varias.

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.