はじめに
ワークシートにユーザー定義関数(Fuction プロシージャ)を含むシートをコピーするような VBA をステップ実行でデバッグするとき、シートに含まれる Function プロシージャを1セルごとにステップ実行してしまうため制御が移ったままになり、デバッグが困難になってしまう。
原因は、数式計算が自動になっているとき、ステップ実行中に再計算を行ってしまい、再計算するたびに Function プロシージャが実行されてしまうためだと考えている。
そこで、一時的に数式計算を手動とし再計算を行わないようにすることで、Function プロシージャが再実行を抑制し、デバッグを容易にすることができると考えた。
おそらく、こちらのフォーラムも同じ状況だと思われる。
Microsoft コミュニティ - Excel2010でステップインを実行中に、Functionプロシージャへ勝手に制御が移ってしまう
対処方法
1: 一時的に計算方法を手動にする
デバッグ時に計算方法が自動になっていることが今回の原因であるため、デバッグ前に計算方法を手動に設定することで防ぐことができる。
ただし、計算方法の設定が他のバグに影響する可能性や、設定を戻し忘れてしまう可能性もある。
2: VBAのコードで計算方法を手動にする
シートの再計算が予想されるコードの直前で計算方法を手動とし、直後に自動に戻すことで対処できる。
' ワークシートで利用するユーザー定義関数
Function TestFunc(val1, val2)
TestFunc = val1 + val2
End Function
' ステップ実行でデバッグしたいプロシージャ
Sub CopySheet()
' 数式計算を手動化
Application.Calculation = xlManual
' シートの再計算が予想されるコード
ActiveSheet.Copy After:=ActiveSheet
ActiveSheet.Name = "複製されたシート"
' 数式計算を自動化し、再計算
Application.Calculation = xlAutomatic
Calculate ' F5で継続実行する
End Sub
現象の再現方法
Windows 版 Excel 2016 にて動作確認を行っています。
1: VBA コードの記述
新しいブックを作成し、標準モジュールに次のコードを記述する。
' ワークシートで利用するユーザー定義関数
Function TestFunc(val1, val2)
TestFunc = val1 + val2
End Function
' ステップ実行でデバッグしたいプロシージャ
Sub CopySheet()
ActiveSheet.Copy After:=ActiveSheet
ActiveSheet.Name = "複製されたシート"
End Sub
2: ワークシートでのユーザー定義関数の利用
ワークシートにユーザー定義関数(Function プロシージャ)を利用したセルを用意する。
次の画像のように作成する。黄色に塗りつぶされたセルに TestFunc プロシージャが利用されている。
ちなみに、「数式の表示」が有効な状態では次のように表示される。
3: Excel の設定
"数式"リボンの中の"計算方法"グループの中の"計算方法の設定"を、"自動"に設定する。初期設定では自動になっている。
4: デバッグにて現象再現
CopySheet プロシージャを実行する。
通常通りの実行(F5)では特に問題は出てこないが、デバッグのためステップ実行(F8)をすると、デバッグしたい CopySheet プロシージャではなく、TestFuncプロシージャばかりをステップ実行してしまい、なかなか ActiveSheet.Name = "複製されたシート"
のコードを確認できない。
さいごに
他にも良い対処方法がないか Google 検索しましたが、私の力では見つかりませんでした。もっと他に良い方法があれば教えてください!
また、こちらの現象は、FOM出版の「よくわかる Microsoft Excel 2019/2016/2013 マクロ/VBA」で VBA を勉強している、ほかの人から質問されて遭遇したものです。VBA の自習に良い本なのでオススメです。
さらに付け加えると、そもそも Function プロシージャをワークシートから呼び出すのはやめた方がよいと思いました。マクロを有効にしないと再計算できないし。