VBA技術解説
ユーザー定義関数の作り方

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2013-06-11

ユーザー定義関数の作り方


マクロを作成して、ボタンで一括処理・・・それほどではないが、関数だけではちょっと大変、


そんな時は、ユーザー定義関数を使ってみましょう。

作り方は簡単です。

Function UserFunc(a As Variant, b As Variant) As Variant

  UserFunc = a + b
End Function


上記は、引数を足し算して返すユーザー定義関数です。


Function UserFunc

Function

これは決まり文句です。

UserFunc
これが関数の名前になります、好きな名前を付けられます。

日本語もOK。

ただし、エクセルの組み込み関数と同じ名前はダメですよ。

この関数が返す値の型を

as Variant


で定義します。

最初はとりあえず、Variantで良いです。

(a As Variant, b As Variant)

引数になります。


必要な個数だけ定義します。

型指定は内容に応じてと言う事になりますが、ほとんどの場合、セル参照になると思いますので、

型は省略(Variant)して良いでしょう。

UserFunc = a + b

関数の名前に、値を入れる事で、この関数の戻り値となります。

この部分に、必要な処理を記述します。

もちろん、全てのVBAのコードが使用可能です。


この関数の使い方

他の組み込み関数と同じです。

セルに、

=UserFunc(セル参照, セル参照)

これで使えます。

また、関数の挿入(Shift + F3)では、

「関数の分類」「ユーザー定義」に追加されます。

ここから選択することも可能です。

そして、当然、数式パレット(引数入力用のダイアログ画面)も表示されます。

IF文のネストが多くなり、もう何が何だか分からなくなってしまった等の時は、

このユーザー定義関数を作ると、ずっとすっきりしたエクセルになります。

まだ、使ったことのない人は、ぜひ一度お試しください。



同じテーマ「マクロVBA技術解説」の記事

Offset、Resizeを使いこなそう

OffsetとResizeは、エクセルVBAで非常に便利であり、ぜひ使いこなしてもらいたい機能です。Offsetはセル範囲の位置をずらし、Resizeはセル範囲のサイズを変更します。どちらも、RangeとCellsだけで記述することは可能ですが、OffsetとResizeを使う事で、簡潔にVBAを記述することができるようになります。
値渡し(ByVal)、参照渡し(ByRef)について
ByValが値渡し、ByRefが参照渡しです。ここまでは、どこにでも書いてあります。しかし、なんとなく理解できるけど、なんとなく理解できない… 結局のところ実際の活用がなかなか出来ない事が多いようです。
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
エクセルの表をVBAで扱う時は、データ部分の先頭から最終行までの、開始列から最終列まで処理する事が多いでしょう。開始行や開始列は、ほとんどの場合、見出し行や見出し列の次からになります。単純な話として、1行目に見出しがあれば、2行目から 1列目に見出しがあれば、2列目から では、ここで、最終行や最終列は、
ユーザー定義関数の作り方
セルの値について(Value,Value2,Text)
マクロVBAにおいて、セルの値を操作する事は基本の基本ですが、意外に理解できていない場合が多いようです。Value 指定されたセル範囲の値を表すバリアント型(Variant)の値を設定します。値の取得および設定が可能です。
Excelのバージョンを判断して「名前を付けて保存」
Excel2007以降とExcel2003以前ではExcelのファイルフォーマットが違います、Excel2007以降で2003以前の形式で保存したい場合に問題が発生します。Excel2007以降で普通に97-2003形式で保存するVBAコードを書くと、Excel2003以前ではエラーとなってしまいます。
空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)
空白セルの判定は、VBAにおいては頻繁に発生しますが、正しく空白セルを判定する事は以外と難しいものです。そもそも「空白」とはどのような状態なのか… これが、はっきりしない為に何が正しいのかが判然としないことが問題を複雑にしています。以下、A1セルが空白かどうか判定する方法をいくつか紹介します。
空白セルを正しく判定する方法2
空白セルの判定について、いろいろな方から意見を頂きました、やはり、空白判定は奥が深く結構難しいものとなっています。ここでは、各プロパティや関数が、セルの状態によって返す値を再確認してみます。元記事は、空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula) 上記の記事では、
Rangeオブジェクト.Valueの省略について
エクセルVBAを教えていて、これほど多く聞かれる質問はないでしょう、RangeやCellsの.Valueは省略したほうが良いか、書いた方が良いか、当然、省略出来ない場合もあれば、オブジェクトとして扱うために.Valueは書けない場合もあります。ですので、結論から言えば、書きたければ書けば良いし、書きたくなければ書かなくて良い。
シート保護でユーザー操作を制限する
ユーザーがあちこち触って計算式を壊されないようしたり、セルの境界をダブルクリックして最終行に飛んでしまい迷子になったりしないように、シートを保護して、ユーザー操作を制限します。操作できるセルを徹底的に限定します。無用なセルはクリックもできない、スクロールすることもできなくしてしまいます。
シートに数式を設定する時のセル参照の指定方法
シートに計算結果ではなく、計算式を設定する場合の、セル参照の記述方法について解説します、マクロVBAでは多くの場合、計算結果をセルに入れる事が多いのですが、時に計算式を設定する必要があります、その時の、セル参照の記述が以外に面倒なものです。下の表で説明していきます。


新着記事NEW ・・・新着記事一覧を見る

Variantの数値型と文字列型の比較|エクセル雑感(7月1日)
VBAのVariant型について|VBA技術解説(6月30日)
VBAのString型の最大文字数について|エクセル雑感(6月20日)
VBAで表やグラフをPowerPointへ貼り付ける|VBAサンプル集(6月19日)
アクティブシート以外の表示(Window)に関する設定|VBA技術解説(6月17日)
マクロ記録での色のマイナス数値について|エクセル雑感(6月16日)
ツイッター投稿用に文字数と特定文字で区切る|エクセル雑感(6月15日)
日付の謎:IsDateとCDate|エクセル雑感(6月14日)
IFステートメントの判定|エクセル雑感(6月13日)
インクリメンタルサーチの実装|ユーザーフォーム入門(6月12日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