J'espère que vous allez bien,
J'ai besoin de votre aide pour une simple macro dans le fichier conso moyenne qui fait la moyenne des consommations des trois fichiers sources en fonction de la référence (fonction recherche sûrement à intégrer, j'ai éparpillé exprès les références dans le fichier "conso moyenne").
En gros, on clique sur le bouton, on choisit nos 3 fichiers sources mois 1, mois 2 et mois 3, et cela nous donne au final la consommation moyenne (ou totale si c'est difficile pour vous) des trois mois.
Les fichiers sont en PJ, vous allez très vite comprendre ce que je souhaite.
Je vous adresse mes meilleurs salutations, bon réveillon !
Pas besoin de macro, c'est un problème classique avec des formules de liaison.
Ouvrez les 4 fichiers joints et en C2 du fichier des moyennes entrez cette formule :
Code:
=(RECHERCHEV(B2;'[source mois 1.xlsx]Feuil1'!$B$4:$E$1000;4;0)+RECHERCHEV(B2;'[source mois 2.xlsx]Feuil1'!$B$4:$E$1000;4;0)+RECHERCHEV(B2;'[source mois 3.xlsx]Feuil1'!$B$4:$E$1000;4;0))/3
Vous pouvez ensuite fermer les 3 autres fichiers, les formules s'adaptent.
Mon problème c'est que les sources à utiliser sont différents chaque mois, aujourd’hui on est décembre donc on utilise septembre octobre novembre, mais quand on sera en janvier on devra utiliser octobre nov décembre, ce sont des extractions mensuelles dans un lecteur réseau.
Ce que je souhaite concrètement c'est un bouton où on va sélectionner les trois sources (correspondent aux extractions des trois derniers mois) avec une sorte de fonction getopenfilename x3 par exemple.
Je ne sais pas comment faire pour prendre plusieurs fichiers à la fois avec la fonction Getopenfilename.
Voilà ce que ça donnerait ce que je souhaite :
Sub macro
- Sélection des trois fichiers dans le repértoire X (bureau par exemple) : Source 1 sélectionné, Source 2 sélectionné, Source 3 sélectionné
With range C2:C & rows count (de notre fichier macro conso)
J'ai réussi à faire un bouton rechercheV pour la sélection de un seul fichier source... mais pas de 3, voici :
Code:
Sub recherche()
ChDrive "C"
ChDir "C:\Users\pc\Desktop"
fichier1 = Application.GetOpenFilename
If fichier1 = False Then Exit Sub
With Range("b2:b" & Cells(Rows.Count, 1).End(xlUp).Row)
Set Source = Workbooks.Open(fichier1)
.Formula = "=VLOOKUP($a2,'[" & Source.Name & "]Donnees'!$b:$d,2,0)"
.Value = .Value
Workbooks(Source.Name).Close
End With
End Sub
Remerciement à Jack67 de m'avoir aidé
Sub Utilisation_FileDialog_Ouvrir()
Dim objOuvrir As FileDialog
Dim objFichiers As FileDialogSelectedItems
Dim x As Long
Dim Wb As Workbook
'Affiche la fenêtre "Ouvrir"
With Application.FileDialog(msoFileDialogOpen)
.InitialFileName = ""
'Efface les filtres existants.
.Filters.Clear
'Définit une liste de filtres pour le champ "Type de fichiers".
.Filters.Add "Classeurs Excel", "*.xlsx"
'Indique le type d'affichage dans la boîte de dialogue
.InitialView = msoFileDialogViewDetails
.Show
End With
'Définit le ou les fichiers à ouvrir
Set objFichiers = Application.FileDialog(msoFileDialogOpen).SelectedItems
'On sort si aucun fichier n'a été sélectionné
If objFichiers.Count = 0 Then Exit Sub
Application.ScreenUpdating = False
'Boucle sur le ou les fichiers Excel sélectionnés pour les ouvrir
For x = 1 To objFichiers.Count
Set Wb = Workbooks.Open(objFichiers(x))
'
'traitement
MsgBox Wb.Name 'introduit ici ton code
'
'Referme le classeur sans enregistrer les modifications.
Wb.Close False
Next
Application.ScreenUpdating = True
End Sub
Bçonjour cp4, je te remercie tout d'abord de ta réponse, ce code a l'air de très bien correspondre à ma demande, cependant je n'arrive pas à intégrer mon code dedans sûrement à cause de la boucle, voici ce que j'ai fait :
Code:
Sub Utilisation_FileDialog_Ouvrir()
Dim objOuvrir As FileDialog
Dim objFichiers As FileDialogSelectedItems
Dim x As Long
Dim Wb As Workbook
'Affiche la fenêtre "Ouvrir"
With Application.FileDialog(msoFileDialogOpen)
.InitialFileName = ""
'Efface les filtres existants.
.Filters.Clear
'Définit une liste de filtres pour le champ "Type de fichiers".
.Filters.Add "Classeurs Excel", "*.xlsx"
'Indique le type d'affichage dans la boîte de dialogue
.InitialView = msoFileDialogViewDetails
.Show
End With
'Définit le ou les fichiers à ouvrir
Set objFichiers = Application.FileDialog(msoFileDialogOpen).SelectedItems
'On sort si aucun fichier n'a été sélectionné
If objFichiers.Count = 0 Then Exit Sub
Application.ScreenUpdating = False
'Boucle sur le ou les fichiers Excel sélectionnés pour les ouvrir
For x = 1 To objFichiers.Count
Set Wb = Workbooks.Open(objFichiers(x))
With Range("c2:c" & Cells(Rows.Count, 1).End(xlUp).Row)
.Formula = "=VLOOKUP($b2,'[" & Workbooks.Open(objFichiers(1)).Name & "]Feuil1'!$b:$e,4,0) + VLOOKUP($b2,'[" & Workbooks.Open(objFichiers(2)).Name & "]Feuil1'!$b:$e,4,0) + VLOOKUP($b2,'[" & Workbooks.Open(objFichiers(3)).Name & "]Donnees'!$b:$e,4,0) "
.Value = .Value
Wb.Close False
Next
Application.ScreenUpdating = True
End Sub
Les fichiers sont en PJ. je pense que ça bloque avec la boucle, il faut trouver un moyen de faire la somme des recherchesV dans cette boucle...
Est-il possible aussi d'intégrer le chemin où l'on souhaite récupérer les fichiers ? pour un gain de temps, par exemple : C:\Users\pc\Desktop\Travail\Sources
Sans modifier les formules de liaison cette macro permet la mise à jour des 3 fichiers sources :
Code:
Sub MAJ_Sources()
Dim n As Byte
ChDir ThisWorkbook.Path & "\"
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = True
.Title = "Choisissez les 3 fichiers à ouvrir"
If .Show Then
If .SelectedItems.Count = 3 Then
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For n = 1 To 3
With Workbooks.Open(.SelectedItems(n))
.SaveAs Left(.FullName, InStrRev(.FullName, "\")) & "source mois " & n
.Close
End With
Next
End If
End If
End With
End Sub