Se connecter avec
S'enregistrer | Connectez-vous

Copier repertoire vers classeur

Dernière réponse : dans Programmation

bonjour tout le monde
j'ai un grave soucis :( 

je vous explique ce qu'il a a faire :
le classeur dans lequel je travail s'appelle: "classeurvarpa&hist"
je voudrai allez dans un classeur dont la date de modification est plus proche de la date d'aujourd'hui ou bien qu'elle soit egale a la date d'aujourd'hui.en fait les classeurs sont ranger dans l'ordre croissant suivant les dates de modifications ,je veux donc aller dans celui qui a la date maximale
par le chemin:

  1. S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Synthèse\2010-6-21 Résultat économique.xls"


1)il se trouve que ce classeur est fermé(je veux bien faire une copie avec le classeur fermé).
une fois dans ce classeur je veux copier les cellules
  1. H32
et
  1. D32

PUIS les coller respectivement dans mon classeur"classeurvarpa&hist" a la feuille 2 en a la derniere ligne vide respectivement a la colonne G et I

voici une premiere etape de mon code aller chercher le dernier classeur qui se trouve tout en bas dans le dossier synthese
voici le code:
  1. Sub copi_cpr_mli()
  2. Dim sRépertoire As String
  3. Dim sFichier As String
  4. Dim sTemp As String
  5.  
  6. sRépertoire = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Synthèse\"
  7. sTemp = Dir(sRépertoire & "*.xls")
  8. Do While sTemp <> ""
  9. sFichier = sTemp
  10. sTemp = Dir
  11. Loop
  12. MsgBox "Le dernier fichier : " & sFichier
  13.  
  14.  
  15.  
  16. End Sub

malheureusement il ne me selectionne pas le dernier classeur du dossier synthese
tout en signalant que le dossier synthese cotient un autre dossier qui se nomme "2010-04"(ce dossier ne m'interresse pas"
merci de votre aide :) 

Autres pages sur : copier repertoire vers classeur

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Salut dianbobo,

Ton code me paraît bizarre :[ligne 4]
  1. xxx.Formula = yyy.Value

Ça peut marcher dans beaucoup de cas, mais pas dans tous. Je te propose d'écrire plutôt ça :
  1. xxx.Value = yyy.Value
Ou, si vraiment c'est la formule que tu veux copier :
  1. xxx.Formula = yyy.Formula


-----------------

Si ce topic est résolu, choisis la meilleure réponse.
Expert Programmation

M'enfin, ta macro va chercher le dernier de la liste. Mais as-tu pensé à quel ordre respectait la fonction ?
- Alphabétique,
- Date de création,
- Date de dernière modification,
- Emplacement physique sur le disque,
- Aléatoire.
Expert Programmation

Bon, comme ça fait longtemps que tu ne me fais plus de messages bien horrible, t'as droit à un cadeau. Le code tout fait pour connaître le plus vieux fichier d'un répertoire :

  1. Option Explicit
  2.  
  3. Function NomPlusVieuxFichier(chemin As String) As String
  4. Dim fso As FileSystemObject
  5. Dim fichier As File
  6. Dim plus_vieux_fichier As File
  7.  
  8. Set fso = CreateObject("scripting.filesystemobject")
  9. For Each fichier In fso.GetFolder(chemin).Files
  10. If plus_vieux_fichier Is Nothing Then
  11. Set plus_vieux_fichier = fichier
  12. ElseIf fichier.DateLastModified < plus_vieux_fichier.DateLastModified Then
  13. Set plus_vieux_fichier = fichier
  14. End If
  15. Next
  16.  
  17. ' // Résultat
  18. If plus_vieux_fichier Is Nothing Then
  19. NomPlusVieuxFichier = ""
  20. Else
  21. NomPlusVieuxFichier = plus_vieux_fichier.Path
  22. End If
  23. End Function


T'as plus qu'à adapter pour connaître le plus jeune, tout en me maudissant de ne pas te l'avoir fait moi-même [:nyghost]

---------

EDIT: Oups, j'allais oublier.
Pour que ça marche chez toi, il faut que tu déclares la référence à Microsoft Scripting Runtime de la bibliothèque scrrun.dll.
Trois solutions si tu ne comprends rien à ça :
1°) Tu cherches et trouves par toi-même (+10) :) 
2°) Tu me demandes de bien te l'expliquer (~0) :/ 
3°) Tu remplaces les types spécifiques par des objets neutres (-1) :fou: 
  1. Dim fso As Object
  2. Dim fichier As Object
  3. Dim plus_vieux_fichier As Object

Bonjour Zeb et a tous :) 
j'ai lu ton code avec le bouton f1 j'essai de comprendre d'abord les fonctions que tu utilise et a quoi elle servent enfin svoir ce que fait ton code je crois que c'est a partir de ce moment que je peux facilement trouver comment ecrire celui du plus jeune fichier .
je vais reprendre ton code ligne par ligne et te dire comment je le comprend aussi te faire savoir ce qui me parrait flou :
*au tout debut on a une option explicite c'est pour déclarer toutes les variables de façon explicite "j'ai compris"
**entre la ligne 3 et la ligne 23 si je ne me trompe pas c'est une fonction que tu a defini ...
***
  1. Dim fso As FileSystemObject
