Excel - Error 1004 en una macro

 
Vista:
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Error 1004 en una macro

Publicado por Antoni Masana (2482 intervenciones) el 25/01/2022 17:26:25
Tengo una macro que actualiza varias hojas de varios libros y algunas hojas pueden estar o no en los libros.
Para evitar errores tengo esta función:

1
2
3
4
5
6
7
8
9
10
11
12
Function Buscar_Hoja(nombreHoja As String) As Boolean
    Dim I As Integer
 
    For I = 1 To Worksheets.Count
        If UCase(Worksheets(I).Name) = UCase(nombreHoja) Then
            Buscar_Hoja = True
            Exit Function
        End If
    Next
 
    Buscar_Hoja = False
End Function

Algunas veces da error 1004, y sale la ventana con las opciones de finalizar o depurar, le doy a depurar, analizó lo que vale Worksheets.Count, el valor es correcto, le for F8, continua, le doy F5 y sigue la macro.

¿Por que da error si no hay error? O ¿Cual es e problema?

Saludos.
\\//_
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Norberto
Val: 148
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Error 1004 en una macro

Publicado por Norberto (10 intervenciones) el 08/02/2022 11:20:13
Hola:

Evidentemente no debería de dar ningún error porque el código está bien y nunca haces referencia a un objeto que no existe. Puedes probar a añadirle un On Error Goto ...

1
2
3
4
5
6
7
8
9
...
    On Error Goto Buscar_Hoja_Err
    ...
    Exit Function
 
Error Goto Buscar_Hoja_Err:
    Resume
 
End Function

Guarda todo antes de hacer la prueba ya que si insiste en el error podría entrar en bucle.

Otra posibilidad es, en vez de recorrer todas las hojas del libro, hacer alguna referencia a la que se llame según el parámetro y si se produce un error (capturado por On Error Goto...) es que no existe.

1
2
3
4
5
6
7
8
9
Function Buscar_Hoja(nombreHoja As String) As Boolean
    On Error GoTo Buscar_Hoja_Err
 
    Buscar_Hoja = Worksheets(nombreHoja).Name <>  "" 'Por poner algo
    Exit Function
 
Buscar_Hoja_Err:
    'No hacemos nada por lo que la función devolverá False
End Function

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Error 1004 en una macro

Publicado por Antoni Masana (2482 intervenciones) el 08/02/2022 14:10:38
Gracias Norberto por contestar.

Añadí un DoEvents y se soluciono el problema.

1
2
3
4
5
6
7
8
9
10
11
12
Function Buscar_Hoja(nombreHoja As String) As Boolean
    Dim I As Integer
    DoEvents
    For I = 1 To Worksheets.Count
        If UCase(Worksheets(I).Name) = UCase(nombreHoja) Then
            Buscar_Hoja = True
            Exit Function
        End If
    Next
 
    Buscar_Hoja = False
End Function

De echo puse un On Error y no se ha vuelto a producir el error.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Function Buscar_Hoja(nombreHoja As String) As Boolean
    Dim I As Integer, Intentos As Byte
    Dim C As Integer
 
    Intentos = 0: On Error GoTo Error_1004
    DoEvents
 
Reintenta:
    For I = 1 To Worksheets.Count
        If UCase(Worksheets(I).Name) = UCase(nombreHoja) Then
            Buscar_Hoja = True
            Exit Function
        End If
    Next
 
    Buscar_Hoja = False
    Exit Function
 
Error_1004:
    Intentos = Intentos + 1
 
    C = FreeFile
    Open "C:\Orpas\Buscar_Hoja.txt" For Append As #C
    Print #C, Date; " - "; Time; " - Libro: " & ActiveWindow.Caption & _
                                 " - Hoja: " & nombreHoja & _
                                 " - Intento: "; Intentos
    Close #C
 
    If Intentos = 100 Then
       Intentos = 0
       MsgBox "Se han realizado 100 intentos de recuperar el error 1004" & _
              " en el método 'Worksheets' de objeto '_Global'" & vbCrLf & _
              vbCrLf & _
              "Pulse para reintentar de nuevo.", vbCritical + vbOKOnly, _
              "Funcion Buscar_Hoja con ERROR 1004"
    End If
    DoEvents
    Resume Reintenta
End Function

Lo que hace es 100 intentos de recuperar el error y so no se soluciona sale un PopUp para volver a intentarlo.
Además graba un registro por cada fallo. El fichero no existe por que no ha vuelto a dar error.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Norberto
Val: 148
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Error 1004 en una macro

Publicado por Norberto (10 intervenciones) el 09/02/2022 09:47:43
Buenos días:

Eso que dices del DoEvents es muy interesante. Más de una vez me ha dado error un código que está bien y que puedes seguir ejecutando con F8 sin hacer ningún cambio y, si se puede solucionar con esta función, me va a evitar mucho quebraderos de cabeza.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar