Afficher les éléments d'un dossier

Résolu
Bonjour,

J'ai conçu un petit bout de code dont l'objectif est d'aller récupérer des valeurs présentes dans un onglet nommé Feuil1 dans des fichiers, tous présents dans un dossier.
Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[monfichier.xlsx]Feuil1'!R" & i & "C" & j

Le souci que j'ai avec cette ligne, c'est que j'aimerais que mon script parcours tous mes fichiers et pas que un fichier précis. Le seul problème étant que je bloque sur la conception de cette ligne, j'ai tenté comme-ceci, mais sans succès...

Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\" & [Fichier] & "Transient!'R" & i & "C" & j


Code complet :
Sub acces()
'For i = 1 To 4
'For j = 1 To 6
 '   Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[source.xlsx]Feuil1'!R" & i & "C" & j
'Next
'Next


Dim Dossier As String, Fichier As String, i As Integer

Dossier = "C:\Users\xxxx\" & "\"

i = 0

Fichier = Dir(chemin & "*.xlsx", vbNormal)

Do While Fichier <> ""

  For i = 1 To 1
  For j = 1 To 1
    Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[DTS_EPR2-PZR_cat2-T01A_rev1_MECH.xlsx]Transient'!R" & i & "C" & j
    'Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\" & [Fichier] & "Transient!'R" & i & "C" & j
  Next
  Next

  'i = i + 1

  'Sheets("Feuil1").Range("A" & i) = Fichier

  'Fichier = Dir

Loop

End Sub




Configuration: Windows / Chrome 80.0.3987.132

10 réponses

  1. Bonjour,

     Cells(i, j).FormulaR1C1 = "='" & ThisWorkbook.Path & "\[" & Fichier & "]Feuil1'!R" & i & "C" & j


    Vous n'allez pas chercher les valeurs, vous creez un lien entre les cellules de fichiers et votre fichier!
    1. Bonjour,

      Merci beaucoup pour ta réponse, c'est parfait !

      J'aurais juste une autre petite question, quand ma boucle While parcours mon dossier elle s'arrête avec un message d'erreur (j'imagine parce qu'elle a parcouru tous les fichiers du dossier).

      J'ai regardé sur la doc Microsoft pour sortir de ma boucle s'il n'y a plus de fichier à ajouter mais je n'arrive pas à l’implémenter à mon code..

      Merci d'avance
      1. Re,

        Ben, si vous avez ce code, ca doit le faire:

        Fichier = Dir(chemin & "*.xlsx", vbNormal)
        
        Do While Fichier <> ""
        .
        .
        .
        .
             Fichier=Dir
        Loop


        Quelle erreur avez-vous ?
    2. Bonjour,

      Merci pour ta réponse, en faite j'effectue une boucle avec une copie des noms des fichiers, présents dans un dossier, en les mettant en onglet dans mon fichier ou s’exécute ma macro.

      Avec ce code :
      Do While monFichier <> ""
         wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, "_") (2) 
      ' Permet de passer au fichier suivant
      monFichier = Dir
      Loop
      End Sub
      


      Mais du coup dès qu'il ne trouve plus de fichiers, il s'arrête avec l'erreur "indice non défini" sur cette ligne :
      wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, "_") (2) 
      ' Permet de passer au fichier suivant
      1. Contributeur
        l'erreur se produit sans doute parce qu'un fichier n'est pas nommé comme tu l'imagines, avec au moins deux "_".
    3. Bonjour,

      dès qu'il ne trouve plus de fichiers
      Desole, mais si plus de fichier, la variable Fichier="", donc pas de passage dans la boucle

      Au moment de l'erreur, quelle est la valeur de Fichier?
      1. Bonjour,

        Et merci à tous les deux pour vos réponses.
        Elle affiche bien le nom du dernier fichier dans un onglet, mais me renvoie l'erreur juste après : "L'indice n'appartient pas à la section" erreur d'execution 9. Je me suis fourvoyé dans mon précédent poste.
        1. Do While monFichier <> ""
             wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Split(monFichier, "_") (2) 
          ' Permet de passer au fichier suivant
          onglet = Split(monFichier, "_")(2)
          monFichier = Dir
          Loop
          End Sub


          Voici la boucle complète
          1. Contributeur
            difficile à suivre avec un code qui change tout le temps. difficile de croire que l'erreur porte sur une ligne qui ne fait que partiellement ce que fait la ligne précédente.
            à quoi sert la variable onglet?
            n'est-il pas préférable de faire:
            onglet = Split(monFichier, "_")(2)
            wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet

            tu n'as-toujours pas répondu à la question:
            Au moment de l'erreur, quelle est la valeur de monFichier? sais-tu comment obtenir la valeur d'une variable après une erreur? si non, demande-nous, ne néglige pas notre question.
        2. Bonjour,

          Veuillez m'excuser pour mon délais et la non réponse à votre précédente question.

          Concernant la valeur de monFichier, j'ai utilisé la commande
          Debug.Print monFichier
          et cela me renvoie tout simplement tous les noms de fichier présent dans mon dossier, et pour la dernière ligne, le nom du dernier fichier.

          Voici mon code complet, j'ai peut être omis de vous spécifier quelques informations qui ont une importance dans la boucle :

          Sub toto()
          Dim monFichier As String
          Dim wb As Workbook
          Dim chemin As String
          Dim i As Integer
          Dim nom As String
          Set wb = Workbooks(ThisWorkbook.Name) 'classeur reception
          ' On a besoin du chemin absolu du dossier
          ' Doit se terminer par \
          chemin = ThisWorkbook.Path & "\"
          ' La fonction Dir(chemin, mode) permet de parcourir un dossier
          ' Ici je rajoute à mon chemin "*.xlsx",
          ' pour ne retrouver que mes fichiers Excel
          ' vbNormal permet de ne récupérer que des fichiers,
          ' vbDirectory récupère tout (dossiers et fichiers)
          monFichier = Dir(chemin & "*.xlsx", vbNormal)
          
          Do While monFichier <> ""
              onglet = Split(monFichier, "_")(2)
              wb.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = onglet
              'Debug.Print onglet
              Debug.Print monFichier
              monFichier = Dir
          
          Loop
          End Sub
          


          Ligne de l'erreur à la fin de l’exécution du code :
          onglet = Split(monFichier, "_")(2)


          Merci encore pour votre aide.
          1. Contributeur
            comme tu as mis la ligne debug.print (19) après la ligne qui donne l'erreur (22), tu n'as évidement pas le nom du fichier qui donne l'erreur.
            au moment où tu as l'erreur, il suffit de passer en mode "debogage", puis de mettre le curseur sur la variable monFichier.
        3. Bonjour,

          Il faut deux "_" pour que ca donne le bon resulat.
          Verifiez le nom du fichier
          1. C'est bon j'ai trouvé, en plaçant le Debug.Print monFichier avant la ligne 19.

            Et le programme prend en compte le nom du fichier sur lequel se lance la macro, qui lui ne possède pas (2) "_"

            Merci à tous les deux pour votre aide, j'ai enfin compris !
            1. Contributeur
              peux-tu alors marquer la discussion comme résolue?