0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VBA でステップ実行中、勝手に Function プロシージャに制御が移る現象とその対処

Last updated at Posted at 2022-08-18

はじめに

ワークシートにユーザー定義関数(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 プロシージャが利用されている。
image.png

ちなみに、「数式の表示」が有効な状態では次のように表示される。
image.png

3: Excel の設定

"数式"リボンの中の"計算方法"グループの中の"計算方法の設定"を、"自動"に設定する。初期設定では自動になっている。
image.png

4: デバッグにて現象再現

CopySheet プロシージャを実行する。
通常通りの実行(F5)では特に問題は出てこないが、デバッグのためステップ実行(F8)をすると、デバッグしたい CopySheet プロシージャではなく、TestFuncプロシージャばかりをステップ実行してしまい、なかなか ActiveSheet.Name = "複製されたシート" のコードを確認できない。

さいごに

他にも良い対処方法がないか Google 検索しましたが、私の力では見つかりませんでした。もっと他に良い方法があれば教えてください!
また、こちらの現象は、FOM出版の「よくわかる Microsoft Excel 2019/2016/2013 マクロ/VBA」で VBA を勉強している、ほかの人から質問されて遭遇したものです。VBA の自習に良い本なのでオススメです。
さらに付け加えると、そもそも Function プロシージャをワークシートから呼び出すのはやめた方がよいと思いました。マクロを有効にしないと再計算できないし。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?