ユーザー定義関数(自作の関数)の方がわかりやすい

if文の中にIf文がある。優良可の例。

セルの中にIF文がいくつも入れ子になっていると見にくいし、メンテナンスも難い。次図の例は、英語の点数で優、良、可、不可の評価をしている。優は80点以上、良は70点以上、可は60点以上、不可は60点より少ない。

セル内に書くワークシート関数とユーザー定義関数の比較

ワークシート関数は、同じセル番地を何度も指定することがある。この例では、セルB2の値を何度も使っている。
=IF(B2=””,””,IF(B2>=80,”優”,IF(B2>=70,”良”,IF(B2>=60,”可”,”不可”))))

一方、標準モジュールに書く関数は、=優良可(B2)で答えが出る。引数xにB2のセルを1つを渡す。

ワークシート関数のIF関数に慣れているならVBAではIf Then とElseIfを使う。優先する条件を先に書くのはワークシート関数のIFと同じです。

Function 優良可if(x)
        If "" = x Then
            優良可if = ""
        ElseIf x >= 80 Then
            優良可if = "優"
        ElseIf x >= 70 Then
            優良可if = "良"
        ElseIf x >= 60 Then
            優良可if = "可"
        Else
            優良可if = "不可"
        End If
End Function

Select Caseなら引数xの変化だけをCase 条件で書けるのでシンプルだ。Ifに慣れていると条件の書き方が違うので初めは戸惑います。

Function 優良可(x)
    Select Case x       'Select CaseはCaseの右の値だけを判断して上から順に処理する
        Case ""                 'xが空白文字の場合
            優良可 = ""
        Case Is >= 80           'xが80以上の場合
            優良可 = "優"
        Case Is >= 70           'xが70以上の場合
            優良可 = "良"
        Case Is >= 60           'xが60以上の場合
            優良可 = "可"
        Case Else               'その他
            優良可 = "不可"
    End Select
End Function

関数名が漢字なのでセルの中で入力する手間があるので「yrk」などの半角文字の関数名にするといい。

拡張して使いやすくする例 DateSerial関数の拡張

DateSerial関数は引数に(西暦の年,月,日)を入れる。入力が平成20年とか令和2年となると、西暦に変更する必要がある。時図はセルB2に年号を入れる。令和か平成かはセルB1(リストにしている)の内容で分岐処理する。令和は入力の数値に2018を、平成は1988を加算すると西暦になる。得られるデータは1900年1月1日を起点とするシリアル値(連番)です。

IF関数は1つしか使っていないので読みやすい。ユーザー定義関数にすると読みやすさとコメントなどで修正や拡張がしやすい。

やっていることは、DateSerial関数を使ってシリアル値を得る。

Function reiwaDate(y, m, d, 平成令和セル As Range)
    If InStr(平成令和セル, "平成") Then '平成令和セルの文字列に平成はあれば
         reiwaDate = VBA.DateSerial(y + 1988, m, d)
   Else '令和
        reiwaDate = VBA.DateSerial(y + 2018, m, d)
    End If
End Function
(Visited 861 times, 1 visits today)
カテゴリー: 9 セルの中で使うユーザー定義関数の作成 <VBA> パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です