Importer une valeur d'un fichier défini par une cellule

Bonjour à tous,

voilà, commence tout juste dans excel et je souhaiterai travailler sur plusieurs fichiers situés dans le même répertoire.

Mon soucis :

Récupérer la valeur de la cellule (B2) d'un fichier nommé Jacques.xlsx. Jusque là ça va. Mais le nom de ce fichier (Jacques) doit être saisie dans le fichier où je suis "Total heures.xlsx".

J'ai bien essayé de faire ceci: ="["&A2&".xlsx]Feuil1"!$B$2 (où A2 est la cellule comportant le nom "Jacques") .... évidement c'est pas ça :-(

La finalité est de pouvoir faire dans le fichier "Total heures.xlsx" faire la somme par mois des heures effectuées par "Jacques", "Paul" etc .... dont les prénoms sont saisis dans le fichier Total heures.xlsx".

Les prénoms ne sont pas fixes tous les mois bien sûr.

Je n'aime pas trop demander de l'aide mais là en parcourant plusieurs sites et forums, je n'arrive pas à trouver quelque chose qui pourrait me faire avancer.

Bien sur vous vous doutez bien que se sont des fichiers simple pour illustrer ma demande et j'adapterai.

Je travaille sur un projet de bulletins de salaires pour mon école de musique et cela porte sur la sommes des cotisations patronales et salariales par mois. Si besoin je peux joindre ces fichiers.

Un grand merci d'avance.

Philippe

Je vous laisse 3 fichiers

Jacques.xlsx

https://www.cjoint.com/c/EGii2IbeMm1

Paul.xlsx

https://www.cjoint.com/c/EGii3xciEx1

Total heures.xlsx

https://www.cjoint.com/c/EGii3ZSia31

Bonjour et bienvenu(e)

Tous les fichiers dans le mêmes répertoire

A tester

Wouaou !!

Magnifique, je n'ai plus qu'à lancer la macro au démarrage, faire une ligne de sommes et ça roule.

Un immense merci !!

Maintenant le plus dur reste à "décrypter" ton code pour ne pas rester ignare et apprendre par la même occasion.

J'ai même le luxe d'avoir une MsgBox en cas de fichier inexistant !! royal !

Pourrai-je revenir vers toi pour une fonction qui me semblerai d'être d'un autre monde à mes yeux ?

MERCI Banzai64 !!

Bonjour

Philou30 a écrit :

Pourrai-je revenir vers toi pour une fonction qui me semblerai d'être d'un autre monde à mes yeux ?

Reviens sur le forum, je ne suis pas tout seul et souvent (même très souvent) je n'ai pas la solution

Super je viens de "décrypter +- ton code.

Une ligne m'a posée soucis :

Ws.Range("A" & Rows.Count).End(xlUp).Row mais j'ai trouvé :

Range("A" & Rows.Count).End(xlUp).Row -> n° de la dernière ligne non vide de la colonne A

Application.ScreenUpdating = False -> je vois bien se que cela veut dire en gros ...mais pourquoi ?

ThisWorkbook.Path : je ne connaissais pas (normal je débute)

.Close savechanges:=False : ou bien l'ouverture et la fermeture de Workbooks.Open(Chemin & Ws.Range("A" & Ligne) & ".xlsx") a été très rapide et je n'ai rien vu dans tous les cas je suppose que c'est pour n'apporter aucun modification au fichier (Workbooks.Open) ouvert.

Merci encore

Bonjour

Application.ScreenUpdating = False

Empêche le rafraichissement de l'écran, sinon tu verrais (rapidement) l'ouverture des fichiers

.Close savechanges:=False

Referme le fichier sans l'enregistrer, dans la majorité des cas le .Close suffit

Philou30 a écrit :

ou bien l'ouverture et la fermeture de Workbooks.Open(Chemin & Ws.Range("A" & Ligne) & ".xlsx") a été très rapide et je n'ai rien vu

c'est le rôle de
Application.ScreenUpdating = False

Excellent et en plus avec explication de texte à l'appuie.

Bravo !

Si on va plus loin à savoir la valeur que l'on va chercher est déjà une somme (des différents jours du mois), la valeur copy me retourne :

=SOMME(#REF!)

je pense que c'est normal car j'ai repris ton code et légèrement modifié qui donne :

Sub Importe()
Dim Ligne As Long, DerniereLigne As Long

Dim Chemin As String
Dim Ws As Worksheet

  Application.ScreenUpdating = False
  Set Ws = ActiveSheet
  DerniereLigne = Ws.Range("D" & Rows.Count).End(xlUp).Row
  Ws.Range("AB3:AN" & DerniereLigne).Clear
  Chemin = ThisWorkbook.Path & "\"
  For Ligne = 9 To DerniereLigne
    If Dir(Chemin & Ws.Range("D" & Ligne) & ".xlsm") = "" Then
      MsgBox "Le fichier " & Ws.Range("D" & Ligne) & ".xlsm" & " est introuvable"
    Else
      With Workbooks.Open(Chemin & Ws.Range("D" & Ligne) & ".xlsm")
        .Sheets("Septembre").Range("AG41").Copy Ws.Range("AB" & Ligne)
        .Close savechanges:=False
      End With
    End If
  Next Ligne

End Sub

le pb est là je pense sachant que AG41 vaut : =SOMME(AG25:AG40)

.Sheets("Septembre").Range("AG41").Copy Ws.Range("AB" & Ligne)

Y aurait-il un moyen de récupérer AG41 proprement ?

Bonjour

Je vois que tu ne récupères qu'une seule cellule

Tu peux faire

      With Workbooks.Open(Chemin & Ws.Range("D" & Ligne) & ".xlsm")
        '.Sheets("Septembre").Range("AG41").Copy Ws.Range("AB" & Ligne)
        Ws.Range("AB" & Ligne) = .Sheets("Septembre").Range("AG41")
        .Close savechanges:=False
      End With 

Que dire .... je n'étais pas loin ... mais c'était pas suffisant.

C'est parfait ! j'ai appliqué et étendu sur 4 mois -> nickel :

Sub Importe()
Dim Ligne As Long, DerniereLigne As Long

Dim Chemin As String
Dim Ws As Worksheet

  Application.ScreenUpdating = False
  Set Ws = ActiveSheet
  DerniereLigne = Ws.Range("D" & Rows.Count).End(xlUp).Row
  'Ws.Range("AB3:AN" & DerniereLigne).Clear
  Chemin = ThisWorkbook.Path & "\"
  For Ligne = 9 To DerniereLigne
    If Dir(Chemin & Ws.Range("D" & Ligne) & ".xlsm") = "" Then
      MsgBox "Le fichier " & Ws.Range("D" & Ligne) & ".xlsm" & " est introuvable"
    Else
      With Workbooks.Open(Chemin & Ws.Range("D" & Ligne) & ".xlsm")
         Ws.Range("AB" & Ligne - 7) = .Sheets("Septembre").Range("AG41")
         Ws.Range("AC" & Ligne - 7) = .Sheets("Octobre").Range("AG41")
         Ws.Range("AD" & Ligne - 7) = .Sheets("Novembre").Range("AG41")
         Ws.Range("AE" & Ligne - 7) = .Sheets("Décembre").Range("AG41")
        .Close savechanges:=False
      End With
    End If
  Next Ligne

End Sub

Ca fonctionne très bien.

Je voudrais allé plus loin encore : pour que cela soit plus joli, je voudrais mettre ces calculs sur une feuille nommé "données" et je rapatrierai le tout sur la feuille "Accueil".

c'est trop dur pour moi (pas assez de connaissance et de maîtrise des macro. je sais que je dois activer la Sheet "Données" mais n'importe où je place un truc du style Worksheets("Données").Activate ou Ws.Sheet("Données") -> Mr Débogueur arrive et me salut gentiment

Je pense ne pas avoir compris : Set Ws = ActiveSheet

j'ai même essayé :

         Ws.Sheet("Données").Range("AB" & Ligne - 7) = .Sheets("Septembre").Range("AG41")
         Ws.Sheet("Données").Range("AC" & Ligne - 7) = .Sheets("Octobre").Range("AG41")
         Ws.Sheet("Données").Range("AD" & Ligne - 7) = .Sheets("Novembre").Range("AG41")
         Ws.Sheet("Données").Range("AE" & Ligne - 7) = .Sheets("Décembre").Range("AG41")

Rigolez pas

Alors où et comment activer cette feuille "donnée" ? âme charitable .. banzai64 .....

Bonjour

Philou30 a écrit :

Je pense ne pas avoir compris : Set Ws = ActiveSheet

Sert à manipuler (désigner) facilement la fenêtre active (celle qui à le bouton), alors même si il y a 2 classeurs ouverts en même temps VBA reconnaitra Ws parmi les feuilles

Une solution ( non testée)

    Sub Importe()
    Dim Ligne As Long, DerniereLigne As Long

    Dim Chemin As String
    Dim Ws As Worksheet

      Application.ScreenUpdating = False
      Set Ws = ActiveSheet
      DerniereLigne = Ws.Range("D" & Rows.Count).End(xlUp).Row
      'Ws.Range("AB3:AN" & DerniereLigne).Clear
     Chemin = ThisWorkbook.Path & "\"
      For Ligne = 9 To DerniereLigne
        If Dir(Chemin & Ws.Range("D" & Ligne) & ".xlsm") = "" Then
          MsgBox "Le fichier " & Ws.Range("D" & Ligne) & ".xlsm" & " est introuvable"
        Else
          With Workbooks.Open(Chemin & Ws.Range("D" & Ligne) & ".xlsm")
             Ws.Range("AB" & Ligne - 7) = .Sheets("Septembre").Range("AG41")
             Ws.Range("AC" & Ligne - 7) = .Sheets("Octobre").Range("AG41")
             Ws.Range("AD" & Ligne - 7) = .Sheets("Novembre").Range("AG41")
             Ws.Range("AE" & Ligne - 7) = .Sheets("Décembre").Range("AG41")

         ThisWorkbook.Sheets("Données").Range("AB" & Ligne - 7) = .Sheets("Septembre").Range("AG41")
         ThisWorkbook.Sheets("Données").Range("AC" & Ligne - 7) = .Sheets("Octobre").Range("AG41")
         ThisWorkbook.Sheets("Données").Range("AD" & Ligne - 7) = .Sheets("Novembre").Range("AG41")
         ThisWorkbook.Sheets("Données").Range("AE" & Ligne - 7) = .Sheets("Décembre").Range("AG41")

            .Close savechanges:=False
          End With
        End If
      Next Ligne

    End Sub

Une autre solution serait qu'une fois les données copiées dans Ws (ActiveSheet) on copie d'un coup les données dans la feuilles "Données"

code à placer 1 fois à la place des 4 lignes ThisWorkbook..........

Ws..Range("AB" & Ligne - 7 & ":AE" & Ligne -7)).Copy  ThisWorkbook.Sheets("Données").Range("AB" & Ligne - 7)("

Si des difficultés joins ton fichier + un fichier xlsx

Et bien c'est parfait grâce à toi j'ai pu avancer, apprendre et finir.

Bien sûr j'ai encore du boulot mais une grosse étape est passée.

Mille mercis Banzai64

Rechercher des sujets similaires à "importer valeur fichier defini"