プロが教えるわが家の防犯対策術!

シート:
A列には”注射”という文字を入れるようにします。
B列には1月1日から12月31日まで入っています。
C列はB列の90日後を入れるようにします。
D列はC列の3日前を入れます。・・・としたいのですがその3日の間A列に”注射”が入っていたらその日を入れずに3日前にしたいのです。 稼働日みたいな感じでしょうか・・・・
どうしたらよいでしょうか?お願いします。

例えば、B列の「1月1日」の90日後はC列「3月31日」でD列は通常「3月28日」が入っていますがB列「3月30日」の左のA列に”注射”があったらそこを無視して「3月27日」と入れたいのです。

Sub count()
Dim i As Long
Dim lastrow As Long
lastrow = Range("B1").End(xlDown).Row
For i = 1 To lastrow
Cells(i, 3).Value = DateAdd("d", 90, Cells(i, 2).Value)
Next
For i = 1 To lastrow
Cells(i, 4).Value = DateAdd("d", -3, Cells(i, 3).Value)
Next
End Sub

説明が下手なのでもしよかったら実際作ったものを見ていただいた方が分かるかもしれません。
http://briefcase.yahoo.co.jp/bc/robert_kubica_bm …

A 回答 (4件)

色々と勘違いがあるようでスイマセン。


これでどうでしょうか?

Sub count()
  Dim i, j
  Dim BLK
  
  With ActiveSheet
    For i = 1 To .Range("B1").End(xlDown).Row
      .Cells(i, "C") = .Cells(i, "B") + 90
      .Cells(i, "D") = .Cells(i, "B") + 90
      BLK = 0
      '90日後の1日前からA列値が"注射"でない日を三つカウントするまで日付を遡る
      For j = i + 89 To 1 Step -1
        If .Cells(j, "A").Value <> "注射" Then
          BLK = BLK + 1
        End If
        .Cells(i, "D") = .Cells(i, "D") - 1
        If BLK = 3 Then Exit For '注射ではない日を3個カウントしたので遡る処理を中止
      Next
    Next
  End With
End Sub

この回答への補足

ありがとうございます。私自身混乱しているので一度要件を整理しなおします。90日というのはコードで作る必要がなくなったのでとにかくC列に入っている日付から3日前倒すがA列に特定文字があれば休みとし稼動日のみ3日前倒す を考えてます 色々すみません サンプルで別のを作ってみましたがなかなか・・・・
Sub count()
Dim i As Long
Dim j As Long
Dim lastrow As Long
Dim ctr As Long

lastrow = Range("D12").End(xlDown).Row

’For i = 12 To lastrow
’ Cells(i, .Value = DateAdd("d", 30, Cells(i, 4).Value)
’Next

For i = 12 To lastrow
j = lastrow

Do While Cells(i, .Value <> Cells(j, 4).Value
j = j - 1
If j = 0 Then Exit Sub
Loop


Do While ctr < 4
If InStr(1, Cells(j - 1, 7).Value, "病院", 1) = 0 Then
ctr = ctr + 1
End If
j = j - 1
Loop

Cells(i, 11).Value = Sheets("Sheet1").Cells(j, 4).Value

ctr = 0
Next
End Sub

補足日時:2008/06/12 01:08
    • good
    • 0

ANo.2です。


> もし、注射が存在すれば数に関係なく1日だけ遡るのであればEnd Ifの次行にExit Forを入れてください。
次行ではなく前行の間違いでした。
    • good
    • 0

> ・・・としたいのですがその3日の間A列に”注射”が入っていたら


ここが少しわかりにくいですね
1/1の90日後(3/31)の3日前である3/28~3/30の3日間と言うことでしょうか?
3/28横に"注射"とあれば3/27になるというのはわかるのですが、29日にも"注射"とあれば、3/26日になるのでしょうか?
仮にそのようだとして私ならマクロとしては
Sub count()
  Dim i, j
  With ActiveSheet
  For i = 1 To .Range("B1").End(xlDown).Row
    .Cells(i, "C") = .Cells(i, "B") + 90 '90日後の日付を格納
    .Cells(i, "D") = .Cells(i, "B") + 87 '90-3日後の日付を格納
    '1日前から3日前までの間に注射があれば、その分日付を遡る
    For j = 1 To 3
      If .Cells(i + 90 - j, "A") = "注射" Then
        .Cells(i, "D") = .Cells(i, "D") - 1
      End If
    Next
  Next
  End With
End Sub
もし、注射が存在すれば数に関係なく1日だけ遡るのであればEnd Ifの次行にExit Forを入れてください。

※個人的に日数加算はDateAddよりも単純に日数を加減した方が分かりやすいのでこうしました。

またこの程度であればマクロでなくともワークシート関数のみでも可能です。
C1に =B1+90
注射の数分遡る場合
D1に =B1+87-(COUNTIF(OFFSET(A1,87,0,3,1),"注射"))
注射があれば1日だけ遡る場合
D1に =B1+87-IF(ISERROR(MATCH("注射",OFFSET(A1,87,0,3,1)),0,1)
あとは下にコピー
    • good
    • 0
この回答へのお礼

説明が下手ですみません
その3日だけ作りたいのではないのでプログラムしているのですが基本的にA列どこにでも注射は入ります。
注射のはいったセルを抜かして3日間をカウントしたいといった感じです。稼働日計算のようなものだとは思いますが・・・
ですので例えばB92に4月1日があったときC92は6月30日でD92は6月27日が入ってますが該当日付のA列に注射が入っていればその日を飛ばして3日前を計算したいので6月26日、もし注射という文字列が連続で入っていればそれだけさかのぼっていきます

お礼日時:2008/06/11 07:11

If Cells(i, 1) = "注射" Then


Cells(i, 4).Value = DateAdd("d", -4, Cells(i, 3).Value)
Else
Cells(i, 4).Value = DateAdd("d", -3, Cells(i, 3).Value)
End If

ではダメでしょうか。

この回答への補足

説明が下手ですみません
その3日だけ作りたいのではないのでプログラムしているのですが基本的にA列どこにでも注射は入ります。
注射のはいったセルを抜かして3日間をカウントしたいといった感じです。稼働日計算のようなものだとは思いますが・・・
ですので例えばB92に4月1日があったときC92は6月30日でD92は6月27日が入ってますが該当日付のA列に注射が入っていればその日を飛ばして3日前を計算したいので6月26日、もし注射という文字列が連続で入っていればそれだけさかのぼっていきます

補足日時:2008/06/11 07:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!