• ベストアンサー

エクセル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

  • Excelの関数について

    質問についてうまく表現が出来ないのでセル番地等を記します。 I1とJ1を結合して2005/12(文字列で入力) K1とL1を結合して2005/11(同じ) M1とN1を結合して2005/10(同じ)           ・           ・ AE1とAF1........2005/01 まで I2,K2,L2,N2・以降1個とび・・・AE2に個数という項目名 J2,L2,N2,P2・以降1個とび・・・AF2に単価という項目名 I3~AF3までに数値が入ります。 I3~AF3までの範囲の最新の単価を表示させる為の関数はどうしたらよいのでしょうか? 個数と単価は空白のセルも出てきます。 考え方的にはI3~AF3の範囲で0又は空白セル以外の項目のうち一番左側のセルの値を表示させるようにすれば良いのですが、関数がわかりません。 よろしくお願いいたします。

  • 関数について教えて下さい。

    こんばんわ! 先程、質問させて頂いて、うまくいったのですが、数字を変えるとうまく行きませんので教えて頂けませんか? http://oshiete1.goo.ne.jp/qa5629494.html 「A1」期間を入れます。 「I3:J200」に表1があります。 「I列」期間・「J列」補数となってます。 「A7」に補数を、表1を参照し、関数を使用して 自動で入れたいです。 *「I4」の数字を22→22.5に変更しました。 (例) 「A1」に22を入れます。 表1「I列」に22が無いので、 「A7」にそれより大きい22.5の横「J列」の2.6を入れたいです。 ですが、「A7」に2.6を入れたいのですが、24.5が入ってしまいます。 「A7」=VLOOKUP(ROUNDUP(A2,0),I3:J200,2,1)が入ってます。 色々やってますが、うまくいきません。 教えて頂けないでしょうか? よろしくお願いします。

  • エクセルVBA

    生年月日(F3:F187)から85歳6か月になる人を(I3:I187)に☆を入力する構文を教えてください。 sheet名は入力です。よろしくお願いします

  • Excel collectionについて VBA

    Dim Mydata As New Collection Dim i As Long Dim EndNumber As Long On Error Resume Next 'データを登録する間、エラーを無視する For i = 2 To EndNumber '2行目から最終行までチェック Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 Next i On Error GoTo 0 i = 1 For Each A In Mydata Worksheets("Sheet1").Range("A" & i).Value = A i = i + 1 Next A 現在見ているシートの重複しない項目を 別シートに書き込みしているプログラムになります。 様々なサイトを参考にさせて頂き、 上記のような結果になり、 文字列は取得できるようになりました。 しかし、もとになるデータがある位置に(例は、J列) 数値が入っていると上手くコレクションに入ってくれません。 J列に文字列(りんご、ごりらなど)が入っている場合は 重複しない項目がコレクションに格納されていきます。 J列に文字列(0,1)が入っていた場合、 重複しない項目もなにも無く、 ローカルのMydataの中には<変数無し>とありました。 このプログラムの何処を直せば、数値をコレクションとして取得できますか? ちなみに、EndNumberには最終行の数値が入っています。 >Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 .valueを.stringにしても効果はありませんでした。 回答よろしくお願いいたします。

  • エクセル2000でVBAを教えてください!

    エクセル2000を使用しています。 sheet1が詳細情報の入力用シートになっています。 J47から特徴・コストなど10項目について 5行ずつスペースを空けて使用しています。 sheet2には、 項目 有 無 特徴(セルE25) コスト ・ ・ ・ となっており、sheet1に何か詳細が入力された場合に sheet2の該当する項目の有の列に「★」マークを表示させて 詳細情報が他にありますよ、という感じにしたいのですが 可能でしょうか? sheet2の項目は10以上あり sheet1の項目は一部ということになります。 また、sheet1と2の項目名は若干異なり、 sheet1が「コスト」、sheet2では「コスト(○○)」といった 感じになっています。 解りづらい質問ですが、 もしわかる方がいらっしゃれば回答願います。

  • ExcelのVBAで質問です。

    以下のようなシートがあります。 A列  B列  C列  D列  E列  F列  G列  H列 NO  名前  確認 日付1 日付2  確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。

  • あるセルに日付が入力してあり、他のセルにその日付を過ぎた日付を入力したり近づいた日付を入力した場合、コメントが

    エクセル(97)の話ですが、 例えば、「J列」(J5:J65536)に「●●予定日」の 日付が書いてあったとして、「M列(M5:M65536)」には 予定日1~数ヶ月以上前の日付が書いてあったとします。。 そして、「M列」の日付は度々書き直し変動します。 「M列」に入力した日付が「J列の●●予定日」の 10日以内だったり、その「●●予定日」を過ぎた日付を 入力してしまった場合、自動的に 「●●予定日が近づいてきています」 「●●予定日○日前です」 「既に●●予定日を過ぎてます」 「●●予定日を○日過ぎています」など、 「J列の●●予定日」の各行のセル(日付)を参照して、「M列の同行の日付」に、注意を促すような (常に表示の)コメントがつくようにはできますでしょうか?

  • エクセル関数SUMIFについて

    エクセル関数を良く使います。 今回行いたいのはJ28:J32の範囲の中でJ24より小さい値の行のI28:I32の合計の値というものです。 しかし、下記の様に入力すると「入力が正しくありません」と出てしまいます。 =SUMIF(J28:J32,<J4,I28:I32) 数式の場合は””で囲むとヘルプに出ているのですがそれだと<J24という文字として認識してしまうらしく、私の望むJ4より小さい値の行のI列の合計は出てきません。 この式の検索条件にセル番地とすうしくの組み合わせを入れてはいけないのでしょうか? 御存知の方教えて下さい。

  • エクセル VBA 入力パターンごとの結果

    関数でもできると思うのですが、データが膨大ですごく重くなります。できたらマクロでと思ったのですが、自分ではうまくできませんでした。よろしくお願い致します。 D列5行目から、10000行目までに以下の条件で入力された場合の結果です。 【パターン(1)】 ・”1”と入力された場合、(同じ行の)GからS列までに、”1”と自動入力。 ・”2”と入力された場合、(同じ行の)GからT列までに、”1”と自動入力。 ・”3”と入力された場合、(同じ行の)HからU列までに、”1”と自動入力。 ・”4”と入力された場合、(同じ行の)IからV列までに、”1”と自動入力。 と各種パターンがあります。 【パターン(2)】 各行にパターン(1)が入力されたあと、以下の条件を加えたいのです。 E列5行目から、10000行目までに以下の条件が入ります。 ・”1”と入力された場合、(同じ行の)I列は”0”に入力が変わる ・”2”と入力された場合、(同じ行の)J列は”0”に入力が変わる。 ・”3”と入力された場合、(同じ行の)K列は”0”に入力が変わる ・”4”と入力された場合、(同じ行の)L列は”0”に入力が変わる

  • エクセルVBAで、検索・抽出の仕方を教えてください

    VBAを殆ど使ったことがないのですが、 仕事でどうしても必要なため、以下のやり方を教えてください。 Aというシートにあるデータを貼り付けた後、 自動的にあるキーワードで検索してヒットした行と、 必要な項目が飛び飛びになっている列(複数)を 抽出してBというシートに貼り付けたいと思っています。 イメージとしては、Aというシートから商品名iで抽出して 商品名   |D(不要な列) |容量|E(不要な列)|製造会社| F(商品名)|D’(不要)  |G |E’(不要) |H   | i(商品名)|D’(不要)  |J |E’(不要) |K   | L(商品名)|D’(不要)  |J |E’(不要) |K   | i(商品名)|D’(不要)  |M |E’(不要) |N   | ________________________________ ↓不要な列を省いた状態にしてBというシートに この様な状態で貼り付けたいと思っています。 商品名   |容量|製造会社| i(商品名)|J |K   | i(商品名)|M |N   |     説明がわかりにくくてすみません。 よろしくお願い致します。

専門家に質問してみよう