Pb boucle "on error goto prochain" (gestion de plusieurs erreurs)

zebanx

XLDnaute Accro
Bonjour à tous,

J'ai un problème sur l’exécution d'une instruction "on error goto..." qui ne parait s'executer qu'une seule fois.

L'objectif est de lancer sur plusieurs gros fichiers des macros identiques.
On a donc 2 champs variables : l'adresse complète du fichier (1), le nom de la macro (2)

Mais je souhaite que cette macro s’exécute jusqu'au bout si elle rencontre les deux problèmes suivants :
- l'adresse est fausse (ou vide)
- la macro n'existe pas

Or je n'arrive pas à passer au prochain "next" correctement dans les deux cas.

Pourriez-vous m'aider svp ?

Merci par avance, bonne journée
zebanx

Ci-joint un zip contenant le fichier call... et 3 fichiers contenant de toutes petites macro pour les tests.

Code:
Sub appeler2()
Dim k As Integer, i

[E2:E100].ClearContents

Application.ScreenUpdating = False
k = Range("B" & Rows.Count).End(xlUp).Row
Application.DisplayAlerts = False

For i = 2 To k
Dossier_cherché = Range("B" & i)
MacR = Range("C" & i) & "!" & Range("D" & i)

If Dossier_cherché = "" Then
Else

On Error GoTo prochain ' ne s'execute qu'une fois

Workbooks.Open Filename:=Dossier_cherché
Application.Run MacR
ActiveWorkbook.Close SaveChanges:=True
Cells(i, 5) = Now
'Application.Wait (Now + TimeValue("00:00:01"))
End If
prochain:
Next i

Application.DisplayAlerts = True
End Sub
 

Pièces jointes

  • lancer macro (tableau).zip
    49.7 KB · Affichages: 47

pierrejean

XLDnaute Barbatruc
Bonjour zebanx

Rapidement sans avoir testé
A essayer

Code:
For i = 2 To k
Dossier_cherché = Range("B" & i)
MacR = Range("C" & i) & "!" & Range("D" & i)

If Dossier_cherché = "" Then
Else

'On Error GoTo prochain ' ne s'execute qu'une fois
On Error resume next
Workbooks.Open Filename:=Dossier_cherché
Application.Run MacR
On Error Goto 0
ActiveWorkbook.Close SaveChanges:=True
Cells(i, 5) = Now
'Application.Wait (Now + TimeValue("00:00:01"))
End If
'prochain:
Next i
 

zebanx

XLDnaute Accro
Bonjour à tous les deux,

Merci pour votre réponse rapide.:)

Alors sur les premiers tests :

- Pierre-Jean : la boucle se fait bien mais le fichier se ferme (en pas à pas détaillé je pense sur la ligne 6, la boucle passe à l'instruction next qui ferme le dossier "CALL...")

- Thebenoit59 :
cas 1 (adresse fausse) = ok (va bien jusqu'à la dernière ligne)
cas 2 (macro n'existe pas) = ca s'arrêtait de faire le boulot sur la ligne 6 sur la partie "application.run MacR".

En pas à pas détaillé, on voit que le fichier s'ouvre donc j'ai rajouté "on error resume next" pour le fermer. Et après ça à l'air d'aller jusqu'au bout.

Je teste et je reviens vers vous.
Merci en tout cas pour vos pistes prometteuses !

++
zebanx

-----------------------------
Sub appeler2()
Dim k As Integer, i

[E2:E100].ClearContents

Application.ScreenUpdating = False
k = Range("B" & Rows.Count).End(xlUp).Row
Application.DisplayAlerts = False

For i = 2 To k
Dossier_cherché = Range("B" & i)
MacR = Range("C" & i) & "!" & Range("D" & i)

If Dossier_cherché = "" Then
Else

On Error GoTo prochain
Workbooks.Open Filename:=Dossier_cherché
On Error Resume Next
Application.Run MacR
ActiveWorkbook.Close SaveChanges:=True
Cells(i, 5) = Now
'Application.Wait (Now + TimeValue("00:00:01"))
End If

prochain:
On Error GoTo -1
Next i

Application.DisplayAlerts = True
End Sub
 

zebanx

XLDnaute Accro
Re-bonjour Pierre-Jean, Benoist59

Je reviens vers vous après quelques essais du code en #4.

Cela fonctionne bien dans les deux cas.

Le fil suivant m'a donné une bonne piste de travail, en cas 2 (macro n'existe pas), afin qu'il n'y ait pas l'instruction cells(i,5) = now qui s'affiche dans le fichier principal.
https://www.excel-downloads.com/threads/saut-dans-boucle-vba.20005476/

Merci pour votre aide, ce fut long mais ça a l'air de fonctionner (mais ce qui parait si simple à écrire m'a donné pas mal de problèmes). C'est une bonne base pour la gestion des erreurs, faut que je m'y recolle -)

