2- Le code ne fonctionne pas lorsque le fichier est fermé : j'ai une erreur (l'indice n'appartient pas à la sélection) au niveau de la ligne suivante :
Set w2 = Workbooks("Fichier Source.xlsx")
Tu as du modifier le code, en faisant une erreur à un moment.
Le nouveau code, pour lequel tu peux choisir ton fichier :
Sub Consolidation()
Dim w1 As Workbook, w2 As Workbook
Dim f1 As Worksheet, f2 As Worksheet
Dim l&, i&, k&, t(), temp(), Liste(), nw2
Set w1 = ThisWorkbook: Set f1 = w1.Sheets("Feuil1")
Liste = Array("Source 1", "Source 2", "Source 3", "Source 4", "Source 5")
'On choisit le fichier à ouvrir
nw2 = Application.GetOpenFilename("Fichiers Excel (*.xlsx), *.xlsx")
If nw2 <> False Then
Set w2 = Workbooks.Open(nw2)
Else: MsgBox "Vous n'avez pas sélectionné de fichier": Exit Sub
End If
'On débute le compteur à 0, afin de savoir s'il s'agit du premier tableau.
k = 0
'On boucle les différentes feuilles.
With w2
For i = LBound(Liste) To UBound(Liste)
With .Sheets(Liste(i))
l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
temp = .Range(.Cells(2, 1), .Cells(l, 20)).Value
If k = 0 Then
t = temp
Else: t = MergeArray2DVert(t, temp)
End If
End With
k = k + 1
Next i
End With
'On ferme le classeur à consolider.
w2.Close False
'On note les valeurs dans le classeur d'origine.
With f1.[a1].Resize(UBound(t), UBound(t, 2))
.NumberFormat = "@"
.Value = t
End With
End Sub
Function MergeArray2DVert(a, b)
maxtab1 = UBound(a)
Dim Tbl(): ReDim Tbl(1 To UBound(a) + UBound(b), 1 To UBound(a, 2))
For i = LBound(a) To UBound(a)
For c = 1 To UBound(a, 2): Tbl(i, c) = a(i, c): Next
Next i
For i = 1 To UBound(b)
For c = 1 To UBound(b, 2): Tbl(maxtab1 + i, c) = b(i, c): Next
Next i
MergeArray2DVert = Tbl
End Function