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
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 = FalseEmpêche le rafraichissement de l'écran, sinon tu verrais (rapidement) l'ouverture des fichiers
.Close savechanges:=FalseReferme le fichier sans l'enregistrer, dans la majorité des cas le .Close suffit
c'est le rôle dePhilou30 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
Application.ScreenUpdating = FalseExcellent 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 Suble 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 SubCa 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 SubUne 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