関数は自分で作る

mySUM関数 複数のセルを引数とする関数

SUMというワークシート関数があるが、あえて自作のmySUM関数を作る。

セルの範囲を引数で受け取る場合のユーザー定義関数の基本的な書き方は以下のようになる。

Function 関数名(引数名 As Range)
    Dim v
    For Each v In 引数名   '引数に複数のセルが入っていることを前提にしている。
         処理コード
    Next
End Function

ワークシート関数にSum関数がある。これと同じような関数をユーザー定義関数で書く。

Function mySUM(範囲 As Range)
    Dim v As Variant      ’As Variantは省略しても同じ意味
    For Each v In 範囲
        mySUM = mySUM + v
    Next
End Function

範囲のセルの値を変えたらmySUMの値も変わることを確認する。次のコードは合計数と最大値を文字列にして返す。

Function mySUM2(範囲 As Range)
    Dim s As String, i As Integer
    ReDim ar(範囲.Count) As Double 'ワークシート関数のMaxを使うための配列
    For i = 1 To 範囲.Count
        mySUM2 = mySUM2 + 範囲(i)
        ar(i - 1) = 範囲(i) '配列にも入れる
    Next
    s = "合計は" & mySUM2 & "です。最大値は" & WorksheetFunction.Max(ar) & "です。"
    mySUM2 = s
End Function
練習:myKake関数を作る。掛け算をする関数。ただし、セルの中の””は計算しないが0が入っている場合は計算する。

まず、下記のようなコードを思い付くと思う。myKakeの初期値がEmptyというバリアント型特有の値でたいていは0として扱われ永遠に0の結果を返す関数になる。

Function myKake(r As Range)
    Dim v
    For Each v In r
        myKake = myKake * v
    Next
End Function

対応が必要なのはセルが空白文字や文字列、myKakeがEmptyの時。ElseIfまで必要になる。

Function myKake(r As Range)
    Dim v
    For Each v In r
        If "" = v Then  '""の空白は何もしない
        ElseIf VBA.IsNumeric(v) Then '数値の場合
            If VBA.IsEmpty(myKake) Then 'まだmyKakeがEmptyの場合は1で掛ける
                myKake = 1 * v
            Else
                myKake = myKake * v '通常の掛け算
            End If
        End If
    Next
End Function

条件分岐が複数になると試行錯誤、条件が5,6個程度ならコードを先に書いて確認する方が早い。

令和6年9月22日追記です。

CharGPTで作ってみた。

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