こんにちは、自称Excel通ブロガーのmasa(@ masa)です。
最近はExcelで関数を自作できることを知ったので作り方と自作例を紹介したいと思います。後述しますがマクロでなく、自作関数とすることと自体にもメリットがあるんです!
中々マニアックな内容ですが良かったらお付き合いください|ω・`)
とりあえず、エディターを起動させるためにAltを押しながら、 F11を押します(エディター起動のショートカットキー)。
標準モジュールに以下のコードを貼り付けます。
Function w(cel As Variant)
w = cel * 2
End Function
解説
①関数名:w
関数名:wと定義しています。例えば=average(B2:B10)のaverageに該当する部分です。
関数名:wの機能はFunction~End Functionで定義しています。
②(cel As Variant)
celは自分で定義した名前に過ぎないのですが、役割としては関数の括弧の中を示しています。
=2*(A1)
上記の式のA1という計算の対象範囲のセルに該当するのがcelになります。
そしてcelという変数の型はめんどくさいのでVariantとしておきます。
③関数名:wの機能
以下がwの機能の全てです。
w = cel * 2
wは、cel(対象範囲のセル)を2倍する関数です。
w = cel *2 と =2*(対象範囲のセル、例えばA1など) は完全に一致します。
実装
こんな感じです。繰り返しになりますが、wは対象範囲を2倍する関数となっています。
自作関数の作り方まとめ
- 関数は定義することで自作できる。
- Functionの直後で関数名(今回はw)を定義できる。
- 対象とするセル名(今回はcel)を定義し、その型を宣言する。
- 関数の中身を関数名(今回はw)から始まり、セル名(今回はcel)で表現する。
関数を作ること自体の手順は以上になります。
これで工夫次第で無限に関数を作ることができます。
そもそもマクロと自作関数の違いは?
冒頭で「マクロでなく、自作関数とすることと自体にもメリットがある」と書きましたがこのことについて少し掘り下げてみましょう。
マクロ
中身や処理過程は作成した人しか理解できないし、修復もできないし、一度実行すると「元に戻る」ことができない。
自作関数
中身や処理過程は作成した人でなくても分かるし、最悪、使わなければいい。また、関数なので「元に戻る」ことができる。
つまり、自作関数を使うとマクロ特有の「作成者でなければ扱いづらくて、使用するのが危険である」というマイナスの特性を和らげることができるのです。
余談ですがマクロと関数の使い分けとして、基本的にExcelは自分個人で完結しない場合は、マクロは使用せずに関数でなんとかするのが基本です。理由は自分以外の人がマクロを修正、追加することができない場合が多いためです。
せっかく作り込んだExcelなのに使われなくなったらどうしようもないので極力「誰でも使えるように」関数で解決するのがベターです。
自作例①(数値入力の省略)
難易度:☆☆☆☆★
Function pai(i As Variant)
pai = 3.1415 * i
End Function
職業柄、円周率(π)を3.1415とすることが多いので3.1415と入力する手間を省くために関数:paiを自作定義してみました。
▼実施例です。
自作例②(関数式入力の省略)
難易度:☆☆☆★★
Function ave(i As Variant)
ave = WorksheetFunction.Average(i)
End Function
Excel関数のAverageと完全に同じ機能です。しかし、Averageは使用頻度の割に文字列が長いということで入力を省略できるよう関数をaveで定義してみました。
▼実施例です。
自作例③(有効数字3桁を返す関数)
難易度:☆☆★★★
Function eee(i As Variant)
If i >= 100 Then
eee = Format(i, "0")
ElseIf i >= 10 Then
eee = Format(i, "0.0")
ElseIf i >= 0 Then
eee = Format(i, "0.00")
End If
End Function
職業柄、有効数字3桁で表示することが多いので作りました。桁数いちいち調整するのめんどくさいし。
Formatは四捨五入する関数で、””の中の形式で返してくれるVBA関数です。
このコードの意味は100以上であれば整数とし、10以上であれば小数点1桁とし、1以上であれば小数点2桁とするという意味です。
▼実施例です。
注意点
関数のコードを埋めているExcelが立ち上がっていないと#NAME?となるので注意が必要になります。
おわりに
マクロと関数の中間にあるような感じで使い方次第で汎用性が高まる機能のように思いました。
今一度違いを書いておきます。
と、今日はここまでです。便利な関数を作ったら加筆しようと思います。
関連記事