Excelマクロ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オブジェクトのプロパティでRangeオブジェクトを返します。以下ヘルプより Offsetプロパティ 指定された範囲からのオフセットの範囲を表すRangeオブジェクトを返します。
値渡し、参照渡しについて(ByVal,ByRef)
ByValが値渡し、ByRefが参照渡しです。ここまでは、どこにでも書いてありますし、なんとなく理解していても、実際の活用がなかなか出来ない事が多いようです。使用例を通じて、理解して下さい。上記のsample1を実行すると、2,3の順にメッセージ表示されます。
最終行・最終列の取得方法(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は書けない場合もあります。ですので結論から言えば書きたければ書けば良いし書きたくなければ書かなくて良い。
ユーザー操作を制限する(Locked,Protect,ScrollArea)
ユーザーにあちこち触られたくない時や、操作していて迷子にならないように、操作できるセルを徹底的に限定してしまおうというものです、無用なセルはクリックもできない、スクロールすることもできなくします。以下の手順になります。セルのロック→シートの保護→ScrollAreaの設定 順に説明します。
シートに数式を設定する時のセル参照の指定方法
シートに計算結果ではなく、計算式を設定する場合の、セル参照の記述方法について解説します、マクロVBAでは多くの場合、計算結果をセルに入れる事が多いのですが、時に計算式を設定する必要があります、その時の、セル参照の記述が以外に面倒なものです。下の表で説明していきます。


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

Byte配列と文字コード関数について|VBA技術解説(8月20日)
PowerQueryの強力な機能をVBAから利用する方法|VBA技術解説(8月4日)
練習問題31(セル結合を解除して値を埋める)|VBA練習問題(7月30日)
練習問題30(マトリックス→リスト形式)|VBA練習問題(7月25日)
Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



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

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


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




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