シート:
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 …
No.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
No.3
- 回答日時:
ANo.2です。
> もし、注射が存在すれば数に関係なく1日だけ遡るのであればEnd Ifの次行にExit Forを入れてください。
次行ではなく前行の間違いでした。
No.2
- 回答日時:
> ・・・としたいのですがその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)
あとは下にコピー
説明が下手ですみません
その3日だけ作りたいのではないのでプログラムしているのですが基本的にA列どこにでも注射は入ります。
注射のはいったセルを抜かして3日間をカウントしたいといった感じです。稼働日計算のようなものだとは思いますが・・・
ですので例えばB92に4月1日があったときC92は6月30日でD92は6月27日が入ってますが該当日付のA列に注射が入っていればその日を飛ばして3日前を計算したいので6月26日、もし注射という文字列が連続で入っていればそれだけさかのぼっていきます
No.1
- 回答日時:
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日、もし注射という文字列が連続で入っていればそれだけさかのぼっていきます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) 列 A に同じ日が2つが必要です。 1 2023/03/28 07:25
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) Sheet2からオートフィルターで売上日を抽出した件数をカウントし、その件数をSheet1のセルB1 2 2023/01/12 12:24
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
vba 2つの条件が一致したら...
-
B列の最終行までA列をオート...
-
【VBA】2つのシートの値を比較...
-
Excelで、あるセルの値に応じて...
-
VBAを使って検索したセルをコピ...
-
rowsとcolsの意味
-
データグリッドビューの一番最...
-
エクセルVBAにて =A1=B1とすれ...
-
URLのリンク切れをマクロを使っ...
-
VBAで、特定の文字より後を削除...
-
マクロ 最終列をコピーして最終...
-
マクロ 関数を使った抽出でエラ...
-
EXCEL VBAマクロについて質問です
-
VBAコンボボックスで選択した値...
-
エクセルVBAでデータをカウント...
-
エクセルVBA シートモジュール...
-
VBAでのリスト不一致抽出について
-
最終列の右へSUM関数を作成する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
エクセルVBAにて =A1=B1とすれ...
-
VBAでのリスト不一致抽出について
-
データグリッドビューの一番最...
-
マクロについて。S列の途中から...
-
VBA UserFormからの転記で
-
targetをA列のセルに限定するに...
おすすめ情報