とりあえずのマクロです。
添付画像の状態でテストしています。
あらかじめ
O3に
=IF(AND(L3<>"",ISNUMBER(L3)),G3-K3,"")
として下にコピーして下さい。
P3に
=IF(K3="","",G3-SUM(K3,O3))
として下にコピーしてください。
実行対象としたいセルのどこかを選択します。
16日でしたら16日がある行のどこでもいいです。
選択したらマクロを実行します。
選んだ日付の行がフィルターされてそこでいいのかの確認が入ります。
YESを選択すると選択した日付のデータをもとに必要な作業が行われます。
15日を選択して実行すると5行目のブドウの行の2回目に2023,11,15の日付が入ります。
その後16日を選択して実行すると3行目のオレンジと4行目のリンゴ及び7行目のイチゴと8行目のブドウに2023,11,16が入ります
間違って15日を実行せずに16日を実行した場合
5行目と8行目のブドウに2023,11,16が入ります。
その場合15日を実行すると5行目は2023,11,15になります。
自分より上の行で自分と一致するデータで2回目が自分より未来の日付で場合あった場合は自分の受入日で上書きします。
Sheets("Test")のTestは実際のシート名に変更してください。
FirstRow = 3の3はデータの始まりの行(受入日の下の行)
マクロは添付画像の状態の表でないと正しい結果は得られません。
実際の表と違う場合は添付画像と実際の行を見比べてコードの
"B"とか"G"とか「"」で囲まれたのが列指定ですのでご自身で変更してください。
Range("B2")は受入日のセルを指定してください。
Sub Test()
Dim Ws As Worksheet
Dim mRng As Range
Dim FirstRow As Long, LastRow As Long, FTopRow As Long, i As Long, j As Long
Set Ws = Sheets("Test")
FirstRow = 3
With Ws.Range("B2")
.AutoFilter 1, Cells(Selection.Row, "B").Value
.AutoFilter 2, Cells(Selection.Row, "C").Value
.AutoFilter 3, Cells(Selection.Row, "D").Value
FTopRow = Ws.AutoFilter.Range.Offset(1, 0).SpecialCells(xlCellTypeVisible)(1).Row
LastRow = Ws.Cells(Rows.Count, "B").End(xlUp).Row
End With
If MsgBox("この日付のデータで実行します。よろしいですか?", vbYesNo + vbQuestion + vbDefaultButton2) = vbYes Then
For i = FTopRow To LastRow
For j = i + 1 To LastRow
If Ws.Cells(i, "F").Value = Ws.Cells(j, "F") Then
If Ws.Cells(i, "E").Value > Ws.Cells(j, "E") Then
Ws.Cells(i, "K").Formula = Ws.Cells(i, "G").Value
Else
Ws.Cells(j, "K").Value = Ws.Cells(j, "G").Value
End If
End If
Next j
If Ws.Cells(i, "K").Value = "" Then
Ws.Cells(i, "K").Value = Ws.Cells(i, "G").Value - 40
End If
Next i
For i = FTopRow To LastRow
If Ws.Cells(i, "G").Value <> Ws.Cells(i, "K").Value Then
For j = FirstRow To FTopRow - 1
If Ws.Cells(i, "F").Value = Ws.Cells(j, "F").Value Then
If Ws.Cells(j, "L").Value & Ws.Cells(j, "M").Value & Ws.Cells(j, "N").Value = "" Then
Ws.Cells(j, "L").Resize(1, 3).Value = Ws.Cells(i, "B").Resize(1, 3).Value
ElseIf IsDate(Ws.Cells(j, "L").Value & "/" & Ws.Cells(j, "M").Value & "/" & Ws.Cells(j, "N").Value) = True Then
If CDate(Ws.Cells(j, "L").Value & "/" & Ws.Cells(j, "M").Value & "/" & Ws.Cells(j, "N").Value) > _
CDate(Ws.Cells(i, "B").Value & "/" & Ws.Cells(i, "C").Value & "/" & Ws.Cells(i, "D").Value) Then
Ws.Cells(j, "L").Resize(1, 3).Value = Ws.Cells(i, "B").Resize(1, 3).Value
End If
End If
End If
Next j
End If
Next i
End If
Ws.AutoFilterMode = False
Set Ws = Nothing
End Sub
お礼