Excel VBA 質問スレッド №2068 (解決済)

基準を判定するマクロ

投稿者 : ブラック職場     投稿日時 : 2025/01/11(Sat) 18:19:48     OS : 未指定     EXCEL : 未指定
お力添えいただきたく質問させていただきます。
仮定で部活を開催する基準があります。(下記、基準画像)
そして職員の出勤表があります。(下記、出勤表画像)
職員の出勤表が、基準を満たしているか判定するマクロを、ご指導賜りますようお願い申し上げます。
当方ではこの基準を判定できるマクロがどうしても作れなく、ご教授いただけますと幸いです。

基準画像:https://ibb.co/ZSvvL25
出勤表画像:https://ibb.co/5xBWPHd

スポンサーリンク
[返信 1] Re : 基準を判定するマクロ
投稿者 : てらてら     投稿日時 : 2025/01/12(Sun) 06:20:51
こんにちは。
私見ですが、このようなケースでは、条件に合っているものを拾うのではなく。
条件に合わない時点でエラーを出すようにした方が楽だと思います。
以下のコードでは、 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名に対応した内容になるのでしょうか?
お手数をおかけしますがよろしくお願いいたします。

[返信 3] Re : 基準を判定するマクロ
投稿者 : てらてら     投稿日時 : 2025/01/13(Mon) 09:52:44
>この計算式の意図をお聞きしてもよろしいでしょうか?

 以下のテストプログラムを実行すればわかると思います。
定員に対して必要人員を計算しています。

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と比較されるのか。
お気を悪くさせてしまったなら申し訳ありませんが、どうしても自身では解決できなく。
申し訳ありませんが、ご教授ください。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-01-25 11:29:57 )
タイトルとURLをコピーしました