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で作ってみた。