Erreur incompréhensible lors de l'ouverture d'un classeur par macro

Bonjour à tous,

J'utilise une macro pour éditer un relevé clients.

Jusqu'à hier, pas de soucis, tout fonctionnait à merveilles, cependant depuis aujourd'hui, ma macro ne tourne plus correctement (Et je n'ai rien modifié de mon côté...)

Je vous explique succinctement le but du code qui me pose soucis :

Lorsque j'édite un relevé clients, je sauvegarde automatiquement un fichier récap et j'historise tous les fichiers ainsi créés afin d'importer les éventuels commentaires qui auraient étés ajoutés par nos gestionnaires. Le but du code est de chercher le fichier le plus récent.

Voici le code qui me pose soucis :

Sub Commentaires_precedents()
Dim Releve As Workbook
Dim Situ As Workbook
Dim derligprec As Long
Dim Répert1 As Object
Dim Syst_fic As Object
Dim Fic1 As Object
Dim Fic_nom As String
Dim Fic_acces As Date
Dim Plus_recent_nom As String
Dim Plus_recent_date As Date
Dim Répertoire1 As String
Dim i As Variant
Set Syst_fic = CreateObject("Scripting.FileSystemObject")
Set Releve = Workbooks("Relevé clients macro V7.xlsm")
'Nom du répertoire à scanner
Répertoire1 = "MonChemin\Situations client\" & Nom_Client

Set Répert1 = Syst_fic.GetFolder(Répertoire1)

For Each Fic1 In Répert1.Files
    Fic_nom = Fic1.Name
    'Fichiers qui commencent par "Situation"
    If Left(Fic_nom, 9) = "Situation" Then
        Fic_acces = Fic1.DateLastAccessed
        If Fic_acces > Plus_recent_date Then
            Plus_recent_date = Fic_acces
            Plus_recent_nom = Fic_nom
        End If
    End If
Next
Stop
If Plus_recent_nom <> "" Then
    Application.Workbooks.Open "MonChemin\" & Nom_Client & "\" & Fic_nom
            Set Situ = Workbooks(Fic_nom)
            With Situ
                .Activate
                .Cells(1, 1) = "test"
                While .Cells(i, 1) <> ""
                    If .Cells(i, 7) <> "" Then
                        'Releve.Sheets("Litiges").Cells(i, 9) = .Cells(i, 7) 'Commentaires fichier précédent
                        Releve.Sheets("Base de données").Cells(i, 10) = .Cells(i, 11) 'Commentaires fichier précédent
                    Else
                    End If
                Wend
            .Save
            .Close
            End With
Else
End If
End Sub

La ligne qui me pose soucis est, systématiquement, la ligne qui suit :

Application.Workbooks.Open "MonChemin\" & Nom_Client & "\" & Fic_nom
            Set Situ = Workbooks(Fic_nom)
            With Situ
                .Activate

C'est certainement quelque chose de bête, mais je ne comprends pas que ça puisse arriver d'un coup d'un seul sans modification du code...

J'ai essayé du .Activate, .Sheets(1).Activate, sans .Activate, avec un If, sans If, modification d'une cellule pour voir si ça marche (d'où le .cells(1,1) = "test") etc... Je fais chou blanc.

MR

Bonjour,

avez vous fait un "pas à pas" pour vérifier les valeurs des variables ?

Mettez un point d'arrêt sur la ligne :

Set Syst_fic = CreateObject("Scripting.FileSystemObject")

puis lancer le code, une fois celui-ci arrêté au point d'arrêt, appuyez sur la touche F8 pour faire avancer le déroulé du code ligne par ligne. Ensuite avec le curseur de la souris, positionnez vous sur les variables afin de contrôler leur valeur.

Vous allez peut-être découvrir une erreur ou incohérence.

Si le code fonctionnait jusqu'à maintenant et que rien n'a changé dans celui-ci, alors cela devrait venir de la structure des répertoires d'enregistrement/lecture des fichiers.

@ bientôt

LouReeD

Bonjour,

Jusqu'à maintenant, ton fichier FicNom était le dernier de la boucle :

For Each Fic1 In Répert1.Files
    Fic_nom = Fic1.Name
    'Fichiers qui commencent par "Situation"
    If Left(Fic_nom, 9) = "Situation" Then
        Fic_acces = Fic1.DateLastAccessed
        If Fic_acces > Plus_recent_date Then
            Plus_recent_date = Fic_acces
            Plus_recent_nom = Fic_nom
        End If
    End If
Next

Si, aujourd'hui, il n'est plus le dernier (pour une raison x ou y) de cette boucle, ton code va foirer...

Dans la suite de ton code, n'utilise pas la variable Fic_nom, mais Plus_recent_nom :

    Application.Workbooks.Open "MonChemin\" & Nom_Client & "\" & Plus_recent_nom
            Set Situ = Workbooks(Plus_recent_nom)

Avant de poster j'ai justement testé en pas à pas afin d'identifier d'où me vient le problème, histoire de pouvoir débugger moi-même.

Les valeurs sont correctes, je les ai bien contrôlées et dès lors que je dépasse la ligne (que j'ai mentionnée en citation précédemment), ça me lève une erreur...

Concernant Fic_Nom, justement je stocke dedans le dernier fichier, donc en toute logique (si je ne me trompe pas, mais avec cette erreur je remets tout en doute), Fic_Nom me renvoie le fichier le plus récent dont le nom commence par "Situation" (les fichiers que je veux justement)

Le dernier fichier?

Réfléchis bien à cette ligne :

If Left(Fic_nom, 9) = "Situation" Then

Tu stockes le dernier fichier du répertoire, pas celui qui correspond à ce test...

Le dernier fichier?

Réfléchis bien à cette ligne :

If Left(Fic_nom, 9) = "Situation" Then

Tu stockes le dernier fichier du répertoire, pas celui qui correspond à ce test...

Que je comprenne bien :

If Left(Fic_nom, 9) = "Situation" Then

Signifie bien que si, dans le répertoire, les 9 premiers caractères du nom du fichier examiné est "Situation", alors...

 Fic_acces = Fic1.DateLastAccessed

Je stocke la dernière date de modification du fichier dans la variable Fic_Acces

        If Fic_acces > Plus_recent_date Then

Si la date de dernière modification est plus grande que la date la plus récente trouvée jusqu'ici, alors...

            Plus_recent_date = Fic_acces
            Plus_recent_nom = Fic_nom

J'affecte le nom et la date de dernière modification aux variables nommées

Je n'y vois peut-être pas bien du coup, peux-tu m'expliquer pourquoi je sélectionne le dernier fichier du répertoire ?

However, puisque mes fichiers sont formés de manière générique, ça ne devrait pas me sortir une erreur malgré tout par la suite puisque le code m'ouvre quand même le "dernier" fichier, si?

Mon explication en commentaires.

For Each Fic1 In Répert1.Files    'on se place, au dernier tour de la boucle = dernier fichier
    Fic_nom = Fic1.Name    'Tu affectes, ici, à la variable Fic_nom le nom de ton "dernier" fichier du répertoire
    If Left(Fic_nom, 9) = "Situation" Then    'si le nom de ce fichier ne commence pas par "Situation"
        Fic_acces = Fic1.DateLastAccessed    'non traité
        If Fic_acces > Plus_recent_date Then    'non traité
            Plus_recent_date = Fic_acces    'non traité
            Plus_recent_nom = Fic_nom        'non traité
        End If        'FIN
    End If        'FIN
Next
'tu te retrouves, ici, avec un nom de fichier, dans la variable Fic_nom, qui ne commence pas par Situation
'sauf si tu utilises la variable Plus_recent_nom, ce que tu devrais faire 

Mon explication en commentaires.

For Each Fic1 In Répert1.Files    'on se place, au dernier tour de la boucle = dernier fichier
    Fic_nom = Fic1.Name    'Tu affectes, ici, à la variable Fic_nom le nom de ton "dernier" fichier du répertoire
    If Left(Fic_nom, 9) = "Situation" Then    'si le nom de ce fichier ne commence pas par "Situation"
        Fic_acces = Fic1.DateLastAccessed    'non traité
        If Fic_acces > Plus_recent_date Then    'non traité
            Plus_recent_date = Fic_acces    'non traité
            Plus_recent_nom = Fic_nom        'non traité
        End If        'FIN
    End If        'FIN
Next
'tu te retrouves, ici, avec un nom de fichier, dans la variable Fic_nom, qui ne commence pas par Situation
'sauf si tu utilises la variable Plus_recent_nom, ce que tu devrais faire 

Je comprends ce que tu veux dire maintenant.

Cependant, il te manquait donc une explication :

Ce bout de code s'active uniquement si le dossier avec le nom du client existe. De facto, si le dossier existe, forcément il y a un fichier qui commence par "Situation" dedans

Pour faire simple : Je teste si le dossier client existe. Si oui, alors je vais chercher à ouvrir et récupérer les infos du dernier fichier "Situation".

Autrement, je passe cette étape car je sais qu'il n'y a pas d'antériorité

Preuve en est, la macro m'ouvre systématiquement le bon fichier (Donc le dernier modifié en date, comme je le souhaite car vérifié en pas à pas) mais dès lors que je veux "utiliser" ce fichier fraîchement ouvert, c'est là que se lève l'erreur !

Admettons.

Mais, il y a tout de même une faille.

Je te recommande vivement d'utiliser la bonne variable Plus_recent_nom

Autre vérif à faire, Fic_nom dispose de l'extension .xls*?

Admettons.

Mais, il y a tout de même une faille.

Je te recommande vivement d'utiliser la bonne variable Plus_recent_nom

Autre vérif à faire, Fic_nom dispose de l'extension .xls*?

Par la suite j'ai suivi ton conseil et j'ai utilisé Plus_recent_nom, ça me paraît aussi plus judicieux.

Fic_nom dispose de l'extension .xlsx, le format que j'utilise pour mes fichiers enregistrés

La macro ne laisse peut-être pas le temps nécessaire à l'ouverture du fichier.

Quel est le message d'erreur et sur qu'elle ligne apparaît-il?

Plusieurs pistes :

1- DoEvents :

    Application.Workbooks.Open "MonChemin\" & Nom_Client & "\" & Plus_recent_nom
    DoEvents
    Set Situ = Workbooks(Plus_recent_nom)

2- Laisser, à la variable Situ, le soin d'ouvrir le fichier :

    Set Situ = Workbooks.Open("MonChemin\" & Nom_Client & "\" & Plus_recent_nom)
    DoEvents

3- Un test en boucle :

    Application.Workbooks.Open "MonChemin\" & Nom_Client & "\" & Plus_recent_nom
    Dim WB As Workbook
    For Each WB In Application.Workbooks
        If WB.Name = Plus_recent_nom Then 'ici j'ai un doute sur l'extension ou pas...
            Set Situ = WB
            Exit For
        End If
    Next

La macro ne laisse peut-être pas le temps nécessaire à l'ouverture du fichier.

Quel est le message d'erreur et sur qu'elle ligne apparaît-il?

Plusieurs pistes :

1- DoEvents :

    Application.Workbooks.Open "MonChemin\" & Nom_Client & "\" & Plus_recent_nom
    DoEvents
    Set Situ = Workbooks(Plus_recent_nom)

2- Laisser, à la variable Situ, le soin d'ouvrir le fichier :

    Set Situ = Workbooks.Open("MonChemin\" & Nom_Client & "\" & Plus_recent_nom)
    DoEvents

3- Un test en boucle :

    Application.Workbooks.Open "MonChemin\" & Nom_Client & "\" & Plus_recent_nom
    Dim WB As Workbook
    For Each WB In Application.Workbooks
        If WB.Name = Plus_recent_nom Then 'ici j'ai un doute sur l'extension ou pas...
            Set Situ = WB
            Exit For
        End If
    Next

Mais pourtant si je le test en pas à pas, le fichier devrait avoir assez de temps pour s'ouvrir ?

Je viens de quitter le bureau, je testerais tout ceci dès demain matin

Bonjour,

J'ai finalement réussi à débugger, et c'était vraiment pas grand chose...

J'ai redéfini la variable Situ en Worksheet, visiblement il y avait une erreur à ce niveau car ça me levait un "Propriété ou méthode non gérée par cet objet" ...

Tout fonctionne à merveille, merci Pijaku pour tous tes conseils, et j'aimerais si possible que l'on reparle de cet histoire de Fic_Nom et Plus_recent_nom histoire de voir éventuellement si je peux optimiser le process

Code corrigé :

Sub Commentaires_precedents()
Dim Releve As Workbook
Dim Situ As Worksheet
Dim derligprec As Long
Dim Répert1 As Object
Dim Syst_fic As Object
Dim Fic1 As Object
Dim Fic_nom As String
Dim Fic_acces As Date
Dim Plus_recent_nom As String
Dim Plus_recent_date As Date
Dim Répertoire1 As String
Dim i As Variant
    Set Syst_fic = CreateObject("Scripting.FileSystemObject")
    Set Releve = Workbooks("Relevé clients macro V7.xlsm")
    'Nom du répertoire à scanner
    Répertoire1 = "MonChemin\Situations client\" & Nom_Client

    Set Répert1 = Syst_fic.GetFolder(Répertoire1)

    For Each Fic1 In Répert1.Files
        Fic_nom = Fic1.Name
        'Fichiers qui commencent par "Situation"
        If Left(Fic_nom, 9) = "Situation" Then
            Fic_acces = Fic1.DateLastAccessed
            If Fic_acces > Plus_recent_date Then
                Plus_recent_date = Fic_acces
                Plus_recent_nom = Fic_nom
            End If
        End If
    Next
    If Plus_recent_nom <> "" Then
        Application.Workbooks.Open "MonChemin\Situations client\" & Nom_Client & "\" & Plus_recent_nom
                Set Situ = Workbooks(Plus_recent_nom).Sheets(1)
                With Situ
                    .Activate
                    derligprec = .Cells(Application.Rows.Count, 1).End(xlUp).Row
                    For i = 2 To derligprec
                        If .Cells(i, 11) <> "" Then
                            Releve.Sheets("Base de données").Cells(i, 10) = .Cells(i, 11) 'Commentaires fichier précédent
                        Else
                        End If
                    Next
                Workbooks(Plus_recent_nom).Save
                Workbooks(Plus_recent_nom).Close
                End With
    Else
    End If
End Sub

Salut,

Pour mieux comprendre mon histoire de Fic_nom et Plus_recent_nom, rien de mieux qu'un petit test.

Dans un répertoire créé pour l'occasion, enregistre 5 fichiers nommés ainsi :

Situation 1

Situation 2

Situation 3

Voiture 1

Voiture 2

Ces fichiers, créées les dans l'ordre que tu veux.

Ferme Excel, et ouvre un nouveau fichier Excel vierge.

Insère cette procédure dans un nouveau Module de ce classeur et adapte le répertoire avec celui que tu viens de créer :

Sub Tentative()
Dim Répert1 As Object, Syst_fic As Object, Fic1 As Object
Dim Fic_nom As String, Plus_recent_nom As String, Repertoire As String
Dim Fic_acces As Date, Plus_recent_date As Date

    Set Syst_fic = CreateObject("Scripting.FileSystemObject")

    '----------------------A ADAPTER********************************
    Repertoire = "C:\Users\" & Environ("Username") & "\Desktop\test\"
    '-------------------------------********************************

    Set Répert1 = Syst_fic.GetFolder(Repertoire)
    For Each Fic1 In Répert1.Files
        Fic_nom = Fic1.Name
        'Fichiers qui commencent par "Situation"
        If Left(Fic_nom, 9) = "Situation" Then
            Fic_acces = Fic1.DateLastAccessed
            If Fic_acces > Plus_recent_date Then
                Plus_recent_date = Fic_acces
                Plus_recent_nom = Fic_nom
            End If
        End If
    Next
    MsgBox "Fic_nom contient : " & Fic_nom & vbCrLf & vbCrLf & "Plus_recent_nom contient : " & Plus_recent_nom
End Sub

Puis lance cette Sub une première fois.

Le résultat apparaît dans une MsgBox.

Ensuite, ouvre le fichier Situation 2, saisi n'importe quoi dans une cellule, enregistre le et ferme le.

Relance la Sub...

Rechercher des sujets similaires à "erreur incomprehensible lors ouverture classeur macro"