手入力で値を入力したり、入力されている値を消去したりする場合があるC列に対して、値を自動入力するには、ワークシート関数では無理で、VBAを使う事になります。(ワークシート関数では、C列の値を書き換えたり、消去したりする際に、関数を消してしまう恐れがあります)
質問者様の添付画像の例では、B装置の納入日が入力されているセルが、装置名が「B装置」となっている行の中で最も下の行となっている事から考えますと、空欄に入れるべき日付は、必ずしも直上の行の日付であるとは限らない事になります。
又、複数種類の装置が同時期に納入される可能性も無いとは言えませんから、空欄に入れるべき日付は、日付が入力されている行の中で最も近い行に入力されている日付であるとは限らないと思われます。
そうなりますと、同じ装置名の中で日付が入力されている所から、日付を引っ張って来るしか方法は無く、そうしますと、もしも、同じ装置名で納入日が異なるものがあった場合には、空欄にどの日付を入れるべきかを判断する術は無いという事になります。
従って、表中の全ての行に亘って、同じ装置名が入力されている全ての行において、納入日は全て同じ日となっている(同じ装置名で納入日が異なるものは存在しない)ものとして考えなければ、自動化は不可能という事になりますので、万が一、同じ装置名で納入日が異なるものがあった場合には、その装置名で日付が入力されている行の中で、最も上にある行に入力されている日付を、その装置名の中で納入日が空欄となっている箇所にに入力すべき日付として、一律で採用する事に致しますが、それで宜しいでしょうか?
もし、それで宜しければ、以下の様なVBAのマクロとなります。(表の行数が多い場合においても動作速度を速くするために、1行ごとの繰り返し処理は行わずに、Y列とZ列に一時的にワークシート関数を入力してから、Z列の値をC列にコピーする方法としております)
Sub Macro()
Dim LR As Long
LR = Application.WorksheetFunction.Match("*?", Range("B:B"), -1)
Range("Y3:Y" & LR).FormulaR1C1 = "=IF(AND(RC2<>"""",ISNUMBER(1/RC3/DAY(RC3)),LEFT(CELL(""format"",RC3),1)=""D""),RC2,"""")"
Range("Z3:Z" & LR).FormulaR1C1 = "=IF(RC2="""","""",IF(COUNTIF(C[-1],RC2),IF(RC3="""",INDEX(C3,MATCH(RC2,C[-1],0)),RC3),""該当無し""))"
Range("C3:C" & LR).Value = Range("Z3:Z" & LR).Value
Range("Y3:Z" & LR).ClearContents
End Sub
尚、もしも、C列において空欄となっているセルの書式が、日付を表示する様になってない場合には、C列の日付を表示させるセルの書式の表示形式を、手動で[日付]にして下さい。
何故なら、C列における日付が入力されているセルの書式の表示形式は、必ずしも
m"月"d"日"
であるとは限りませんから、マクロの中で表示形式を指定しておく事は出来ませんし、さりとて、納入日が入力されているセルの書式を、そのまま他のセルにもコピーしてしまったのでは、セルの地の色やフォントの設定、罫線の設定等までコピーしてしまう事になりますので、例えば1行毎にセルの地の色を交互に変えて見やすくしていた場合や、罫線の一部を太枠にしていた場合などに不都合が生じる恐れがありますから、書式の方は手動で設定して頂いた方が話が簡単になるためです。
お礼
shintaro-2さん、ありがとうございました。 うぁ~?理屈はよくわかりませんがうまくいきました。 最初の順番に戻すため通し番号の列を作っておきましたが、この手順のまま並べ替えをしてしまうと 数値が狂ってしまうので日付の列をすべて「値」で貼り付けてから行いました。 中々覚えにくい手順ですが、ほかの時にも使えそうです。