Bonjour,
J'avais confondu ma gauche et ma droite ! Et ensuite pour arranger, lignes et colonnes ! Mais voilà le bébé.
Je suis parti de tes indications procédurales : chemins et noms de fichiers à traiter en colonne A., on détermine donc ceux à traiter dans la liste (là où pas encore de données sur la ligne) et on traite donc les nouveaux fichiers en boucle.
J'ai également modifié un petit peu ton tableau, de façon que les en-têtes de colonnes soient sur la même ligne !
Sub RécupDonnées()
Dim ET, PlgD, Fich(), f%, n%, dln%, i%, k%, itm$, wsR As Worksheet
'Récollement fichiers à traiter
With ActiveSheet
n = .Range("B" & .Rows.Count).End(xlUp).Row + 1
If .Cells(n, 1) <> "" Then
dln = .Range("A" & .Rows.Count).End(xlUp).Row
ReDim Fich(n To dln)
For i = n To dln
Fich(i) = Cells(i, 1)
Next i
Else
MsgBox "Pas d'indication de nouveau fichier à traiter en colonne A !", _
vbInformation, "Erreur"
Exit Sub
End If
End With
'Traitement des fichiers (en boucle)
Set wsR = ActiveSheet
Application.ScreenUpdating = False
For f = LBound(Fich) To UBound(Fich)
With Workbooks.Open(Fich(f))
'Préparation fichier à traiter
With .Worksheets(1)
.UsedRange.MergeCells = False
dln = .Cells.SpecialCells(xlCellTypeLastCell).Row
For i = dln To 1 Step -1
k = .Cells(i, .Columns.Count).End(xlToLeft).Column
If k = 1 Then
If .Cells(i, 1) = "" Then .Rows(i).Delete
Else
For n = k - 1 To 1 Step -1
If .Cells(i, n) = "" Then .Cells(i, n).Delete xlShiftToLeft
Next n
End If
Next i
'Récupération des données
ET = wsR.Range("A2:X2").Value
ET(1, 1) = Fich(f)
PlgD = .Range("A1").CurrentRegion.Value
For n = 2 To UBound(ET, 2)
If IsNumeric(ET(1, n)) Then
For i = 1 To UBound(PlgD)
If PlgD(i, 1) = ET(1, n) Then
ET(1, n) = PlgD(i, 2): Exit For
End If
Next i
Else
itm = "*" & ET(1, n) & "*"
For i = 1 To UBound(PlgD)
If PlgD(i, 1) Like itm Then
ET(1, n) = PlgD(i, 2): Exit For
End If
Next i
End If
If i > UBound(PlgD) Then ET(1, n) = Empty
Next n
'Affectation ligne de données
With wsR.Range("A" & f).Resize(, 24)
.Value = ET: .NumberFormat = "0.00"
End With
End With
'Fermeture classeur traité (et passage au suivant si...)
.Close False
End With
Next f
End Sub
A toi de tester pour voir si cela répond aux spécifications.
Je n'en suis pas véritablement satisfait : 1,257 seconde. C'est donc lent ! On a le temps de percevoir une durée. J'aurais aimé descendre en-dessous de la demi-seconde mais, compte tenu de l'épuration, cela me paraît difficile, et cela peut toutefois rester acceptable.
Cordialement.