Evaluate()の謎へようこそ
MSDN Office Developer Reference (2013) Documentation には次のように書かれています。
角かっこ ("[A1:C5]" など) を使用することは、文字列引数を指定して Evaluate メソッドを呼び出すことと同じです。
そこで、非常に単純なコードを実行して、Microsoft の Evaluate()メソッドのドキュメントがどれほど正確かを確認しました。
驚くべきことではありませんが、一貫した結果ではありますが、奇妙な結果が得られます。
注: +内の 4 つのコマンドをそれぞれ実行します。それぞれの呼び出しの違いを見てくださいImmediate Window
CTRLG。各 MsgBox が 2 回表示される組み込みのバグに注意してください。それを覚えておいて、混乱しないでください...
このコードをモジュールに貼り付けます
Private Sub SleepESub()
Application.Wait Now + TimeValue("0:00:20")
MsgBox "w8'd "
End Sub
次に、これらの 4 つのコマンド (一度に 1 つ) をイミディエイト ウィンドウで実行します。
? Evaluate ("SleepESub()")
? [SleepESub()]
? [SleepESub]
? SleepESub
最初の 2 つはコードをすぐに実行します。私にとっては、彼らがコードを評価したことを意味します。3番目のもの(ドキュメントによると)はそうあるべきですが、モジュールの本体とEvaluating
同じようには機能しません。イミディエイト ウィンドウは、モジュールの本体内からの同じ呼び出しを行っていますが、サブを呼び出しているかのように実行されます。4 番目の呼び出しである通常の場合と同様に待機します。
ここで私が見逃していることを誰かが説明できますか? 回線番号 3 は適切な呼び出しではありませんか? または、サブ自体への呼び出しを評価しますか(それが理にかなっている場合)Error 2023
20 seconds
Call SleepESub()
Evaluation
更新:
一部の人々は、私がここで評価していることを誤解していると思います。これは高度なトピックであることを心配しないでください。(許してください... )
より良いアイデアを得るために、即時ウィンドウとモジュール本体の結果を比較できます。このコードを試してください:
' Run each of the calls separately
' in a module's body and compare it with
' the previous calls from the Immediate Window
Sub ModuleBody()
Evaluate ("SleepESub()")
'[SleepESub()]
'[SleepESub]
'SleepESub
End Sub