zebanx

ps : la boucle passe le tour si le fichier recherché comprend un " ".
----------------

Sub appeler()
Dim k As Integer, i

[E2:E100].ClearContents

Application.ScreenUpdating = False
k = Range("B" & Rows.Count).End(xlUp).Row
Application.DisplayAlerts = False

For i = 2 To k
Dossier_cherché = Range("B" & i)
MacR = Range("C" & i) & "!" & Range("D" & i)

If Dossier_cherché = "" Then
Else
On Error GoTo prochain
Workbooks.Open Filename:=Dossier_cherché
On Error Resume Next
Application.Run MacR
ActiveWorkbook.Close SaveChanges:=True
If Err = 0 Then
Cells(i, 5) = Now
'Application.Wait (Now + TimeValue("00:00:01"))
Else
End If

End If

prochain:
On Error GoTo -1 'instruction de Benoit
Next i
Application.DisplayAlerts = True
End Sub
 
Dernière édition:

zebanx

XLDnaute Accro
Bonsoir le fil, le forum

@zebanx
Tu peux nous donner le contenu de la macro : MacR ?

Bonsoir Staples1600

Il s'agit de n'importe quelle macro.
Comme indiqué au post#1, j'ai certaines routines communes à utiliser sur des fichiers relativement lourd que je ne peux compiler ensemble.
Mon but est de faire une boucle dans un fichier avec une adresse complète (ouvre tel fichier puis le referme après exécution macro) et une macro qui sont variables.
(Et accessoirement d'aller boire un café pendant que ça tourne).

J'en profite pour te poser une question à laquelle ton retour me sera précieux.
J'utilise une petite fonction pour savoir si un fichier existe.

Function ExisteFichier(nomfic As String) As Boolean
Application.Volatile
ExisteFichier = (Dir(nomfic) <> "")
End Function

Donc dans une colonne, ces données sont renseignées par ligne en Boolean.

Mais quand je lance la macro (#5) en pas à pas détaillé, ça m'envoie très vite vers cette fonction qui n'a strictement rien à faire dans le code.
Pourquoi stp ? As-tu une idée pour sauter ce problème ?

Merci par avance, cdlt
zebanx
 

thebenoit59

XLDnaute Accro
Bonjour Zebanx.
Bonjour Staple.

Tu peux voir en utilisant le code ci-dessous :

VB:
Sub appeler2()
Dim k As Integer, i
Dim Dossier_cherché$, MacR$
[E2:E100].ClearContents
Application.ScreenUpdating = False
k = Range("B" & Rows.Count).End(xlUp).Row
Application.DisplayAlerts = False
For i = 2 To k
    Dossier_cherché = ThisWorkbook.Path & "\" & Range("C" & i)
    MacR = Range("C" & i) & "!" & Range("D" & i)
    If fncCheckFile(Dossier_cherché) Then
        Workbooks.Open Filename:=Dossier_cherché
        'Application.Run MacR
        If fncCheckMacro(MacR) Then ThisWorkbook.Sheets(1).Cells(i, 5) = Now
        ActiveWorkbook.Close SaveChanges:=True
    End If
Next i
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Function fncCheckFile(pathFile$) As Boolean
If Dir(pathFile) <> "" Then
    fncCheckFile = True
    Else: fncCheckFile = False
End If
End Function

Function fncCheckMacro(macro$)
fncCheckMacro = False
On Error GoTo fin
Application.Run macro
fncCheckMacro = True
fin:
End Function
 

Discussions similaires

Statistiques des forums

Discussions
311 740
Messages
2 082 049
Membres
101 882
dernier inscrit
XaK_