Ouvrir le fichier dont le nom comporte la date la plus récente

WIsh_

XLDnaute Occasionnel
Bonjour à tous,

Ci-après un extrait de code d'une de mes macros qui ouvre un classeur qui se trouve dans un dossier pour en copier une plage de donnée:

VB:
Set wbData = Workbooks.Open("D:\test rapport\Project_Rapport 2020_Situation -17052020_LONG.xlsm")
Set wsData = wbData.Worksheets("BA RE T.C.")

Union(wsData.Range("BARETC1"), wsData.Range("BARETC2")).Copy

With WsMaster1.Cells(Ligne, 14)
.PasteSpecial xlPasteValues
End With

Application.CutCopyMode = False

A l'emplacement "D:\test rapport\", un nouveau fichier vient s'ajouter chaque semaine. Et c'est ce fichier que je dois aller ouvrir pour en copier les données.
Le nom du fichier est toujours identique, sauf la date qu'il comporte : "Project_Rapport 2020_Situation -17052020_LONG.xlsm".

Ainsi, la semaine prochaine, le fichier à aller chercher s'appellera "Project_Rapport 2020_Situation -18052020_LONG.xlsm", et celui de la semaine d'après, "Project_Rapport 2020_Situation -27052020_LONG.xlsm", etc.

=> Je n'arrive pas à remplacer ma ligne de code pour que la macro ouvre à chaque fois le fichier du dossier qui comporte dans son nom la date la plus récente.

Quelqu'un aurait-il une idée ?

Merci beaucoup d'avance,
Wish
 
Dernière édition:
Solution
re
VB:
Option Explicit
Sub test()
    Dim wbData As Workbook
    Dim pth As String       'path
    Dim prf As String       'préfixe
    Dim suf As String       'suffixe
    Dim nom As String       'nom
    Dim dat As Date         'date
    Dim dat2 As Date        'date
    Dim fichier$

    dat = CDate("01/01/1900")
    pth = "C:\Users\polux\DeskTop\33740\"
    prf = "Project_Rapport 2020_Situation -"
    suf = "_LONG.xlsm"
    nom = Dir(pth & prf & "*" & suf)
    Do While nom > ""
        nom = Trim(Replace(Replace(nom, prf, ""), suf, ""))
        If IsNumeric(nom) And Len(nom) = 8 Then
            If IsDate(Format(nom, "##/##/####")) Then
                dat2 = CDate(Format(nom, "##/##/####"))
                If dat2 > dat Then fichier...

Staple1600

XLDnaute Barbatruc
Bonjour le fil

[aparté mâtiné d'une once d'ironie dominicale indolore]
Réfléchi ou irréfléchi, message ou macro, ma préférence ira toujours à celui qui contient le moins de fautes d'orthographe. ;)
Et là, c'est tout réfléchi, le 33740ième Patricke fait beaucoup mieux que le Patrick de Toulon.
;)
[/aparté]
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour Staple1600
ben tu ferais une erreur ;)
et pour le coup j'ai testé le code de patrick33740 car je l'avais pas testé l'erreur est tellement grosse
et j'avais raison ça me donne pas le bon
donc même sans faute d'orthographe c'est faux quand même
et depuis quand on teste une date par sa valeur textuelle en vba ??
 

patricktoulon

XLDnaute Barbatruc
re
VB:
Option Explicit
Sub test()
    Dim wbData As Workbook
    Dim pth As String       'path
    Dim prf As String       'préfixe
    Dim suf As String       'suffixe
    Dim nom As String       'nom
    Dim dat As Date         'date
    Dim dat2 As Date        'date
    Dim fichier$

    dat = CDate("01/01/1900")
    pth = "C:\Users\polux\DeskTop\33740\"
    prf = "Project_Rapport 2020_Situation -"
    suf = "_LONG.xlsm"
    nom = Dir(pth & prf & "*" & suf)
    Do While nom > ""
        nom = Trim(Replace(Replace(nom, prf, ""), suf, ""))
        If IsNumeric(nom) And Len(nom) = 8 Then
            If IsDate(Format(nom, "##/##/####")) Then
                dat2 = CDate(Format(nom, "##/##/####"))
                If dat2 > dat Then fichier = pth & prf & nom & suf: dat = dat2
            End If
        End If
        nom = Dir
    Loop

    MsgBox fichier

    'Set wbData = Workbooks.Open(pth & prf & Mid(dat, 7, 2) & Mid(dat, 5, 2) & Mid(dat, 1, 4) & suf)
    '...

End Sub

demo4.gif
 

patricktoulon

XLDnaute Barbatruc
re
a ben je l'ai refait avec ton préambule de macro
j'ai seulement établi le test en Date type(date) comme je l'avais fait avec le mien
je teste quand même le isnumeric et le len(8) ( sait on jamais) avant de tester isdate( le formatage de nom) pour pouvoir zapper plus vite les non concordants
après le reste est similaire c'est une simple boucle dir
 

WIsh_

XLDnaute Occasionnel
Bonsoir à tous,
Bonsoir @Patrice33740 , @patricktoulon, @jmfmarques et merci pour vos tests et retests.

Désolé pour la réaction tardive mais j'ai du laisser en plan mon pc plus tôt dans la journée et je suis seulement de retour.

J'ai testé la 1ère solution de Patrice33740 et la dernière de patricktoulon en particulier.