fso c'est une variable de type "FileSystemObject" mais FileSystemObject represente quel genre de variable la j'ai pas compris
****
  1. Dim fichier As File
  2. Dim plus_vieux_fichier As File
ça c'est compri tu as defini des variables de type fichier ...

****
  1. Set fso = CreateObject("scripting.filesystemobject" )
  2. For Each fichier In fso.GetFolder(chemin).Files
voici la derniere chose qui me parrait dur a saisir si tu pouvais m'expliquer ligne par ligne .
au fait CreateObject: creé et renvoi une reference a un objet ça j'ai pu le voir dans l'aide ..

voila pour le code mais j'ai une interrogation :??: 

sur mon ordi il y a plusieurs fichiers dans des repertoires differents comment le code que tu m'a envoyé c'est faire ce que je veux c'est a dire suivre le chemin :
  1. sRépertoire = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Synthèse\"denier fichier"


:??:  :??: 

merci bien d'avance
Expert Programmation

Le VBA , c'est du VB avec un certain nombre de modules en moins.
Pour le VBA/Excel, on met VBA basic + les objets Excel.
Pour le VBA/Word, on met VBA basic + les objets Word.

Donc de façon logique, quand tu fais du VBA sous Excel, les objets Excel sous déjà chargés.

Imagine que tu veuilles écrire une page Word dans Excel. Ben c'est impossible de le faire puisque le VBA/Excel ne connaît pas les objets Word. Sauf si on charge les références Word dans VBA/Excel. La liste des références possible dépend de ce qu'il y a installé sur ton poste.

Dans l'éditeur de VBA; ouvre le menu Outils/Références.... Et oui, tu peux charger tout ça !

VBA par défaut, n'est pas capable de gérer les objets de base comme les répertoires, les fichiers :pfff: 

Mais comme VB est un langage permissif, si tu fais
  1. Dim fso As Object
  2. Set fso = CreateObject("scripting.filesystemobject" )
ca marche quand même.

Moi, j'aime à savoir ce que je fais. Alors je déclare la référence pour FileSystemObject et File. Bon, faut être un gros malin (je suis un gros malin :sol:  ) pour savoir dans quelles références se planquent ces objets. C'est dans une seule et même référence Microsoft Scripting Runtime. Sauf que la liste Références - VBA Project ne te le propose pas toujours. Dans ce cas, il faut est un encore plus gros malin, et savoir que Microsoft Scripting Runtime est le nom d'exploitation d'une bibliothèque de liens dynamiques qui se nomme scrrun.dll. On clique alors sur [Parcourir] et on va la chercher sans %windir%\system32.

Et voilà, maintenant VBA/Excel ressemble un peu plus à VB tout court. Sauf que les objets chargés par défaut ne sont pas les mêmes.

Par exemple, VBA/Excel charge un objet Application qui représente l'instance d'Excel chargée. VB ne charge pas d'instance Excel, il faudrait le faire à la main, comme ça :
  1. Set appxl = CreateObject("Application.Excel" )


Bon, ben t'as compris. VBA/Excel ne charge pas l'objet FileSystemObject. Faut le faire à la main :) 
  1. Set fso = CreateObject("scripting.filesystemobject" )


Grâce aux nouveaux objets contenu dans cette référence, je vais pouvoir facilement lire les dates de dernière modification de chaque fichier, et les comparer pour ne garder que le plus vieux. Etuide bien mon programme, c'est ce qu'il fait.

Voilà.

bonjour tout le monde
desolé de te decevoir une fois de plus Zeb mais j'arrive a rien ....... :( 

en plus je n'arrive pas a executer ton code j'ai mi :

  1. sub toto()
  2. 1.Option Explicit
  3. 2.
  4. 3.Function NomPlusVieuxFichier(chemin As String) As String
  5. .
  6. .
  7. .
  8. end function
  9.  
  10. end sub

comment faire ?? :??: 

merci de l'aide
Expert Programmation

M'enfin !

Je te donne le code d'une fonction. C'est une fonction. Picétou.
T'as fait des maths à l'école ? Quand tu as une fonction f(x), elle ne fait rien toute seule la fonction f(x). Il faut l'appeler avec des x et elle te renvoie des y.

