Private Sub Workbook_Open()
Me.Saved = True 'évite l'invite à la fermeture si aucune modification
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim F1 As Worksheet, F2 As Worksheet
Set F1 = Feuil2: Set F2 = Feuil3 'CodeNames des feuilles à traiter, à adapter
If Sh.Name <> F1.Name Then Exit Sub 'une seule feuille déclencheuse
If ActiveSheet.Name = F1.Name Or ActiveSheet.Name = F2.Name Then Exit Sub 'permet les entrées manuelles et le filtrage de la feuille
Dim colman1%, colman2%, ncolman1%, ncolman2%, colmax1%, colmax2%
Dim P1 As Range, P2 As Range, sel As Range, t1, t2, d As Object, i&, x$, j%, a(), s
colman1 = 11: colman2 = 11 'n° de la 1ère colonne d'entrée manuelle, à adapter pour chaque feuille
ncolman1 = 44: ncolman2 = 44 'nombre de colonnes d'entrée manuelle jointives, à adapter pour chaque feuille
colmax1 = colman1 + ncolman1 - 1 'n° de la dernière colonne d'entrée manuelle de la 1ère feuille
colmax2 = colman2 + ncolman2 - 1 'n° de la dernière colonne d'entrée manuelle de la 2ème feuille
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error GoTo 1
If F1.FilterMode Then F1.ShowAllData 'si la feuille est filtrée
If F2.FilterMode Then F2.ShowAllData 'si la feuille est filtrée
Set P1 = F1.[A1].CurrentRegion.Offset(1).Resize(F1.[A1].CurrentRegion.Rows.Count - 1) 'évite la ligne d'en-têtes
Set P2 = F2.[A1].CurrentRegion.Offset(1).Resize(F2.[A1].CurrentRegion.Rows.Count - 1) 'évite la ligne d'en-têtes
Set sel = Selection 'mémorise
Application.Undo
t1 = P1.Resize(, colmax1).Value2 'tableau précédent, .Value2 important pour les dates/heures
t2 = P2.Resize(, colmax2).Value2 'tableau précédent, .Value2 important pour les dates/heures
Application.Undo
sel.Select
'---traitement de la 1ère feuille---
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(t1)
x = "" 'RAZ
For j = colman1 To colmax1
x = x & Chr(1) & t1(i, j)
Next
d(t1(i, 1)) = Mid(x, 2) 'mémorise la concaténation
Next
t1 = P1.Columns(1).Value2 'colonne de référence du dernier tableau
ReDim a(1 To UBound(t1), 1 To ncolman1)
For i = 1 To UBound(t1)
s = Split(d(t1(i, 1)), Chr(1))
For j = 1 To ncolman1
a(i, j) = s(j - 1)
If IsNumeric(a(i, j)) Then a(i, j) = CDbl(a(i, j))
Next j, i
P1.Columns(colman1).Resize(, ncolman1) = a 'restitution
P1.Rows.AutoFit 'ajustement hauteurs des lignes
'---traitement de la 2ème feuille---
d.RemoveAll 'RAZ
For i = 1 To UBound(t2)
x = "" 'RAZ
For j = colman2 To colmax2
x = x & Chr(1) & t2(i, j)
Next
d(t2(i, 1)) = Mid(x, 2) 'mémorise la concaténation
Next
t2 = P2.Columns(1).Value2 'colonne de référence du dernier tableau
ReDim a(1 To UBound(t2), 1 To ncolman2)
For i = 1 To UBound(t1)
s = Split(d(t1(i, 1)), Chr(1))
For j = 1 To ncolman1
a(i, j) = s(j - 1)
If IsNumeric(a(i, j)) Then a(i, j) = CDbl(a(i, j))
Next j, i
P2.Columns(colman2).Resize(, ncolman2) = a 'restitution
P2.Rows.AutoFit 'ajustement hauteurs des lignes
1 Application.EnableEvents = True 'réactive les évènements
Application.ScreenUpdating = True
End Sub