Excel VBA 質問スレッド №2068 (解決済)
基準を判定するマクロ
投稿者 : ブラック職場 投稿日時 : 2025/01/11(Sat) 18:19:48 OS : 未指定 EXCEL : 未指定
お力添えいただきたく質問させていただきます。
仮定で部活を開催する基準があります。(下記、基準画像)
そして職員の出勤表があります。(下記、出勤表画像)
職員の出勤表が、基準を満たしているか判定するマクロを、ご指導賜りますようお願い申し上げます。
当方ではこの基準を判定できるマクロがどうしても作れなく、ご教授いただけますと幸いです。
基準画像:https://ibb.co/ZSvvL25
出勤表画像:https://ibb.co/5xBWPHd
お力添えいただきたく質問させていただきます。
仮定で部活を開催する基準があります。(下記、基準画像)
そして職員の出勤表があります。(下記、出勤表画像)
職員の出勤表が、基準を満たしているか判定するマクロを、ご指導賜りますようお願い申し上げます。
当方ではこの基準を判定できるマクロがどうしても作れなく、ご教授いただけますと幸いです。
基準画像:https://ibb.co/ZSvvL25
出勤表画像:https://ibb.co/5xBWPHd
スポンサーリンク
[返信 1] Re : 基準を判定するマクロ
投稿者 : てらてら 投稿日時 : 2025/01/12(Sun) 06:20:51
こんにちは。
私見ですが、このようなケースでは、条件に合っているものを拾うのではなく。
条件に合わない時点でエラーを出すようにした方が楽だと思います。
以下のコードでは、 GoTo LABEL の所は全て不適合のケースです。
条件の解釈が曖昧なので、完全ではないと思いますが、プログラムの組み立て方として参考にしてみてください。
こんにちは。
私見ですが、このようなケースでは、条件に合っているものを拾うのではなく。
条件に合わない時点でエラーを出すようにした方が楽だと思います。
以下のコードでは、 GoTo LABEL の所は全て不適合のケースです。
条件の解釈が曖昧なので、完全ではないと思いますが、プログラムの組み立て方として参考にしてみてください。
Sub macro() Dim i As Long, cnt As Long, total As Long Dim b As Boolean b = False 'データセット Range("I6:J11").ClearContents If Range("F4") = "〇" Then Range("I6") = 1 If Range("F5") = "〇" Then Range("I7") = 1 cnt = 0 For i = 6 To 9 If Cells(i, "F") = "〇" Then cnt = cnt + 1 If Not InStr(Cells(i, "E"), "非常勤") > 0 Then Range("J8") = "常勤" End If Next i Range("I8") = cnt cnt = 0 For i = 10 To 13 If Cells(i, "F") = "〇" Then cnt = cnt + 1 If Not InStr(Cells(i, "E"), "非常勤") > 0 Then Range("J9") = "常勤" End If Next i Range("I9") = cnt cnt = 0 For i = 14 To 15 If Cells(i, "F") = "〇" Then cnt = cnt + 1 If InStr(Cells(i, "E"), "専従") > 0 Then Range("J10") = "専従" End If Next i Range("I10") = cnt cnt = 0 For i = 16 To 17 If Cells(i, "F") = "〇" Then cnt = cnt + 1 If InStr(Cells(i, "E"), "専従") > 0 Then Range("J11") = "専従" End If Next i Range("I11") = cnt '// 判定条件 '校長、教頭のどちらかがいなければNG If Range("I6") = 0 And Range("I7") = 0 Then GoTo LABEL '① cnt = Range("I8") + Range("I9") 'コーチ、看護師が専従なら含める If InStr(Range("J10"), "専従") > 0 Then cnt = cnt + 1 If InStr(Range("J11"), "専従") > 0 Then cnt = cnt + 1 If cnt < 2 Then GoTo LABEL '② total = Application.WorksheetFunction.Sum(Range("I6:I11")) 'コーチ、看護師が専従なら含める If InStr(Range("J10"), "専従") > 0 Then total = total + 1 If InStr(Range("J11"), "専従") > 0 Then total = total + 1 If total / 2 < cnt Then GoTo LABEL '③ If InStr(Range("J8"), "常勤") = 0 And InStr(Range("J9"), "常勤") = 0 Then GoTo LABEL '定員 Dim 必要人員 As Long 必要人員 = ((Range("I3") - 1) \ 5) + 1 If total < 必要人員 Then GoTo LABEL b = True LABEL: If b = False Then Range("I14") = "NG" Else Range("I14") = "OK" End If End Sub
[返信 2] Re : 基準を判定するマクロ
投稿者 : ブラック職場 投稿日時 : 2025/01/12(Sun) 21:17:34
てらてら様。
ありがとうございます。
すごすぎて、まだ全てを理解できておりませんが、感謝申し上げます。
理解できていないなか恐れ入りますが、
Dim 必要人員 As Long
必要人員 = ((Range("I3") - 1) ¥ 5) + 1
If total < 必要人員 Then GoTo LABEL
の内容ですが、この計算式の意図をお聞きしてもよろしいでしょうか?
また定員が11名~15名になった場合、人員基準3名に対応した内容になるのでしょうか?
お手数をおかけしますがよろしくお願いいたします。
てらてら様。
ありがとうございます。
すごすぎて、まだ全てを理解できておりませんが、感謝申し上げます。
理解できていないなか恐れ入りますが、
Dim 必要人員 As Long
必要人員 = ((Range("I3") - 1) ¥ 5) + 1
If total < 必要人員 Then GoTo LABEL
の内容ですが、この計算式の意図をお聞きしてもよろしいでしょうか?
また定員が11名~15名になった場合、人員基準3名に対応した内容になるのでしょうか?
お手数をおかけしますがよろしくお願いいたします。
[返信 3] Re : 基準を判定するマクロ
投稿者 : てらてら 投稿日時 : 2025/01/13(Mon) 09:52:44
>この計算式の意図をお聞きしてもよろしいでしょうか?
以下のテストプログラムを実行すればわかると思います。
定員に対して必要人員を計算しています。
定員=10 必要人員=2
定員=11 必要人員=3
定員=12 必要人員=3
定員=13 必要人員=3
定員=14 必要人員=3
定員=15 必要人員=3
定員=16 必要人員=4
定員=17 必要人員=4
定員=18 必要人員=4
定員=19 必要人員=4
定員=20 必要人員=4
>定員が11名~15名になった場合、人員基準3名に対応した内容になるのでしょうか?
そうです。
>この計算式の意図をお聞きしてもよろしいでしょうか?
以下のテストプログラムを実行すればわかると思います。
定員に対して必要人員を計算しています。
Sub test() Dim 必要人員 As Long Dim i As Long For i = 10 To 20 '定員 必要人員 = (i - 1) \ 5 + 1 Debug.Print "定員=" & i & " 必要人員=" & 必要人員 Next i End Sub
定員=10 必要人員=2
定員=11 必要人員=3
定員=12 必要人員=3
定員=13 必要人員=3
定員=14 必要人員=3
定員=15 必要人員=3
定員=16 必要人員=4
定員=17 必要人員=4
定員=18 必要人員=4
定員=19 必要人員=4
定員=20 必要人員=4
>定員が11名~15名になった場合、人員基準3名に対応した内容になるのでしょうか?
そうです。
[返信 4] Re : 基準を判定するマクロ
投稿者 : ブラック職場 投稿日時 : 2025/01/13(Mon) 19:49:10
てらてら様。
大変勉強になりました。
本当にありがとうございます。
てらてら様。
大変勉強になりました。
本当にありがとうございます。
[返信 5] Re : 基準を判定するマクロ
投稿者 : ブラック職場 投稿日時 : 2025/01/13(Mon) 23:31:52
てらてら様。
すいませんが、どうしても解読できなく質問させてください。
total = Application.WorksheetFunction.Sum(Range("I6:I11"))
'コーチ、看護師が専従なら含める
If InStr(Range("J10"), "専従") > 0 Then total = total + 1
If InStr(Range("J11"), "専従") > 0 Then total = total + 1
If total / 2 < cnt Then GoTo LABEL
このコードの、
If total / 2 < cnt Then GoTo LABEL
はどんな意図なのでしょうか?
totalの値を2で割ったものがcntより小さい場合に処理をする、ことだと思うのですが。
なぜtotalの値を2で割り、cntと比較されるのか。
お気を悪くさせてしまったなら申し訳ありませんが、どうしても自身では解決できなく。
申し訳ありませんが、ご教授ください。
てらてら様。
すいませんが、どうしても解読できなく質問させてください。
total = Application.WorksheetFunction.Sum(Range("I6:I11"))
'コーチ、看護師が専従なら含める
If InStr(Range("J10"), "専従") > 0 Then total = total + 1
If InStr(Range("J11"), "専従") > 0 Then total = total + 1
If total / 2 < cnt Then GoTo LABEL
このコードの、
If total / 2 < cnt Then GoTo LABEL
はどんな意図なのでしょうか?
totalの値を2で割ったものがcntより小さい場合に処理をする、ことだと思うのですが。
なぜtotalの値を2で割り、cntと比較されるのか。
お気を悪くさせてしまったなら申し訳ありませんが、どうしても自身では解決できなく。
申し訳ありませんが、ご教授ください。
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
( 処理日時 : 2025-01-25 11:29:57 )