関数は自分で作る

「IF関数を書く」チョット待った!!

ワークシート関数IFが使えるということは「条件分岐」OKです。ならVBAでIf Thenも書けます。

優良可の第二弾。IF関数と比較もします。

問題:設備、取扱、法規の3つの問題があり全体の合計が6割以上で合格。ただし、3つのどれか40より低い点数があると不合格になる。

以下は数式バーに書いたIF関数の計算式です。テーブルを使っているのでセル番地ではなく項目名になります。それにしてもセルの中に入れる時に何度もセルの指定が必要ですね。

=IF(SUM(テーブル[@[設備]:[法規]])<180,”不”,IF([@設備]<40,”不”,IF([@取扱]<40,”不”,IF([@法規]<40,”不”,”合”))))

以下は、標準モジュールに書いたユーザー定義関数/カスタム関数/自作関数を使っている状態、数式バーの状態です。セルの指定は3つですから使いやすい。

=hanntei([@設備],[@取扱],[@法規])

以下を標準モジュールに書いています。文書になっているので読みやすい。コメントも簡単に書けます。

Function hanntei(setu, tori, hou)
    If setu + tori + hou < 180 Then
        hanntei = "不"
    Else
        hanntei = "合" '以下の判定前にとりあえず合
        If setu < 40 Then hanntei = "不" 'Thenの内容が簡素なら一行の方が見やすい
        If tori < 40 Then hanntei = "不"
        If hou < 40 Then hanntei = "不"
    End If
End Function

書いたユーザー定義関数がなくならないように、マクロが有効なブックで保存が必要です。

以下は、サンプルの表の作成とIF関数の入力をするマクロ

Sub 表作成()
   If VBA.MsgBox("選択しているワークシートに上書きします!!!", vbOKCancel) = VBA.vbCancel Then Exit Sub

   If ActiveSheet.ListObjects.Count = 1 Then ActiveSheet.ListObjects(1).Delete

    Range("A1").Select
    ActiveCell.FormulaR1C1 = "名前"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "ナマエ"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "設備"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "セツビ"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "取扱"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "トリアツカイ"
    Range("D1").Select
    ActiveCell.FormulaR1C1 = "法規"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "ホウレイ"
    Range("E1").Select
    ActiveCell.FormulaR1C1 = "判定"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "ハンテイ"

    Range("A2").Select
    ActiveCell.FormulaR1C1 = "名前1"
    ActiveCell.Characters(1, 2).PhoneticCharacters = "ナマエ"
    Range("A2").Select
    Selection.AutoFill Destination:=Range("A2:A8"), Type:=xlFillDefault
    Range("A2:A10").Select
    
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "56"
    Range("C2").Select
    ActiveCell.FormulaR1C1 = "87"
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "87"
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "76"
    Range("C3").Select
    ActiveCell.FormulaR1C1 = "76"
    Range("D3").Select
    ActiveCell.FormulaR1C1 = "89"
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "54"
    Range("C4").Select
    ActiveCell.FormulaR1C1 = "67"
    Range("D4").Select
    ActiveCell.FormulaR1C1 = "34"
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "90"
    Range("B5").Select
    ActiveCell.FormulaR1C1 = "89"
    Range("C5").Select
    ActiveCell.FormulaR1C1 = "78"
    Range("D5").Select
    ActiveCell.FormulaR1C1 = "67"
    Range("B6").Select
    ActiveCell.FormulaR1C1 = "56"
    Range("C6").Select
    ActiveCell.FormulaR1C1 = "45"
    Range("D6").Select
    ActiveCell.FormulaR1C1 = "67"
    Range("B7").Select
    ActiveCell.FormulaR1C1 = "48"
    Range("C7").Select
    ActiveCell.FormulaR1C1 = "68"
    Range("D7").Select
    ActiveCell.FormulaR1C1 = "43"
    Range("B8").Select
    ActiveCell.FormulaR1C1 = "23"
    Range("C8").Select
    ActiveCell.FormulaR1C1 = "67"
    Range("D8").Select
    ActiveCell.FormulaR1C1 = "87"
    Range("C8").Select
    ActiveCell.FormulaR1C1 = "98"
    
    Range("B2").Select
    Application.CutCopyMode = False
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$e$8"), , xlYes).Name = _
        "テーブル"
        
    Range("e2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(SUM(テーブル[@[設備]:[法規]])<180,""不"",IF([@設備]<40,""不"",IF([@取扱]<40,""不"",IF([@法規]<40,""不"",""合""))))"
'エラーになったら<の4箇所を半角文字にして下さい。
End Sub

モバイルバージョンを終了