Pareille pour NomPlusVieuxFichier.
Tu l'appelles avec un chemin, elle te renvoie un nom de fichier.

  1. Function NomPlusVieuxFichier(chemin As String) As String
  2. ...
  3. End Function
  4.  
  5. ' // C'est pas de moi, le nom de la procédure, hein !
  6. Sub Toto
  7. MsgBox "Le fichier le plus ancien du répertoire C:\ est : " & NomPlusVieuxFichier("C:\")
  8. End Sub

bonjour Zeb ,et bonjour tout le monde , voila j'ai adapté le code selon mon chemein
et ça donne ceci:

  1. Option Explicit
  2.  
  3. Function NomPlusJeuneFichier(Chemin As String) As String
  4. Dim Fso As FileSystemObject
  5. Dim Fichier As File
  6. Dim plus_Jeune_fichier As File
  7.  
  8. Set Fso = CreateObject("scripting.filesystemobject")
  9. For Each Fichier In Fso.GetFolder(Chemin).Files
  10. If plus_Jeune_fichier Is Nothing Then
  11. Set plus_Jeune_fichier = Fichier
  12. ElseIf Fichier.DateLastModified > plus_Jeune_fichier.DateLastAccessed Then
  13. Set plus_Jeune_fichier = Fichier
  14. End If
  15. Next
  16.  
  17. ' // Résultat
  18. If plus_Jeune_fichier Is Nothing Then
  19. NomPlusJeuneFichier = ""
  20. Else
  21. NomPlusJeuneFichier = plus_Jeune_fichier.Path
  22. End If
  23. End Function

  1. Sub toto()
  2. Dim Chemin As String
  3. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Synthèse"
  4. MsgBox "Le fichier le plus NOUVEAU du répertoire S:\ est : " & NomPlusJeuneFichier(Chemin)
  5. End Sub


le code fonctionne bien mais il y a un problème :??:  la boite de dialogue me donne l'avant dernier fichier du dossier synthese c'est a dire celui du 29/06/2010 au lieu de celui du 30/06/2010
comment y remedier?

merci

hé Zeb quoi tu m'a abandonné ce apres midi?
bon voila sache que je ne dors pas je fouille alors j'ai pu faire ceci :

  1. Function NomPlusJeuneFichier(Chemin As String) As String
  2. Dim Fso As FileSystemObject
  3. Dim Fichier As File
  4. Dim plus_Jeune_fichier As File
  5. Dim LaDate As Date, DatePlusJeuneFichier As Date
  6.  
  7. Set Fso = CreateObject("scripting.filesystemobject")
  8. For Each Fichier In Fso.GetFolder(Chemin).Files
  9. If plus_Jeune_fichier Is Nothing Then
  10. Set plus_Jeune_fichier = Fichier
  11. DatePlusJeuneFichier = CDate(Left(Fichier.Name, InStr(1, Fichier.Name, " ") - 1))
  12. Else
  13. LaDate = CDate(Left(Fichier.Name, InStr(1, Fichier.Name, " ") - 1))
  14. If LaDate > DatePlusJeuneFichier Then
  15. DatePlusJeuneFichier = LaDate
  16. Set plus_Jeune_fichier = Fichier
  17. End If
  18. End If
  19. Next
  20.  
  21. ' // Résultat
  22. If plus_Jeune_fichier Is Nothing Then
  23. NomPlusJeuneFichier = ""
  24. Else
  25. NomPlusJeuneFichier = plus_Jeune_fichier.Path
  26. End If
  27. End Function
  28. Sub toto_1()
  29. Dim Chemin As String
  30. Dim k As Long
  31. k = Worksheets("Feuil2").Cells(Rows.Count, 7).End(xlUp).Row
  32. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Synthèse"
  33.  
  34. MsgBox "Le fichier le plus récent du répertoire S:\ est : " & NomPlusJeuneFichier(Chemin)
  35.  
  36. End Sub

là la boite de dialogue me dit bien que le fichier le plus recent est celui du 30/06/2010
mais il reste une chose a faire aller a la feuille("synthèse") du classeur le plus recent et copier les valeurs H32 et D32
puis coller lces valeurs dans la premeire celulle vide respectivement en collone I et G
ALORS j'ai ajouté a la ligne 33 ceci:


  1. Workbooks("Classeurvarpara&hist").Worksheets("Feuil2").Cells(k + 1, "G").Value = _
  2. Workbooks("NomPlusJeuneFichier").Worksheets("Synthèse").Cells(32, "D").Value
  3. Workbooks("Classeurvarpara&hist").Worksheets("Feuil2").Cells(k + 1, "I").Value = _
  4. Workbooks("NomPlusJeuneFichier").Worksheets("Synthèse").Cells(32, "H").Value




et ça donne en tout :

  1. Function NomPlusJeuneFichier(Chemin As String) As String
  2. Dim Fso As FileSystemObject
  3. Dim Fichier As File
  4. Dim plus_Jeune_fichier As File
  5. Dim LaDate As Date, DatePlusJeuneFichier As Date
  6.  
  7. Set Fso = CreateObject("scripting.filesystemobject")
  8. For Each Fichier In Fso.GetFolder(Chemin).Files
  9. If plus_Jeune_fichier Is Nothing Then
  10. Set plus_Jeune_fichier = Fichier
  11. DatePlusJeuneFichier = CDate(Left(Fichier.Name, InStr(1, Fichier.Name, " ") - 1))
  12. Else
  13. LaDate = CDate(Left(Fichier.Name, InStr(1, Fichier.Name, " ") - 1))
  14. If LaDate > DatePlusJeuneFichier Then
  15. DatePlusJeuneFichier = LaDate
  16. Set plus_Jeune_fichier = Fichier
  17. End If
  18. End If
  19. Next
  20.  
  21. ' // Résultat
  22. If plus_Jeune_fichier Is Nothing Then
  23. NomPlusJeuneFichier = ""
  24. Else
  25. NomPlusJeuneFichier = plus_Jeune_fichier.Path
  26. End If
  27. End Function
  28. Sub toto_1()
  29. Dim Chemin As String
  30. Dim k As Long
  31. k = Worksheets("Feuil2").Cells(Rows.Count, 7).End(xlUp).Row
  32. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Synthèse"
  33. Workbooks("Classeurvarpara&hist").Worksheets("Feuil2").Cells(k + 1, "G").Value = _
  34. Workbooks("NomPlusJeuneFichier").Worksheets("Synthèse").Cells(32, "D").Value
  35. Workbooks("Classeurvarpara&hist").Worksheets("Feuil2").Cells(k + 1, "I").Value = _
  36. Workbooks("NomPlusJeuneFichier").Worksheets("Synthèse").Cells(32, "H").Value
  37. MsgBox "Le fichier le plus récent du répertoire S:\ est : " & NomPlusJeuneFichier(Chemin)
  38.  
  39. End Sub


mais j'ai une erreur ''l'indice n'appartient pas a la selection '' a la ligne 33

merci de me venir en aide.

bonjour tout le monde voici une proposition de solution:
  1. Function NomPlusJeuneFichier(Chemin As String) As String
  2. Dim Fso As FileSystemObject
  3. Dim Fichier As File
  4. Dim plus_Jeune_fichier As File
  5. Dim LaDate As Date, DatePlusJeuneFichier As Date
  6.  
  7. Set Fso = CreateObject("scripting.filesystemobject")
  8. For Each Fichier In Fso.GetFolder(Chemin).Files
  9. If plus_Jeune_fichier Is Nothing Then
  10. Set plus_Jeune_fichier = Fichier
  11. DatePlusJeuneFichier = CDate(Left(Fichier.Name, InStr(1, Fichier.Name, " ") - 1))
  12. Else
  13. LaDate = CDate(Left(Fichier.Name, InStr(1, Fichier.Name, " ") - 1))
  14. If LaDate > DatePlusJeuneFichier Then
  15. DatePlusJeuneFichier = LaDate
  16. Set plus_Jeune_fichier = Fichier
  17. End If
  18. End If
  19. Next
  20.  
  21. ' // Résultat
  22. If plus_Jeune_fichier Is Nothing Then
  23. NomPlusJeuneFichier = ""
  24. Else
  25. NomPlusJeuneFichier = plus_Jeune_fichier.Name
  26. End If
  27. End Function
  28.  
  29. Sub recherche_var()
  30.  
  31. Dim LeChemin As String, LaFeuille As String, LeFichier As String
  32. Dim LaCellule
  33. Dim Tblo
  34. k = Worksheets("Feuil2").Cells(Rows.Count, 7).End(xlUp).Row
  35. Tblo = Array("D32", "H32")
  36. LeChemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Synthèse"
  37. LeFichier = NomPlusJeuneFichier(LeChemin)
  38. LaFeuille = "Synthèse"
  39. For Each LaCellule In Tblo
  40. With Sheets("Feuil2").[G65000].End(xlUp)(2)
  41. .FormulaArray = "='" & LeChemin & "\[" & LeFichier & "]" & LaFeuille & "'!" & LaCellule
  42. .Value = .Value
  43. End With
  44. Next LaCellule
  45. Sheets("Feuil2").Cells(k + 1, "I").Value = Sheets("Feuil2").Cells(k + 2, "G").Value
  46. Sheets("Feuil2").Cells(k + 2, "G").Value = ""
  47. End Sub


merci beaucoup a vous tous :) 
Expert Programmation

