Control de errores en VBA

Estoy liado con una macro en la que intento controlar un error.
Te comento, utilizo la función Do para que mi macro se repita hasta que encuentre una celda vacía, ahí se detiene, en medio de la función do esta mi código que es crear una hoja por cada nombre que encuentra en la columna B y que claro va avanzando en filas con Do.
Aquí viene el control de errores: La macro me genera un error si la hoja no esta creada, entonces en lugar de que me bote el error, lo controlo y mando a crear una nueva hoja con el nombre que el tocaba, hasta aquí aparentemente todo va bien.
Pero resulta que cuando corre por segunda vez "Do" ya no me considera el control del error, entonces cuando el archivo no encuentra el nombre se cae la macro y me bota el error en lugar de pasarlo.
Espero haber sido claro, te paso mi código para que me digas en que me equivoco
Sub Crea()
Dim Comprobar, Contador
Comprobar = True: Contador = 0 ' Inicializa variables.
Do ' Bucle externo.
a = 1
Do While a < 65000 ' Bucle interno.
a = a + 1 ' Incrementa el contador.
If Range("B" & a).Value = "" Then ' Si la condición es verdadera.
Comprobar = False ' Establece el valor a False.
Exit Do ' Sale del bucle interno.
Else
On Error GoTo kike
b = Range("B" & a).Value
Rows(a).Select
Selection.Copy
Sheets(b).Select
k = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
Range("A" & k).Select
ActiveSheet.Paste
Sheets("Base").Select
Application.CutCopyMode = False
End If
kike:
If Err.Number = 9 Then
Sheets("Base").Select
Sheets.Add
ActiveSheet.Name = b
Sheets("Base").Select
Rows("1:1").Select
Selection.Copy
Sheets(b).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Base").Select
Range("A1").Select
a = a - 1
End If
Loop
Loop Until Comprobar = False ' Sale inmediatamente
End Sub
2

2 respuestas

Respuesta
1
Pruébalo de esta manera:
Sub Crea()
'ajustada x Elsamatilde
Dim Comprobar, Contador
Comprobar = True: Contador = 0 ' Inicializa variables.
Do ' Bucle externo.
a = 1
Do While a < 65000 ' Bucle interno.
a = a + 1 ' Incrementa el contador.
If Range("B" & a).Value = "" Then ' Si la condición es verdadera.
Comprobar = False ' Establece el valor a False.
Exit Do ' Sale del bucle interno.
Else
b = Range("B" & a).Value
Rows(a).Select
Selection.Copy
On Error Resume Next
Sheets(b).Select
If Err > 0 Then GoTo kike
k = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
Range("A" & k).Select
ActiveSheet.Paste
Sheets("Base").Select
Application.CutCopyMode = False
End If
kike:
If Err.Number = 9 Then
Sheets("Base").Select
Sheets.Add
ActiveSheet.Name = b
Sheets("Base").Select
Rows("1:1").Select
Selection.Copy
Sheets(b).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Sheets("Base").Select
Range("A1").Select
a = a - 1
End If
Loop
Loop Until Comprobar = False ' Sale inmediatamente
End Sub
Hola, gracias por tu ayuda, resolvió el problema de que no reconocía la repetición de errores, pero ahora la parte de:
On Error Resume Next
Sheets(b).Select
If Err > 0 Then GoTo kike ---------aqui se detiene
Cuando no hay errores regresa a Do While sin pasar por el resto del código, como lo soluciono.
Cuando hay error se va a kike y cuando no hay error sigue con el resto de las instrucciones:
k = Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
'el resto
Está probado, no entiendo tu problema
Sdos
Elsa
Hola te comento, detuve la macro en cada proceso y haya o no haya error luego de
If Err > 0 Then GoTo kike
Me manda a Kike, puse una variable para saber el valor de Err y cuando no hay errores lo valúa como Vacío, sin embargo la condición sigue mandándome a Kike, no se como resolverlo, trate de poner como valor para cuando sea vacío siga, pero nada. Adicional que me parece que faltaría un end if, sin embargo no se como resolverlo.
Tu indicabas que la habías probado, por lo que te invito a revisar esto último.
En B2 puse "Enrique", en B3 "Arturo" en B4 "Enrique"... El primero lo hace bien, corre la macro creando la hoja, pero cuando regresa a copiar la info ocurre el "Err" = Vacío y m, e manda a kike sin hacer lo que necesito
Espero haber sido claro
Solicítame el ejemplo al correo que encontrarás en mi sitio, que dejo al pie.
Funciona perfecto en mi ejemplo, a mi entender.
¿No recibí tu correo... lo resolviste?
Si no querés el ejemplo porque ya lo resolviste, debieras finalizar
También sos un experto aquí y sabés de la importancia de liberar la bandeja de consultas pendientes...
No sé en qué te estás equivocando pero te reitero que la respuesta dada es la correcta y responde a tu problema.
Sdos
Elsa
Hola disculpa a veces me lio con el tiempo y no reviso la página. Mil disculpas.
Ta finalizo la pregunta pero voy a enviarte un ejemplo a tu correo
Respuesta
1
Creo que eres mucho más experto que yo en el tema de las macros.
Pero leyengo por acá creo que es mejor que uses la sentencia
On Error Resume Next
Esta pasar por alto el error y sigue ejecutando las instrucciones siguientes
Te paso la información
http://msdn.microsoft.com/es-es/library/5hsw66as(v=vs.80).aspx
Hola, si tu lo entiendes tal vez me puedas dar luces,
Cual es la diferencia entre GoTo y Resume Next????
Cuando usas un
ON ERROR GOTO "ETIQUETA"
Y en el momento que suceda algún error envías la ejecución de tu programa a una etiqueta donde desarrollaras toda tu lógica de manejo de errores.
ON ERROR RESUME NEXT Si deseas que simplemente la ejecucion continue en la siguiente linea sin que te genere ni un error
Fíjate que ya tu activaste un control de errores (que esta dentro de una bucle) y según la teoría
Si se produce un error mientras un controlador de errores está activo (desde que se genera el error hasta que se ejecuta una instrucción Resume, Exit Sub, Exit Function o Exit Property), el controlador de errores del procedimiento actual no podrá controlar el error.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas