VBA穴埋め問題「On Error GoToの挙動」
ツイッターで出題したVBAの問題です。
出題ツイート
【VBA問題】
さて問題です。
「にゃん」と言えるようにするには、
①に何を入れたら良いでしょうか?
✅On Error GoTo 0
✅On Error GoTo -1
✅On Error Resume Next
✅にゃんともいえない
https://twitter.com/yamaoka_ss/status/1556523203853373441
Sub main()
Dim i
On Error GoTo L1
i = 1 / 0
L1:
① '←ここにいれるステートメントは?
On Error GoTo L2
i = 1 / 0
L2:
MsgBox "にゃん"
End Sub
さて問題です。
「にゃん」と言えるようにするには、
①に何を入れたら良いでしょうか?
✅On Error GoTo -1
✅On Error Resume Next
✅にゃんともいえない
https://twitter.com/yamaoka_ss/status/1556523203853373441
正解発表
✅On Error GoTo -1
以下で解説します。
出題者としての解答
最初に言っておきますが、そもそもこんな事をしてはいけません。
1つのプロシージャー内で複数回のエラーを補足する場合は、
On Error GoToを使わずにOn Error Resume Nextを使ってください。
On Error GoTo ラベル
これが指定された後にエラー発生した場合はラベルの位置に制御が移ります。
その後に発生するエラーは補足することが出来ずに、VBAはエラー停止します。
上記の、
On Error GoTo L2
この実行でErrオブジェクトのプロパティ(NumberやDescription)はクリアされますが、
エラー処理ルーチンのアクティブな状態は解除されません。
そして、エラー処理ルーチンがアクティブの状態ではエラーが処理できません。
On Error GoTo 0
On Error Resume Next
Err.Clear
これらの命令では、エラー処理ルーチンのアクティブな状態は解除できません。
以下はVB.NETのページですが、
1つのプロシージャー内で複数回のエラーを補足する場合は、
On Error GoToを使わずにOn Error Resume Nextを使ってください。
これが指定された後にエラー発生した場合はラベルの位置に制御が移ります。
その後に発生するエラーは補足することが出来ずに、VBAはエラー停止します。
On Error GoTo L2
この実行でErrオブジェクトのプロパティ(NumberやDescription)はクリアされますが、
エラー処理ルーチンのアクティブな状態は解除されません。
そして、エラー処理ルーチンがアクティブの状態ではエラーが処理できません。
On Error Resume Next
Err.Clear
これらの命令では、エラー処理ルーチンのアクティブな状態は解除できません。
On Error GoTo 0は、エラーハンドラー(つまり、その前に実行されたOn Error)を無効にするだけです。
例外が発生したことで有効になっている例外状態を無効にすることは出来ません。
この有効になっている例外状態を無効にするには、
On Error GoTo -1
これを実行するか、もしくは当該プロシージャーを抜ける必要があります。
当該プロシージャーが他から呼ばれている場合、呼び出し元に戻った時は例外状態は無効になっています。
ただし、当該プロシージャーを抜けただけではErrオブジェクトのプロパティはクリアされません。
Errオブジェクトのプロパティをクリアするには、Err.Clearまたは新たなOn Errorの記述が必要になります。
ということで、
✅On Error GoTo -1
これが正解でした。
例外が発生したことで有効になっている例外状態を無効にすることは出来ません。
On Error GoTo -1
これを実行するか、もしくは当該プロシージャーを抜ける必要があります。
当該プロシージャーが他から呼ばれている場合、呼び出し元に戻った時は例外状態は無効になっています。
Errオブジェクトのプロパティをクリアするには、Err.Clearまたは新たなOn Errorの記述が必要になります。
✅On Error GoTo -1
これが正解でした。
サイト内の参考ページ
第60回.エラー処理(On Error)|VBA入門
マクロVBAを実行していると、エラーメッセージが表示されマクロ実行が停止してしまう事があります。マクロがエラー停止しては自動化の目的が達成されませんので、エラー停止しないようにしなければなりません。エラーが出ないようにVBAを記述出来ればそれに越したことはありませんが、一切エラーを出さないようにVBAを書くことはか…
第61回.「On Error GoTo」と「Exit Sub」|VBA入門「OnErrorGoTo行ラベル」このステートメントは、実行時エラーが発生した時に制御を指定の行ラベルに移動させるものです。マクロVBAは、エラーが発生するとその時点で停止してしまいます。VBAが実行不能となった場合には、エラー発生したVBAコードで停止します。
第62回.「On Error Resume Next」とErrオブジェクト|VBA入門「OnErrorResumeNext」このステートメントは、実行時エラーが発生してもマクロVBAを中断せずに、エラーが発生したステートメントの次のステートメントから実行を継続します。マクロVBAは、エラーが発生するとその時点で停止してしまいます。
第134回.Errオブジェクトとユーザー定義エラー|VBA入門VBA実行時には種々のエラーが発生します。実行時エラーに関する情報は、Errオブジェクトに入っていますので、VBA実行でエラー発生した場合は、Errオブジェクトを参照しエラー内容を調べることになります。Errオブジェクトの使い方と、ユーザー定義エラーの生成方法について解説します。
同じテーマ「ツイッター出題回答 」の記事
ツイッターで出したエクセルVBAのお題です。数値が入っている3つの変数を、他の変数を使わずに値を入れ替えるという問題です。問題を出したツイート 【VBA問題】 変数a,b,cに整数値が入っています。これをa>b>cとなるように値を入れ替えてください。
Rangeオブジェクトを受け取り"行数,列数"で埋めるツイッターで出したエクセルVBAのお題です。Rangeオブジェクトを受け取り、"行数,列数"の値(数式ではなく値)で埋めるVBAを書く問題です。問題を出したツイート 【VBAお題】 Rangeオブジェクトを受け取り、添付のように"行数,列数"の値(数式ではなく値)で埋めてくだ…
数式の関数の使用回数、関数名を配列で返すツイッターで出したエクセルVBAのお題です。セルに入っている計算式に使われている関数(ユーザー定義含む)を数えてみましょう、というお題になります。問題を出したツイート 【VBAお題】セルに計算式が入っています。
日付型と通貨型のValueとValue2についてツイッターでVBAに関する問題を出しました。問題としてはValueとValue2について問うもので、日付型と通貨型が問題の焦点になります。https://twitter.com/yamaoka_ss/status/1408259798357794817 VBA問題の出題ツイート 【VBA問題】 Rangeに対して、
小文字"abc"を大文字"ABC"に変換する方法ツイッターで出した「VBA問題」です。小文字"abc"を大文字"ABC"に変換する方法を可能な限り列挙してください。という問題です。。出題ツイート https://twitter.com/yamaoka_ss/status/1425799283303882758 「VBA問題…
オブジェクトのByRef、ByVal、Variantツイッターで出題した問題です。オブジェクトを引数にした場合の、ByRef、ByValの違いと、仮引数にVariantを指定した場合の動作違いを問う問題です。出題ツイート 【VBA問題】 Submain() Range("A1")=1 DimaAsRange:Seta=Range("A1…
「マクロの登録」で登録できないプロシージャーは?ツイッターで出題した問題です。マクロはボタン等に「マクロの登録」で登録して使う場合が多いです。どのようなプロシージャーかによって「マクロの登録」での登録方法を違ってきます。このやり方を知っているかどうかを問うVBA問題です。
ジャグ配列から順列を作成するツイッターで会話したので、それを実際にVBAで書いてみました。ジャグ配列(配列の要素に配列が入っている)から、要素を1つずつ取り出して全順列を作成します。競馬で言ったら、1列目、2列目、3列目を指定した3連単のようなものです。
シート内の全テーブルを1つに統合ツイッターで出題した問題です。シート内にある複数のテーブルを、1つのテーブルに結合して別シートに出力します。出題ツイート 【VBA問題】 「Sheet1」のランダムな位置に複数のテーブルがあります。(添付1) テーブルは全て同一形式(列数・ヘッダーが同じ)です。
VBA穴埋め問題「On Error GoToの挙動」数珠順列(配置に条件付き)を全て出力する
ツイッターで出したエクセルVBAの問題です。一般的には数珠順列という問題になるそうです。赤玉、白玉、青玉 それぞれの個数を決めて、配置に制限を設けた時の全ての配置パターンを出力するという問題です。出題元のツイート https://twitter.com/yamaoka_ss/status/1559809556494…
新着記事NEW ・・・新着記事一覧を見る
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。