目次
ユーザー定義関数に関するチュートリアルのシリーズを続けています。 前回の記事では、カスタム関数について知り、その作成と使用方法を学びました。 このマニュアルでは、これらの関数の使用に関する詳細と、UDFとVBAマクロの違いについて見ていきます。
このチュートリアルでは、次のことを学びます。
この記事がUDFの知識を高め、ExcelワークブックでUDFをさらに効果的に使用するための一助となれば幸いです。
UDFとMacroは同じものですか?
ユーザー定義関数とVBAマクロは、VBAエディターで作成しますが、両者の違いや優先すべき点は何でしょうか?
最も重要な違いは、関数が計算を行い、マクロが何らかの動作を行うことです。 ユーザー定義関数は、通常のExcel関数と同様にセル内に記述する必要があり、その実行結果、セルが何らかの値を返します。 同時に、他のセルの値や、現在のセルのいくつかのプロパティ(特に、,ただし、条件付き書式でカスタム関数を使用することは可能です。
UDFとVBAマクロの動作は異なります。 例えば、Visual Basic EditorでUDFを作成する場合、最初に以下のようなステートメントを作成します。 機能 で終了します。 エンドファンクション マクロを記録するときは、次のようなステートメントから始めます。 サブ で終了します。 End Sub.
Visual Basicのすべての演算子がUDFの作成に使用できるわけではありません。 このため、マクロの方が汎用的なソリューションと言えます。
マクロは、ユーザー定義関数とは異なり、ユーザーが引数を渡す必要はありません(また、引数を受け取ることもできません)。
マクロのコマンドの中には、セルのアドレスや書式要素(例えば色)を使用できるものがあります。 セルの移動、行や列の追加や削除、セルの書式を変更すると、簡単にマクロを「壊す」ことができます。 マクロの動作を知らない同僚とファイルを共有すると、特にその可能性が高くなります。
例えば、完全に動作するマクロを含むファイルがあるとします。 この数式は、セルA1からA4のパーセンテージを計算します。 マクロは、これらのセルの色を黄色に変更します。 アクティブセルにパーセンテージの書式が設定されます。
もし、あなたや他の人が新しい行を挿入しようとすると、マクロはA4セル(UDFの4,1パラメータ)の値を探し続け、失敗してエラーを返します。
この場合、ゼロによる除算(新しく追加された行に値がない)が原因でエラーが発生します。 マクロが例えば合計を実行した場合、単に間違った結果を得ます。 しかし、あなたはそれを知ることはできません。
マクロとは対照的に、ユーザー定義関数はそのような不都合な事態を引き起こすことはありません。
下図は、UDFを使った同じ計算のパフォーマンスです。 ここでは、入力セルをワークシートの任意の場所に指定でき、それを変更する際に予期せぬ問題に直面することはありません。
C3で以下の式を書きました。
=UDF_vs_Macro(A1,A4)
その後、空白の行を挿入すると、上のスクリーンショットのように計算式が変わりました。
これで、入力セルや関数のあるセルをどこにでも移動させることができます。 結果は常に正しく表示されます。
また、UDFは入力セルの値が変わると自動的に更新されるという利点もあります。 マクロを使用する場合は、常にすべてのデータが最新であることを確認する必要があります。
この例を念頭に置くと、私は可能な限りUDFを使用し、その他の計算以外の動作にのみマクロを使用することが望ましいと思います。
UDFを使用する際の制限とデメリット
UDFの利点は前述したが、簡単に言えば、Excelの標準関数では不可能な計算ができることだ。 また、長く複雑な計算式を保存して、一つの関数にして使うことができる。 そして、複雑な計算式を何度も書く必要がない。
では、UDFの欠点についてもう少し詳しく説明しましょう。
- UDFを作成するには、VBAを使用する必要があります。 これは、ユーザーがExcelマクロと同じ方法でUDFを記録することができないことを意味します。 UDFを自分で作成する必要があります。 しかし、以前に記録したマクロコードの一部をコピーして関数に貼り付けることができます。 ただ、カスタム関数の制限を認識する必要があります。
- UDFのもう一つの欠点は、他のExcel関数と同様に、単一の値またはセルの値の配列しか返せないことです。 単に計算を行うだけです。
- 同僚とワークブックを共有する場合は、必ずUDFを同じファイルに保存してください。 そうしないと、せっかく作成したカスタム関数が同僚に使えません。
- VBAエディタで作成したカスタム関数は、通常の関数よりも処理速度が遅くなります。 これは特に大きなテーブルで顕著です。 残念ながら、これまでのところVBAは非常に遅いプログラミング言語です。 したがって、データが多い場合は、できるだけ標準関数を使用するか、LAMBDA関数でUDFを作成するようにしてください。
カスタムファンクションの制限。
- UDFは計算を行い値を返すものであり、マクロの代わりに使用することはできません。
- 他のセルの内容を変更することはできません(アクティブなセルのみ)。
- 例えば、AB123のように、Excelのネイティブ関数名やセルアドレスと一致する名前は使用できません。
- カスタム関数の名前にスペースを含めることはできませんが、アンダースコア文字を含めることは可能です。 ただし、新しい単語の先頭には大文字を使用することが好ましい方法です(例:GetMaxBetween)。
- UDFは、セルをワークシートの他の領域にコピー&ペーストすることはできません。
- アクティブなワークシートを変更することはできません。
- UDFは、アクティブなセルの書式を変更することはできません。 異なる値を表示するときにセルの書式を変更したい場合は、条件付き書式を使用する必要があります。
- 追加で本を開くことはできません。
- Application.OnTimeを使用したマクロの実行には使用できません。
- マクロレコーダーを使用してユーザー定義関数を作成することはできません。
- 関数は表示されません。 デベロッパー>マクロ ダイアログを表示します。
- 作成した関数はダイアログボックスに表示されます( 挿入機能 として宣言されている場合のみ,関数のリストに追加されます。 公開 (特に断りのない限り、これがデフォルトです)。
- として宣言された関数は、すべて プライベート は機能一覧には表示されません。
動作がかなり遅く、使用上の制限もあるため、"このカスタム関数は何に使うの?"と思われるかもしれません。
UDFの作成方法と使い方をマスターすれば、Excelでデータを扱う能力を大幅に向上させることができます。
私にとっては、カスタム関数は時間の節約になります。 あなたは、独自のUDFを作成してみましたか? Excelの基本関数よりも気に入りましたか? コメントで議論しましょう :)