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...