Oups. Erreur détectée dans MON code :/ 

A la ligne 12 de ce code : http://www.presence-pc.com/forum/ppc/Programmation/copi... , il y avait écrit
  1. If Fichier.DateLastModified > plus_Jeune_fichier.DateLastAccessed Then
Evidemment, il fallait lire :
  1. If Fichier.DateLastModified > plus_Jeune_fichier.DateLastModified Then
Mea culpa.

Et non, je ne t'ai pas abandonné, cher ami, j'ai juste pris l'après-m' pour m'envoyer en l'air. (*)

L'erreur correspond à un indice de collections.
Ligne 33, tu as trois collections :
  • Workbooks,
  • Worksheets,
  • Cells.

    Il va te falloir débugger ça pour savoir lequel pose problème.
    L'art de déboguer : http://www.presence-pc.com/forum/ppc/Programmation/exce...

    ______________
    (*) Comprenne qui pourra ;) 

    voila je vais apprendre le debogage ce week end ,je croi que le resultat que j'ai posté avant la derniere intervention de Zeb repond a la question que je voulais resoudre jusque là.

    ,je continu dans ce sujet car c'est quelque chose de similaire que je fais mais avec une legere difference :


    je voudrai suivre un chemin qui n'est rien d'autre que clui là:
    Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    le problème est que le dossier "Résultat économique" contient plusieurs fichiers de noms differents
    mais moi ceux qui m'interressent ce sont ceux nommés par exemple :20100701-résultat economique ,20100701 c'est en fait la date d'hier c'est donc le fichier le plus recent de nom:"20100701-résultat economique "
    un nouveau fichier est completé chaque jour de date égale a la date du jour -1 .
    mois je voudrai donc allez dans ce dernier fichier et copier la derniere ligne non vide de l'onglet ("Historik") puis mettre cette ligne a la derniere ligne vide de mon classeur "varpara" a la feuille "feuil1"

    j'ai donc fait comme ci-dessous mais ça ne marche pas si quelqu'un veut bien me'aider pour que le code aille tout simplement dans le fichier le plus recent de nom du type "20100701-résultat economique " sachant qu'il y a d'autres fichiers dans le dossier ,
    tous les fichiers du dossier commence par la date comme indiqué plus haut

    voici mon code :

    1. Function NomPlusJeuneFichier(Chemin As String) As String
    2. Dim Fso As FileSystemObject
    3. Dim Fichier As File
    4. Dim plus_Jeune_fichier As File
    5. Dim LaDate As Date, DatePlusJeuneFichier As Date
    6. Dim X As String
    7.  
    8. Set Fso = CreateObject("scripting.filesystemobject")
    9. For Each Fichier In Fso.GetFolder(Chemin).Files
    10. X = Val(Left(Fichier.Name, InStr(1, Fichier.Name, " ") - 1))
    11. If plus_Jeune_fichier Is Nothing Then
    12. Set plus_Jeune_fichier = Fichier
    13. DatePlusJeuneFichier = CDate(Left(X, 4) & "/" & Mid(X, 5, 2) & "/" & Right(X, 2))
    14. Else
    15. LaDate = CDate(Left(X, 4) & "/" & Mid(X, 5, 2) & "/" & Right(X, 2))
    16. If LaDate > DatePlusJeuneFichier Then
    17. DatePlusJeuneFichier = LaDate
    18. Set plus_Jeune_fichier = Fichier
    19. End If
    20. End If
    21. Next
    22.  
    23. ' // Résultat
    24. If plus_Jeune_fichier Is Nothing Then
    25. NomPlusJeuneFichier = ""
    26. Else
    27. NomPlusJeuneFichier = plus_Jeune_fichier.Path
    28. End If
    29. End Function


    et :
    1. Sub recherche_historik()
    2. Dim LeChemin As String, LaFeuille As String, LeFichier As String
    3. Dim LaCellule
    4. Dim i As Long
    5. Dim Tblo() As Double
    6. ReDim Tblo(0 To 27) 'tableau de la derniere ligne qui contient 28 cellule
    7. k = Worksheets("Feuil1").Cells(Rows.Count, 2).End(xlUp).Row + 1
    8. LeChemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    9. LeFichier = NomPlusJeuneFichier(LeChemin)
    10. LaFeuille = "Historik"
    11. For i = 0 To 27
    12. Tblo(i) = "='" & LeChemin & "\[" & LeFichier & "]" & LaFeuille & "'!" & Cells(k, i).Value
    13. Sheets("Feuil1").Cells(k, i).Value = Tblo(i)
    14.  
    15. Next
    16. end sub


    mais j'ai une erreur "argument ou appel de procedure incorrect" dans ma fonction a la ligne 10

    aussi j'ai un grand doute dans mon
    Sub recherche_historik()....

    mais je vois pas du coup j'ai besoin de vous
    merci
    Expert Programmation

    Je propose une nouvelle version de NomPlusJeuneFichier :
    1. ' // Charger Microsoft Scripting Runtime dans les références
    2. ' // C'est le fichier %windir%\system32\scrrun.dll
    3. Function NomPlusJeuneFichier(Chemin As String, Optional PatternNomFichier As String) As String
    4. Dim FSO As FileSystemObject
    5. Dim Fichier As File
    6. Dim PlusJeuneFichier As File
    7.  
    8. Set FSO = CreateObject("scripting.filesystemobject")
    9. For Each Fichier In FSO.GetFolder(Chemin).Files
    10.  
    11. If PatternNomFichier = "" Or _
    12. Fichier.Name Like PatternNomFichier _
    13. Then
    14. If PlusJeuneFichier Is Nothing Then
    15. Set PlusJeuneFichier = Fichier
    16. ElseIf Fichier.DateLastModified > PlusJeuneFichier.DateLastModified Then
    17. Set PlusJeuneFichier = Fichier
    18. End If
    19. End If
    20.  
    21. Next
    22. ' // Résultat
    23. If PlusJeuneFichier Is Nothing Then
    24. NomPlusJeuneFichier = ""
    25. Else
    26. NomPlusJeuneFichier = PlusJeuneFichier.Path
    27. End If
    28. End Function


    Cette fonction reste basée sur l'âge des fichiers.

    Sinon, puisque le format YYYYMMDD est classable par ordre alphabétique, ton fichier le plus récent, basé sur le nom est :
    1. Function NomPlusJeuneFichierByName(Chemin As String, PatternNomFichier As String) As String
    2. Dim FSO As FileSystemObject
    3. Dim Fichier As File
    4. Dim PlusJeuneFichier As File
    5.  
    6. Set FSO = CreateObject("scripting.filesystemobject")
    7. For Each Fichier In FSO.GetFolder(Chemin).Files
    8. If Fichier.Name Like PatternNomFichier _
    9. Then
    10. If PlusJeuneFichier Is Nothing Then
    11. Set PlusJeuneFichier = Fichier
    12. ElseIf Fichier.Name > PlusJeuneFichier.Name Then
    13. Set PlusJeuneFichier = Fichier
    14. End If
    15. End If
    16. Next
    17. ' // Résultat
    18. If PlusJeuneFichier Is Nothing Then
    19. NomPlusJeuneFichier = ""
    20. Else
    21. NomPlusJeuneFichier = PlusJeuneFichier.Path
    22. End If
    23. End Function
    1. Sub toto()
    2. MsgBox NomPlusJeuneFichierByName("########-résultat economique")
    3. End Sub

    dans ce code :

    1. Function NomPlusJeuneFichierByName(Chemin As String, PatternNomFichier As String) As String
    2.  
    3. Dim FSO As FileSystemObject
    4. Dim Fichier As File
    5. Dim PlusJeuneFichier As File
    6.  
    7. Set FSO = CreateObject("scripting.filesystemobject")
    8. For Each Fichier In FSO.GetFolder(Chemin).Files
    9. If Fichier.Name Like PatternNomFichier _
    10. Then
    11. If PlusJeuneFichier Is Nothing Then
    12. Set PlusJeuneFichier = Fichier
    13. ElseIf Fichier.Name > PlusJeuneFichier.Name Then
    14. Set PlusJeuneFichier = Fichier
    15. End If
    16. End If
    17. Next
    18. ' // Résultat
    19. If PlusJeuneFichier Is Nothing Then
    20. NomPlusJeuneFichier = ""
    21. Else
    22. NomPlusJeuneFichier = PlusJeuneFichier.Path
    23. End If
    24. End Function


    1. Sub toto_22()
    2. Dim Chemin As String
    3.  
    4. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    5. MsgBox NomPlusJeuneFichierByName("########-résultat economique")
    6.  
    7. End Sub



    je crois bien faire en ajoutant le chemin dans toto()_22

    mais il me manque je supose quelque chose pour que ça fonctionne
    j'ai remarqué que la fonction : avait deux variables suf que ne vois pas encore ce que je dois renseigner dans
    1. PatternNomFichier


    merci bcp de m'en dire un peu plus
    Expert Programmation

    Dans NomPlusJeuneFichierByName, il faut donner le chemin, puis le pattern.
    Donc :
    1. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    2. MsgBox NomPlusJeuneFichierByName(Chemin, "########-résultat economique" )

    :spamafote: 

    bonjour tout le monde j'ai adapté le code comme ci-dessous :

    1. Function NomPlusJeuneFichierByName(Chemin As String, PatternNomFichier As String) As String
    2.  
    3. Dim Fso As FileSystemObject
    4. Dim Fichier As File
    5. Dim PlusJeuneFichier As File
    6.  
    7. Set Fso = CreateObject("scripting.filesystemobject")
    8. For Each Fichier In Fso.GetFolder(Chemin).Files
    9. If Fichier.Name Like PatternNomFichier _
    10. Then
    11. If PlusJeuneFichier Is Nothing Then
    12. Set PlusJeuneFichier = Fichier
    13. ElseIf Fichier.Name > PlusJeuneFichier.Name Then
    14. Set PlusJeuneFichier = Fichier
    15. End If
    16. End If
    17. Next
    18. ' // Résultat
    19. If PlusJeuneFichier Is Nothing Then
    20. NomPlusJeuneFichierByName = ""
    21. Else
    22. NomPlusJeuneFichierByName = PlusJeuneFichier.Path
    23. End If
    24. End Function


    1. Sub toto_22()
    2. Dim Chemin As String
    3.  
    4. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    5. MsgBox NomPlusJeuneFichierByName(Chemin, "######## - Résultat Economique")
    6. End Sub


    quand je lance "toto_22" j'ai juste le mot "OK" dans ma boite de dialogue et pas le nom du plus jeune fichier qui est l'objet de la recherche.
    merci de votre aide .
    Expert Programmation

    Gné :heink: 

    Tu as le mot "Ok" ou le bouton "Ok" ?
    Sois précis !

    Essaie ce code :
    1. Sub toto_23()
    2. Dim chemin As String
    3. Dim motif As String
    4. Dim fichier As String
    5.  
    6. chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    7. motif = "######## - Résultat Economique"
    8. fichier = NomPlusJeuneFichierByName(chemin, motif)
    9.  
    10. If fichier = "" Then
    11. MsgBox "Le fichier n'a pas été trouvé. " & vbCrLf & vbCrLf & _
    12. "Vérifier que vous avez CORRECTEMENT orthographié le motif." & vbCrLf & _
    13. "A savoir qu'un # remplace un chiffre."
    14. Else
    15. MsgBox "Le plus jeune des fichiers """ & motif & """ est : " & vbCrLf & fichier
    16. End If
    17. End Sub

    j'ai le bouton "OK" tu as raison :) 
    dans ce code:

    1. Sub toto_22()
    2. Dim chemin As String
    3. Dim motif As String
    4. motif = "######## - Résultat Economique"
    5. chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    6. MsgBox NomPlusJeuneFichierByName(chemin, motif)
    7.  
    8. End Sub


    mais dans toto_23 le message est : le fichier n'est pas trouvé j'ai bien verifier pour les chiffres il y en a 8 et j'ai bien respecté les espaces mais le resultat apres execution n'est pas bon

    bonjour , :) 
    là j'essai d'adapter le code selon mes besoins .il s'agit de mettre a la premiere ligne vide
    'de la feuil1 du classeur "Classeurvarparahist" ,la derniere ligne non vide de la feuille "Historique
    'telle qu'elle a été definie suivant le chemin indiqué
    'mais j'ai une erreur au niveau de ma boucle : "lindice n'appartient pas a la selection :??: 
    'voici mon code:

    1. Sub toto_22()
    2. Dim i As Long
    3. Dim k As Long
    4. Dim chemin As String, LaFeuille As String, LeFichier As String
    5. Dim motif As String
    6. Dim wb As Workbook
    7. Dim ws As Worksheet
    8. Set ws = Worksheets("Feuil1")
    9. Set wb = Workbooks("Classeurvarparahist")
    10. k = ws.Cells(Rows.Count, 4).End(xlUp).Row
    11. LaFeuille = "Historik"
    12. motif = "######## - Résultat Economique"
    13. chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    14. LeFichier = NomPlusJeuneFichierByName(chemin, motif)
    15. 'copie de la derniere ligne du tableau dans l'historique des var
    16.  
    17. For i = 0 To 27
    18. wb.ws.Cells(k + 1, i + 1).Value = Workbooks("LeFichier").Worksheets(LaFeuille).Cells(k + 1, i + 1).Value
    19. Next
    20. MsgBox NomPlusJeuneFichierByName(chemin, motif)
    21. End Sub


    merci d'avance
    Expert Programmation

    1. Set ws = Worksheets("Feuil1" )
    2. Set wb = Workbooks("Classeurvarparahist" )
    3.  
    4. wb.ws...
    :/
    1. Set wb = Workbooks("Classeurvarparahist" )
    2. Set ws = wb.Worksheets("Feuil1" )
    3.  
    4. ws...
    :) 

    1. Workbooks("LeFichier" )
    ménon !!!
    1. MsgBox "LeFichier"
    2. MsgBox LeFichier
    T'as pas compris ?

    'je vois j'ai compris, enfin je pense
    'voici le code:

    1. Sub toto_22()
    2. Dim i As Long
    3. Dim k As Long
    4. Dim chemin As String, LaFeuille As String, LeFichier As String
    5. Dim motif As String
    6. Dim wb As Workbook
    7. Dim ws As Worksheet
    8. Set wb = Workbooks("Classeurvarparahist")
    9. Set ws = wb.Worksheets("Feuil1")
    10.  
    11. k = ws.Cells(Rows.Count, 4).End(xlUp).Row + 1
    12. LaFeuille = "Historik"
    13. motif = "######## - Résultat Economique"
    14. chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    15. LeFichier = NomPlusJeuneFichierByName(chemin, motif)
    16. 'copie de la derniere ligne du tableau dans l'historique des var
    17. For i = 0 To 27
    18. ws.Cells(k, i + 1).Value = Workbooks("LeFichier").Worksheets(LaFeuille).Cells(k, i + 1).Value
    19. Next
    20.  
    21. MsgBox NomPlusJeuneFichierByName(chemin, motif)
    22. End Sub


    'merci de me dire ce qui ne va pas dans mon code toto_22...

    bonjour tout le monde,bonjour ZEB

    dans ton code en essayant de comprendre je vois que
    MsgBox "LeFichier" affiche dans la boite de dialogue le Mot "LeFichier"
    par contre MsgBox LeFichier m'affiche dianbobo
    en regardant ma ligne 18 je ne vois pas l'erreur
    j'attend impatiament ton aide ça fait 3 jours que je cherche a resoudre ce probleme

    merci d'avance

    'bonjour :) 
    'j'ai toujours pas pu resoudre mon probleme .sans ma boucle for le code fonctionne et quand je le lance
    'j'ai le bouton "OK"

    1. Sub toto_22()
    2. Dim I As Long
    3. Dim k As Long
    4. Dim Chemin As String, LaFeuille As String, LeFichier As String
    5. Dim motif As String
    6. Dim wb As Workbook
    7. Dim ws As Worksheet
    8. Dim Tblo
    9. Dim lacellule
    10. Set wb = Workbooks("Classeurvarparahist")
    11. Set ws = wb.Worksheets("Feuil1")
    12. k = ws.Cells(Rows.Count, 4).End(xlUp).Row + 1
    13. LaFeuille = "Historik"
    14.  
    15. motif = "######## - Résultat Economique.xls"
    16. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    17. LeFichier = NomPlusJeuneFichierByName(Chemin, motif)
    18. For I = 0 To 27
    19. ws.Cells(k, I + 1).Value = Workbooks("LeFichier").Worksheets(LaFeuille).Cells(k, I + 1).Value
    20. Next
    21. MsgBox NomPlusJeuneFichierByName(Chemin, motif)
    22. End Sub



    mais avec ma boucle for j'ai une erreur "l'indice n'appartient pas a la selection"
    que dois-je faire pour copier la derniere ligne de ma feuille Historik suivant le chemin
    definit ci-dessus et la coller dans mon classeur "Classeurvarparahist" a la premiere ligne vide
    de la feuille ("feuil1")

    merci d'avance

    bonjour ,
    ouf comme c'est dur , je veux vraiment savoir ce qu'elle a ma ligne 18?? comme probleme
    merci de m'assister
    la voici:

    1. For I = 0 To 27
    2. ws.Cells(k, I + 1).Value = Workbooks("LeFichier" ).Worksheets(LaFeuille).Cells(k, I + 1).Value
    3. Next


    merci d'avance

    bonjour , :) 
    voila j'ai réecrit sub toto_22 plus bas en definisssant un tableau
    mais ça ne fonctionne pas aussi

    1. Function NomPlusJeuneFichierByName(Chemin As String, PatternNomFichier As String) As String
    2.  
    3. Dim Fso As FileSystemObject
    4. Dim Fichier As File
    5. Dim PlusJeuneFichier As File
    6.  
    7. Set Fso = CreateObject("scripting.filesystemobject")
    8. For Each Fichier In Fso.GetFolder(Chemin).Files
    9. If Fichier.Name Like PatternNomFichier _
    10. Then
    11. If PlusJeuneFichier Is Nothing Then
    12. Set PlusJeuneFichier = Fichier
    13. ElseIf Fichier.Name > PlusJeuneFichier.Name Then
    14. Set PlusJeuneFichier = Fichier
    15. End If
    16. End If
    17. Next
    18. ' // Résultat
    19. If PlusJeuneFichier Is Nothing Then
    20. NomPlusJeuneFichierByName = ""
    21. Else
    22. NomPlusJeuneFichierByName = PlusJeuneFichier.Path
    23. End If
    24. End Function



    l'erreur se trouve a la ligne 20 de ci -dessous
    1. Sub toto_22()
    2. Dim I As Long
    3. Dim k As Long
    4. Dim Chemin As String, LaFeuille As String, LeFichier As String
    5. Dim motif As String
    6. Dim wb As Workbook
    7. Dim ws As Worksheet
    8. Dim Tblo(28) As Double
    9. Dim lacellule
    10. Set wb = Workbooks("Classeurvarparahist")
    11. Set ws = wb.Worksheets("Feuil1")
    12. k = ws.Cells(Rows.Count, 4).End(xlUp).Row + 1
    13. LaFeuille = "Historik"
    14.  
    15. motif = "######## - Résultat Economique"
    16. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique"
    17. LeFichier = NomPlusJeuneFichierByName(Chemin, motif)
    18. For Each lacellule In Tblo
    19. With Sheets("Feuil1").[G65000].End(xlUp)(2)
    20. .FormulaArray = "='" & Chemin & "\[" & LeFichier & "]" & LaFeuille & "'!" & lacellule
    21. .Value = .Value
    22. End With
    23. Next lacellule
    24. MsgBox NomPlusJeuneFichierByName(Chemin, motif)
    25. End Sub



    si quelqu'un veit bien m'aider
    merci

    Bonjour,
    j'essai de corriger l'erreur qui me bloc
    :ange: 
    etant donné k la derniere ligne de la feuille ("Feuil1") ,je voudrais copier la derniere ligne
    de la feuille "historik" sachant que cette ligne change chaque jour elle est toujours a "k+1"
    comment bien definir le tableau:
    1. Range("A(k) :AB(k)")
    'merci de votre aide
    jai essayé comme ça :
    1. Workbooks("LeFichier").Worksheets(LaFeuille).Range("Ak :ABk").Copy Worksheets("Feuil1").Range("A" & k)
    mais ça marche pas
    nb:
    1. Set ws = wb.Worksheets("Feuil1")
    2. k = ws.Cells(Rows.Count, 4).End(xlUp).Row + 1
    3. LaFeuille = "Historik"

    merci de votre aide
    :) 

    bonjour
    voila ci-dessous mon code :
    1. Function NomPlusJeuneFichierByName(Chemin As String, PatternNomFichier As String) As String
    2.  
    3. Dim Fso As Object
    4. Dim Fichier As Object
    5. Dim PlusJeuneFichier As String
    6.  
    7. Set Fso = CreateObject("scripting.filesystemobject")
    8. For Each Fichier In Fso.GetFolder(Chemin).Files
    9. If Fichier.Name Like PatternNomFichier Then
    10. PlusJeuneFichier = Fichier.Name
    11. End If
    12. Next
    13. ' // Résultat
    14. If PlusJeuneFichier = "" Then
    15. NomPlusJeuneFichierByName = ""
    16. Else
    17. NomPlusJeuneFichierByName = PlusJeuneFichier
    18. End If
    19. End Function

    1. Sub recherche_resultat_eco()
    2. Dim i As Long
    3. Dim k As Long
    4. Dim Chemin As String, LaFeuille As String, LeFichier As String
    5. Dim motif As String
    6. Dim wb As Workbook
    7. Dim ws As Worksheet
    8. Set wb = Workbooks("Classeurvarparahist")
    9. Set ws = wb.Worksheets("Feuil1")
    10. LaFeuille = "Historik"
    11. k = ws.Cells(Rows.Count, 4).End(xlUp).Row + 1
    12. motif = "######## - Résultat Economique*"
    13. Chemin = "S:\PGB\DER\_Commun\MBO\RESULTAT ECO suivi quotidien\Résultat économique\"
    14. LeFichier = NomPlusJeuneFichierByName(Chemin, motif)
    15. Workbooks(LeFichier).Worksheets(LaFeuille).Range("A" & k & ":AB" & k).Copy ws.Range("A" & k)
    16. MsgBox NomPlusJeuneFichierByName(Chemin, motif)
    17. End Sub



    en faisant F8 j'ai bien tout marche sauf cette ligne :

    1. Workbooks(LeFichier).Worksheets(LaFeuille).Range("A" & k & ":AB" & k).Copy ws.Range("A" & k)


    erreur l'indice n'appartient pas a la selection

    si quelqu'un veut bien m'aider
    merci

    voila le probleme est resolu enfin
    :bounce: 
    il fallait faire :
    1. Workbooks.Open Filename:=Chemin & LeFichier
    2.  
    3. For i = 1 To 28
    4. ws.Cells(k, i).Formula = Workbooks(LeFichier).Worksheets(LaFeuille).Cells(k, i).Value
    5. Next
    6. ActiveWindow.Close


    merci encore
    Lassé par la pub ? Créez un compte