Excel UDFが動作しない:問題と解決策

  • これを共有
Michael Brown

今回は、ワークブックでカスタム関数を使用する際に直面する問題を紹介します。 何が原因で、どのように簡単に解決できるかを紹介しようと思います。

ここでは、その内容をご紹介します。

    先ほど、カスタム関数とは何か、どのように作成し、どのように使用するかを説明しましたが、もし事前にUDFの基本的な知識を再確認する必要があると感じたら、一旦立ち止まって私の以前の記事に目を通してみてください。

    Excel UDFが再計算されないのはなぜですか?

    ワークブックに変更を加えた場合、Excelはそこにあるすべての数式を再計算するのではなく、変更されたセルにリンクされた数式のみ結果を更新します。

    しかし、これはExcelの標準関数に関するもので、カスタム関数については、ExcelはVBAコードを検証し、カスタム関数の結果に影響を与える可能性のある他のセルを特定できません。 したがって、カスタム式は、ワークブックに変更を加えても変更されない可能性があります。

    この問題を解決するためには、単に アプリケーション.揮発性 次の章では、その適用方法を順を追って説明します。

    揮発性カスタム関数と不揮発性カスタム関数

    Excelのカスタム関数は、デフォルトでは揮発性ではありません。 これは、UDFが参照するセルの値が変更された場合にのみ再計算されることを意味します。 しかし、セルの形式、ワークシート名、ファイル名が変更されても、UDFには変更が生じません。

    では、言葉から例へ。 例えば、あるセルにワークブックの名前を書き込む必要があるとします。 そのために、カスタム関数を作ります。

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    ここで、次のようなケースを考えてみましょう。 カスタム式 =WorkbookName() しばらくして、ファイル名を変えて保存することにしました。 しかし、セルの値を見てみると、変わっていません。 まだ、古いファイル名が残っていて、それはもう正しいものではありません。

    この関数には引数がないので、(ワークブックの名前を変えて閉じ、再び開いたとしても)再計算は行われません。

    注:ファイル内のすべての関数を再計算するには、Ctrl + Alt + F9 のショートカットを使用することができます。

    もっと簡単な方法はないでしょうか? ワークシートが変わるたびに計算式を再計算するようにするには、一行追加する必要があります。 以下のコードを関数の先頭に貼り付けてください。

    アプリケーション.揮発性

    つまり、あなたのコードは次のようになります。

    Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    これで、UDFは揮発性となり、ワークシート内のセルが再計算されたり、ワークブックに変更があると、自動的に再計算されます。 ファイル名を変更すると、すぐにその更新を確認することができます。

    注意:揮発性関数が多すぎると、Excelの動作が遅くなることに留意してください。 何しろ、複雑な計算を行ったり、大きなデータ範囲に対して継続的に操作するカスタム関数が多すぎるのですから。

    ですから、ボラティリティは本当に必要なところだけに使うことをお勧めします。

    カスタムファンクションが使用できない理由

    カスタム関数の名前の最初の文字を入力すると、標準のExcel関数と同じように、入力セルの横のドロップダウンリストに表示されます。

    しかし、必ずしもそうなるとは限りません。 どのような間違いが、このような状況を引き起こすのでしょうか。

    Excel 2003-2007をお使いの場合、UDFはドロップダウンリストに表示されません。 そこには標準関数だけが表示されます。

    しかし、新しいバージョンのエクセルを使っていても、うっかりやってしまいそうなミスがもう一つあります。

    カスタム関数は、ModulesというVBAの標準モジュールに記述する必要があります。 関数コードを記述するために新しいモジュールを追加すると、すべてのモジュールが記述されたModulesフォルダが自動的に作成されます。

    次のスクリーンショットでは、カスタム関数コードが ThisWorkbook と共に "Microsoft Excel Objects" モジュールに含まれていることが分かります。

    ポイントは、カスタム関数をワークシートやワークブックのコードエリアに置いてはいけないということです。 この場合、関数は動作しません。 また、関数のドロップダウンリストにも表示されません。 したがって、コードは常にフォルダー モジュール .

    Excelカスタム関数のヘルプテキストが表示されない

    もう一つの問題は、カスタム関数を貼り付けたときに表示されるヒントです。 標準の関数を使用する場合、関数とその引数のツールチップが常に表示されます。 しかし、UDFの場合はどうでしょうか。

    カスタム関数がたくさんあると、それぞれの関数がどんな計算をするのか覚えるのは至難の業です。 どの引数を使えばいいのかを覚えるのはもっと大変です。 備忘録として、カスタム関数の説明を用意しておくといいと思います。

    これには Application.MacroOptions 関数だけでなく、各引数の説明を関数ウィザードウィンドウに表示するのに役立ちます。 このウィンドウは、数式バーのFxボタンをクリックしたときに表示されます。

    では、このようなヒントをUDFに追加する方法を見ていきましょう。 前回は、指定した範囲内の最大の数値を検索するカスタム関数GetMaxBetweenを見ました。 これは、数値の範囲、検索する最大値と最小値という3つの引数を取ります。

    次に、このカスタム関数に説明を追加します。 これを行うには、以下のように Application.MacroOptions コマンドを使用します。 GetMaxBetween 関数を使用する場合は、次のコマンドを実行します。

    Sub RegisterUDF () Dim strFuncName As String '登録したい関数名 Dim strDescr As String ' 関数自体の説明 Dim strArgs () As String ' 関数の引数の説明 ' GetMaxBetween関数を登録 ReDim strArgs (1 To 3) ' 関数の引数の数 strFuncName = "GetMaxBetween" strDescr = "指定範囲の最大数" strArgs (1) = "登録したい関数" strDim strArgs (2) = '指定範囲の引数の数" strRequired = '登録したい関数, ' ;=' ;='指定範囲の最大数' ;='='='='指定範囲の引数の数"数値の範囲" strArgs (2) = "間隔の下限" strArgs (3) = "間隔の上限" Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub

    または

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "指定範囲の最大数" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "Range of numeric values" , _ "Lower interval border" , _ "Upper interval border" ) End Sub

    バリアブル str FuncName は関数の名前です。 strDescr - 関数の説明です。 strArgs 変数には各引数のヒントが含まれる。

    Application.MacroOptionsの4番目の引数は何だろうと思われるかもしれません。 このオプションの引数の名前は カテゴリー で、そのカスタム関数が使用されるExcel関数のクラスを示します。 GetMaxBetween () Category引数を使用しない場合、カスタム関数は自動的に「User Defined」カテゴリに配置されます。

    関数コードをモジュールウィンドウに貼り付けます。

    を使用するための設定をすべて行うコマンドです。 エフエックス ボタンをクリックします。 GetMaxBetween() 関数を使用します。

    を使用してセルに関数を挿入しようとした場合。 インサート機能 ツールを使用すると、そこにあなたの GetMaxBetween 関数は、「マイ・カスタム・ファンクション」カテゴリにあります。

    セルに関数名を入力し始めるだけで、選択可能な関数のドロップダウンリストにカスタム関数が表示されます。

    それから ファンクションウィザード をFxボタンでクリックします。

    ヒント:CRTL + A のキーコンビネーションで、関数ウィザードを開くこともできます。

    での ファンクションウィザード をクリックすると、関数の説明と第1引数のヒントが表示されます。 第2、第3引数にカーソルを合わせると、それらのヒントも表示されます。

    これらのヒントのテキストを変更したい場合は、以下の値を変更します。 strDescr strArgs の変数を使用します。 レジスタUDF() コードを実行します。 レジスタUDF() コマンドを再度実行します。

    行った設定をすべて取り消し、機能の説明を消去したい場合は、このコードを実行してください。

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    もうひとつ、カスタム関数の入力時にヒントを表示する方法があります。 関数名を入力してから、Ctrl + Shift + A を押します。

    =GetMaxBetween( + Ctrl + Shift + A

    関数のすべての引数のリストが表示されます。

    残念ながら、ここでは関数とその引数の説明は表示されません。 しかし、引数の名前がかなり情報量が多いので、それも参考になるかもしれません。 それでも、ないよりはましでしょう :)

    Excelの標準的な関数のように動作するUDFのインテリセンスを作成するには、もう少し手間がかかります。 残念ながら、Microsoftはオプションを提供していません。 現在、唯一の解決策はExcel-DNA IntelliSense拡張です。 開発者のWebサイトに詳細が掲載されています。

    これらのガイドラインが、カスタム関数が動作しない、あるいは思い通りに動作しない場合の問題解決に役立つことを願っています。 しかし、それでもUDFが動作しない場合は、コメント欄に問題を正確に記述してください。 私たちはそれを解明し、解決策を見つけるよう努力します;)

    Michael Brown は、ソフトウェア ツールを使用して複雑なプロセスを簡素化することに情熱を注ぐ熱心なテクノロジー愛好家です。テクノロジー業界で 10 年以上の経験があり、Microsoft Excel と Outlook、さらに Google Sheets と Docs のスキルを磨いてきました。 Michael のブログは、彼の知識と専門知識を他の人と共有することに特化しており、生産性と効率を向上させるためのわかりやすいヒントとチュートリアルを提供しています。経験豊富なプロフェッショナルであろうと初心者であろうと、Michael のブログでは、これらの重要なソフトウェア ツールを最大限に活用するための貴重な洞察と実践的なアドバイスを提供しています。