Excelのカスタム関数をデバッグする方法

  • これを共有
Michael Brown

UDFの作成方法はすでにご存知だと思いますので(そして、Excelで適用してみたこともあると思います)、もう少し掘り下げて、ユーザー定義関数が機能しない場合にどうすればよいかを見てみましょう。

カスタム関数を作成する際に、いくつかの問題を解決するために、ほとんどの場合、デバッグを実行する必要があります。 そうすれば、関数が正しく動作していることを確認することができます。

以下のようなデバッグのテクニックを探ります。

    カスタム関数を作成する場合、常に間違いを犯す可能性があります。 カスタム関数は通常、非常に複雑です。 また、すぐに正しく動作し始めるとは限りません。 式は、間違った結果または#VALUE! エラーを返すかもしれません。 Excelの標準関数とは異なり、他のメッセージは一切表示されません。

    カスタム関数の各ステートメントがどのように動作するかを段階的に確認する方法はありますか? もちろんです!デバッグはこのために使用されます。

    カスタム関数のデバッグ方法をいくつか提示しますので、自分に合った方法を選んでください。

    例として、カスタム関数 GetMaxBetween は、以前の記事で紹介した、指定された値の範囲内の最大数を計算するものです。

    Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End Function

    関数の引数は、数値が書き込まれるセルの範囲と、数値の上限値、下限値である。

    MsgBox関数を要所要所に配置する

    計算の実行を監視するために、最も重要な変数の値を画面上の適切な場所に表示することができます。 これは、ポップアップダイアログボックスを使用して行うことができます。

    MsgBox は、ユーザーに対して何らかのメッセージを表示するために使用するダイアログボックスです。

    MsgBoxの構文は、他のVBA関数と同様です。

    MsgBox(プロンプト [, ボタン ] [, タイトル ] [, ヘルプファイル, コンテキスト ])

    迅速 は必須引数で、ダイアログボックスに表示されるメッセージが含まれます。 また、個々の変数の値を表示することも可能です。

    他の引数はすべて任意である。

    [ ボタン で表示するボタンやアイコンを決めます。 MsgBox 例えば、オプション vbOkOnly のみで、その後に よっしゃー この引数を省略した場合でも、デフォルトでこのボタンが使用されます。

    [ タイトル ] - ここで、メッセージボックスのタイトルを指定します。

    言葉から実践に切り替えて、デバッグを始めてみましょう。 メッセージを表示するために、次の行を GetMaxBetween の前にユーザー定義関数 ケース エルセ 演算子を使用します。

    MsgBox vMax,, "カウント -" & i

    その結果がこちらです。

    Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = 0WorksheetFunction.Max(arrNums) End Function

    を使用しています。 ブイマックス という変数が表示され、どの数字が選択条件を満たしているかがわかるので、その中から最大値を選択することができます。 タイトルバーの「Count -」& Iという表現は、最大値を決めるためにすでに選択した数字の数を示しています。 新しい値が増えるたびにカウンターも増加します。

    UDFを設定したら、以下の数式を日付範囲に適用します。

    = GetMaxBetween (A1:A6,10,50)

    Enterボタンを押した後、以下のスクリーンショットのようなメッセージが表示されます。

    A1〜A6の範囲内で、「10より大きく50より小さい」という条件を満たす最初の数です。

    OKをクリックすると、2つ目のメッセージに14という数字が表示されます。 残りの数字は選択条件に一致しません。 したがって、この関数は終了して、2つの値のうち最大の17を返します。

    があります。 MsgBox 関数は、カスタム関数内の最も重要な場所で使用し、個々の変数の値の変化を制御することができます。 メッセージボックスは、大きな関数や多くの計算がある場合に非常に便利です。 この場合、コードのどの部分でエラーが発生したかを容易に判断することができます。

    ストップ・ポイントを決めて、ステップ・バイ・ステップで実行する

    関数のコードにブレークポイントを設定し、コードの実行を停止させることで、計算過程を段階的に追うことができます。 その際、変数の値がどのように変化するかを確認することができます。

    ブレークポイントを追加するには、一時停止するステートメントがある行にカーソルを置き、右クリックして デバッグ -> ブレークポイントのトグル また、ファンクションコードの左側にある縦長の灰色の領域で、任意の場所をクリックすることもできます。

    下のスクリーンショットにあるように、赤い丸が表示されます。 計算を停止するコードの行が赤くハイライトされています。

    これで、関数実行時にVBAエディタウィンドウが開かれ、カーソルが停止したポイントに位置するようになります。

    関数コード内の変数にマウスカーソルを合わせると、その変数の現在値を見ることができます。

    F5 を押すと、計算を継続します。

    注意:ブレークポイントの後、ステップごとに計算の進行状況を追跡することができます。 F8ボタンを押すと、VBAコードの次の1行だけが実行されます。 また、矢印の付いた黄色の線は、最後に実行されたコードの位置に移動します。

    関数の実行が再び一時停止するので、マウスカーソルを使って関数の全変数の現在値を見ることができます。

    次にF8を押すと一歩進みます。 ですから、計算が終わるまでF8を押すことができます。 また、F5を押すと次のブレークポイントまで計算を続けることができます。

    エラーが発生した場合、カーソルはコードの中でエラーが発生した箇所で停止します。 また、ポップアップでエラーメッセージが表示されます。 これにより、問題の原因を容易に特定することができます。

    指定したブレークポイントは、ファイルを閉じるまで適用されます。 再開するときは、再度設定する必要があります。 便利な方法ではないと思いませんか?

    しかし、この問題は解決することができます。 停止 ステートメントを関数コードの必要な箇所に挿入することで、ブレークポイントを使用する場合と同様にプログラムの実行を停止させることができます。

    VBAが 停止 変数の値を確認し、F5キーを押して続行します。

    または、F8キーを押して、上記のように段階的に機能を実行します。

    があります。 停止 ステートメントはプログラムの一部なので、ブレークポイントのように削除されません。 デバッグが終わったら、自分で削除してください。 または、ステートメントの前にシングルクォート(')を付けて、コメントに変えてください。

    Debug.Print演算子によるデバッグ機能

    を配置することができます。 Debug.Print この機能は,周期的に変化する変数の値をチェックするのに便利です。

    Debug.Printの性能の一例を以下のスクリーンショットでご覧いただけます。

    ステートメント Debug.Print i, vMax は、値とその序数を表示します。

    イミディエイトウィンドウには、選択された範囲から2つの数値(17と14)が表示されます。 これは、設定された限界に相当し、その中で最大値が選択されます。 数字1と2は、関数が数値を選択する2サイクルを完了したことを意味します。 先ほどの MsgBox しかし、それで機能が停止するわけではありません。

    プロシージャから関数を呼び出す

    ユーザー定義関数は、ワークシートのセルからではなく、プロシージャから呼び出すことができます。 この場合、すべてのエラーが Visual Basic Editor ウィンドウに表示されます。

    以下は、プロシージャからユーザー定義関数GetMaxBerweenを呼び出す方法です。

    Sub Test() Dim x x = GetMaxBetween(Range ( "A1:A6" ), 10, 50) MsgBox(x) End Sub

    カーソルをコードの任意の位置に置き、F5キーを押します。 関数の中にエラーがなければ、計算結果のポップアップウィンドウが表示されます。

    エラーが発生した場合、VBAエディタに対応するメッセージが表示されます。 計算は停止し、エラーが発生したコードの行は黄色でハイライトされます。 エラーが発生した場所と原因を簡単に特定することができます。

    以上で、アドインが作成され、Excelに追加され、その中のUDFが使えるようになりました。 もっと多くのUDFを使いたい場合は、VBAエディタでアドインモジュールにコードを書き込んで保存すればOKです。

    カスタム関数のデバッグ方法と、ワークブックでの使用方法について説明しました。 このガイドラインがお役に立てれば幸いです。 何か質問があれば、この記事へのコメント欄にご記入ください。

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