• ベストアンサー

エクセルVBAで、「セルの日付からx日経過」の表し方

http://oshiete1.goo.ne.jp/qa4080864.html で以前質問させていただいたことに似た質問になります。 例 I3=項目名「登録」 I4以下に登録日 J3=項目名「初回入力」 J4以下に入力日 とした場合、 I列に入力があり(ない場合もあるので一応条件として)、 I列の登録日から20日経過してもJ列に入力がない場合 メッセージボックス「未入力」としたいのですが、 どのように表現したらいいでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

再びNo1です。 IF Cells(i + 3, "J") <> "" AND _ ‥ 空白でない <> "" は IF Cells(i , "J") <> "" AND _ ‥ 空白でない <> "" の書き間違いです。 失礼しました。

4k3s4r3
質問者

お礼

ありがとうございました。まだすこし理解し切れていないところもありますが、アドバイスをもとにべんきょうしてみます。

その他の回答 (2)

回答No.2

こんにちは no.1です。 コードを拝見しました。 勉強中ということですので、とりあえず、アドバイスさしてもらいます。 まずは、そちらの記載したコード --------------------------------------------------------- Sub test () Dim Sh As Worksheet Dim i As Integer Dim s As String i = 1 Do Until Sh.Cells(i + 3, "A").Value = "" If Sh.Cells(i + 3, "I") >= DateAdd("d", 8, Sh.Cells(i + 3, "I")) And _ Sh.Cells(i + 3, "J").Value = "" Then Sh.Cells(i + 3, "A").Resize(,18).Interior.ColorIndex = 38 End Sub --------------------------------------------------------- (1)Dim Sh As Worksheetで変数を定義した後、シートの名前をセット  していません。 ※Sh.Cellsで場所がわからない状態です。  また、シートを選択しましょう。  Set Sh = Worksheets("Sheet1") ‥ シート名のセット  Sh.Select           ‥ シート選択  シートを選択してしまえば、そのシート上のセルがアクティブに  なるので、cellsだけでもおkです。  ※参考:シートを選択するだけなら、下記のようなやり方もあります。 1.Sheets("Sheet2").Select 2.Worksheets("Sheet3").Select (2)"i"は処理行数を指定するために使用すると思いますが、i = 1ではなく、 i = 4(処理の先頭行)として、処理が終わったら i を1づつ増加させていく ほうがCells(i + 3, "A")‥とするより、すっきりします。 i+3 としておくと、i+4 になったとき、他の箇所を全てメンテナンスする必要があり 非効率だからです。(あくまで私の好みですがw)  i = 4  Sh.Cells(i + 3, "A").Value = "" は Cells(i, "A").Value = ""  のように書き換えできます。 (3)Do Untilに対する"Loop"がありません。  End Subの前に"Loop"を入れる必要があります。 (4)IF文に対するEnd Ifがありません。  IF Cells(i + 3, "J") <> "" AND _ ‥ 空白でない <> ""    DateDiff("d",開始日(登録日)のセル,終了日(入力日)のセル) >=20 then      真の時の処理  end If (5)i を増加させる文がありません。   Loopの直前にiを増加させましょう。 とまあ、こんな感じですが、少し考えてみてください^^ また、わからなければ補足でお願いします。 では、健闘を祈りますw

回答No.1

こんにちは^^ こんなものを作ってみました。 日付間の日数を求めるサンプル Sub Input_Check() Dim date_entry Dim date_input Range("I4").Select date_entry = ActiveCell.Value date_input = ActiveCell.Offset(0, 1).Value MsgBox ("登録日:" & date_entry) MsgBox ("初回入力日:" & date_input) MsgBox ("登録日からの日数:" & DateDiff("d", date_entry, date_input)) End Sub DateDiff関数というので、日付の間の日数を求めることができます。 >MsgBox ("登録日からの日数:" & DateDiff("d", date_entry, date_input)) 最初の引数"d"が日数間、"m"だと月数間など、他にもいろいろ指定 できるようです。 詳細は省きますw これで求めた日数をIF文を使って処理してみてください。 ^^ 以上、ご参考まで

4k3s4r3
質問者

お礼

ご回答ありがとうございました。今、作っている他のコードのひとつは、下のようなものです。今回質問した問題も、下のような感じでできるかなと思っていたのですが、考えると混乱してしまいます。。。 下のようにIf ~ Then の部分ですが、下のコードを基にしてできるでしょうか。 Sub test () Dim Sh As Worksheet Dim i As Integer Dim s As String i = 1 Do Until Sh.Cells(i + 3, "A").Value = "" If Sh.Cells(i + 3, "I") >= DateAdd("d", 8, Sh.Cells(i + 3, "I")) And _ Sh.Cells(i + 3, "J").Value = "" Then Sh.Cells(i + 3, "A").Resize(,18).Interior.ColorIndex = 38 End Sub

関連するQ&A