Concernant cette dernière, bien que la msgbox renvoie le fichier correct, la ligne workbook.open n'ouvre pas le fichier et renvoie : Désolé... Nous ne trouvons pas ....\
Project_Rapport 2020_Situation -205-17-0_LONG.xlsm

En bref, soucis dans la ligne
VB:
Set wbData = Workbooks.Open(pth & prf & Mid(dat, 7, 2) & Mid(dat, 5, 2) & Mid(dat, 1, 4)

La sub de Patrice33740 fonctionne. Cependant, je n'ai pas compris le biais que Patricktoulon évoque :

re
Patrice33740 bonjour
réflechi 2 seconde
Code:
 If Mid(nom, 5, 4) & Mid(nom, 3, 2) & Mid(nom, 1, 2) > dat Then dat = Mid(nom, 5, 4) & Mid(nom, 3, 2) & Mid(nom, 1, 2)

j'ai dans les noms
05062020 et 03092021 que va donner ta ligne selon toi??????? ;)
A mediter;)

Aurais-je des problèmes avec certaines dates à l'avenir ?

Merci déjà en tout cas !
Wish
 

jmfmarques

XLDnaute Accro
Re et de bon matin :
Nous avons là l'illustration de ce à quoi peut conduire une insuffisance (voire absence) de réflexion au moment, pourtant essentiel en développement informatique , de la modélisation elle-même. Ici : celle du nom attribué à un chemin de fichier, mais ce pourrait être n'importe quoi d'autre.
L'attitude aventureuse consiste à modéliser "sur élan", sans se préoccuper, au moment de cette modélisation, des raisons ultérieures qui rendraient nécessaires l'extraction et l'utilisation d'une partie de la chaîne ainsi construite.
L'attitude sage consiste à s'en préoccuper sérieusement et a choisir la modélisation qui permettra d'éviter des acrobaties (du travail en tout état de cause) pour permettre l'extraction qui intéresse.
1) Lorsqu'une sous-chaîne est déterminante de l'appréciation/comparaison de la grandeur d'une chaîne, c'est DEVANT (au tout début de la chaîne) qu'on doit intelligemment d'emblée la mettre, et pas au sein (d'où il faudrait alors l'extraire) de la chaîne
2) si cette sous-chaîne "déterminante" est par ailleurs l'expression d'une date, elle doit, non moins intelligemment, permettre (sans nécessité de retraitement) une comparaison de grandeur (ascii de gauche à droite) ce que seul permet le format yyyyddmm.
Voilà pour un premier "volet" de réflexion.
Suivra ce matin un second "volet" non moins important, concernant, lui, un mécanisme raisonné qui permettrait de déterminer avec assurance le fichier qui nous intéresse :
sans aucune nécessité :
- ni de parcours des fichiers d'un dossier
- ni de comparaisons de chaîne
- ni même de se servir d'une date comme repère
 

WIsh_

XLDnaute Occasionnel
re
bonsoir
avec ma version c'est
Set wbData = Workbooks.Open((fichier)

RE @patricktoulon , votre méthode marche évidemment nickel. Bête erreur de ma part hier soir, mea culpa. On va mettre ça sur le compte de l'heure tardive (...).

Merci donc @patricktoulon et @Patrice33740 pour avoir résolu mon problème.
@jmfmarques merci aussi d'avoir été si constructif :) . Si j'avais la possibilité d'influer sur le nom du fichier ou son emplacement, oui, cela aurait été plus simple, et non je n'aurais pas posé cette question.
 

patricktoulon

XLDnaute Barbatruc
Il n'y a aucun biais : il n'avait pas compris cette subtilité du code ... il ne l'avait même pas essayé quand il a formulé cette remarque, et je pense qu'il ne s'en excusera pas.
C'est une critique totalement infondée.

bonjour Patrice33740 ok ça fonctionne hier j'ai pourtant copier coller ton code comme tel sans rien changer et il me donnait pas le bon
mais je ne changerais pas d'avis quand au fait qu'une date on la calcule,compare,modifie,etc... en tant que date avec une variable date et surtout en VBA
et j'ai très bien compris ton principe avec ta méthode compare date order(US)
je te site
Dim dat As String 'date
If Mid(nom, 5, 4) & Mid(nom, 3, 2) & Mid(nom, 1, 2) > dat


mid, left,right et compagnie sont des outils string (texte)

donc tu compare du string >ou < a un autre string pour comparer une date
en fait tu profite que vba est très permissif sur ce point
je ne parle même pas du zero eventuel devant pour les jours<10 qui pourrait sauter dans le transfert dans "nom" et qui ferait de tes mid une boulette
je ne parlerais pas non plus de ta non vérification de validité de la chaine( num et len(8)) avant d'utiliser les mid etc....

au pire si je voulais te suivre dans ton raisonnement j'aurais fait
Dim dat As long 'date
if len(nom)=8 and isnumeric(nom) then
If val(Mid(nom, 5, 4) & Mid(nom, 3, 2) & Mid(nom, 1, 2)) > dat then dat = val(.....)
end if

après vous faite comme vous voulez
après perso je me servirais des property de fichier voir de filedatetime ou scripting runtime et le lastmodified mais cela n'engage que moi

voila ;)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 899
Membres
101 834
dernier inscrit
Jeremy06510