反応ないので、メモした置いたものをアップして私の区切りとします。
●<現行一覧表(Sheet1)のレイアウト>
A列 B C D
1行 101 102 102
2 1 2
3 1F 2026/1/10 2026/2/9 2026/2/9
4 2F 2026/3/1 2026/1/20 2026/1/20
5
6
7
# C1:D1はセル結合されていても、コードで対応しているので問題なし
●<交換実績一覧表(Sheet2)のレイアウト>
A B C D E
1行 階 エアコン 1月 2月 3月
2 1F 101 2026/1/10
3 1F 102-1 2026/2/9
4 1F 102-2 2026/2/9
5 2F 101 2026/3/1
6 2F 102-1 2026/1/20
7 2F 102-2 2026/1/20
■コード例は、以下。
Sub test()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim dic As Object
Dim r$
Dim floor$, room$, nr$
Dim s$
Dim p&
Dim d As Date
Dim m&
Dim k&, j&
Set ws1 = Worksheets("Sheet1") '現行の一覧表
Set ws2 = Worksheets("Sheet2") '交換実績一覧表
'交換実績一覧表をもとに、”階,エアコン番号"に対応する行indexを辞書に保持
Set dic = CreateObject("Scripting.Dictionary")
For k = 2 To ws2.Cells(Rows.Count, "A").End(xlUp).Row
floor = ws2.Cells(k, "A")
nr = ws2.Cells(k, "B")
dic(floor & "," & nr) = k - 1
Next
ReDim mat(1 To dic.Count, 1 To 3) As Date
'現行の一覧表からデータを読み込み、配列matに書き込み
With ws1
For k = 3 To .Cells(Rows.Count, "A").End(xlUp).Row
floor = .Cells(k, "A")
For j = 2 To 4 '■列範囲調整必要
room = .Cells(1, j).MergeArea(1) 'セル結合への配慮
nr = .Cells(2, j)
If nr <> "" Then
s = floor & "," & room & "-" & nr
Else
s = floor & "," & room
End If
p = dic(s) '書き込み先の行index
d = .Cells(k, j)
m = Month(d) '書き込み先の列index(1月〜12月の前提)
mat(p, m) = d '配列に保持
Next
Next
End With
'交換実績一覧表に配列を書き込む
With ws2.[C2].Resize(UBound(mat, 1), UBound(mat, 2))
.Value = mat
.NumberFormatLocal = "yyyy/m/d;;;" '0のときは非表示とするため(改善が必要かも)
End With
End Sub
考え方を示したものであり、簡単な動作確認はしていますが、
最終的に使えるコードを提供するものではありません。
修正が必要な点はあります。適宜修正して下さい。
(例えば、フィルター交換日付が入っているところだけ対象にするとか。)
なお、部屋番号が各階で共通しているのかどうかも不明です。
そのあたりは、説明もないし、そちらで適宜応用してください。