- ベストアンサー
エクセルVBAで、「セルの日付からx日経過」の表し方
http://oshiete1.goo.ne.jp/qa4080864.html で以前質問させていただいたことに似た質問になります。 例 I3=項目名「登録」 I4以下に登録日 J3=項目名「初回入力」 J4以下に入力日 とした場合、 I列に入力があり(ない場合もあるので一応条件として)、 I列の登録日から20日経過してもJ列に入力がない場合 メッセージボックス「未入力」としたいのですが、 どのように表現したらいいでしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
再びNo1です。 IF Cells(i + 3, "J") <> "" AND _ ‥ 空白でない <> "" は IF Cells(i , "J") <> "" AND _ ‥ 空白でない <> "" の書き間違いです。 失礼しました。
その他の回答 (2)
- nayuta_lot
- ベストアンサー率64% (133/205)
こんにちは 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
- nayuta_lot
- ベストアンサー率64% (133/205)
こんにちは^^ こんなものを作ってみました。 日付間の日数を求めるサンプル 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文を使って処理してみてください。 ^^ 以上、ご参考まで
お礼
ご回答ありがとうございました。今、作っている他のコードのひとつは、下のようなものです。今回質問した問題も、下のような感じでできるかなと思っていたのですが、考えると混乱してしまいます。。。 下のように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
お礼
ありがとうございました。まだすこし理解し切れていないところもありますが、アドバイスをもとにべんきょうしてみます。