4

次の 2 行のコードがあります。

On Error Resume Next
myWorkbook.Sheets("x").Columns("D:T").AutoFit

マクロにステップインして行を実行するOn Error Resume Nextと、次の行myWorkbook...で次のようになります。

ここに画像の説明を入力

コンパイラが次のコード行を再開しないのはなぜですか?

On Error手続きコード全体で自由に使用されています。これをできるだけ使用しないことがベストプラクティスであることは理解していますが、このマクロの目的には合っているようです。

このSO QUESTIONを読むと、あるセットのエラートラップを別のエラートラップに含めることはできないと書かれています。コードが移動する前に、エラー トラップの 1 つのセットが「閉じられた」ことを保証するにはどうすればよいOn Error Goto 0ですか? エラー トラップをリセットしますか? リセットされた場合、次の作業が再開されないのはなぜですか?:

Sub GetAction()
Dim WB As Workbook
Set WB = ThisWorkbook

On Error GoTo endbit:
'raise an error
Err.Raise 69
Exit Sub
endbit:
On Error GoTo 0

On Error Resume Next
WB.Sheets("x").Columns("D:T").AutoFit

End Sub
4

6 に答える 6

11

On Error ...ステートメントが無視され、そのダイアログ ボックスが常に表示されるようにする VBA 設定もあります。オプションの確認/変更の詳細については、この回答を参照してください: https://stackoverflow.com/a/3440789/381588

于 2013-03-17T10:55:17.957 に答える
1

お気づきのように、同じ関数またはサブルーチン内で、それがまだアクティブである場合、On Error Resume Nextオーバーライドしません。On Error Goto ...

On Error Goto 0デフォルトのエラーハンドラを復元するのは正しいです。

例外的な状態を処理するには、 OnErrorが最も適切な方法である場合があります。私は次の構造を使用することを好みます:

On Error Resume Next

statement which might fail

On Error Goto 0

if statement has failed then ...

これによりすべてがまとめられますが、それ以外の場合は、プロシージャの最後にある一般的なエラーハンドラの方が適している場合があります。

于 2013-03-17T10:48:12.883 に答える
1

ネストされたオブジェクトを反復処理する関数/サブルーチンでは、エラー処理が VBA のドラッグになる可能性があることがわかりました。複雑な反復をより適切に処理するために私にとって有効な解決策は、オブジェクトの設定を独自の関数に分離することです。

メイン関数/サブ: set FSOfolder = SetFSOFolder(FSOobject, strFolder)

Private Function SetFSOFolder(FSO as scripting.FileSystemObject, strFolder as string) as Scripting.Folder
    on error resume Next
    set SetFSOFolder = FSO.GetFolder(strFolder)
    on error goto 0
End Function

次に、main 関数の次の行で:

if (not fsofolder is nothing) then
于 2016-06-02T13:06:10.573 に答える
-4

代わりに使用しないでくださいOn Error Resume Next。クラッシュしてはならないコードを記述してください。

注:コードがクラッシュしないことを保証することは決してないので、私はそれをどのように表現するかに注意しています. しかし、コードを使用するOn Error Resume Nextと、コードの自然な流れの一部としてクラッシュが発生します。これは間違っています。

于 2013-03-20T18:15:43.517 に答える