Excel VBA スタンダードの暗記項目まとめ【第九章 エラー対策】
この記事では、VBAエキスパートの「Excel VBA スタンダード」の受験用に、暗記すべき項目について、公式の試験範囲の第八章をまとめました。
とくに暗記すべきところは「太文字」や「表」でまとめてあります。とくにステートメントやメソッド、プロパティについては、記述できるレベルまで仕上げておくことをおすすめします。
この記事では暗記を優先するため、解説をできるだけ省いています。学習未経験の人は、Excel VBA スタンダードの公式テキストなどで試験範囲の内容に目を通してからの利用を推奨します。
また、公式テキストに掲載されていないなど、試験に出る可能性の低い内容の解説は、基本的に割愛しています。
Excel VBA スタンダード 第九章 エラー対策
9.1 On Errorステートメント
前提知識(エラーの種類)
エラーの種類については、Excel VBA エキスパートの公式テキストに準拠して、エラーの種類を簡単に解説します。
まず、エラーは主に「記述エラー(文法エラー)」と「論理エラー」の2種類があります。
記述エラーはその名の通り、記述(文法)に誤りがある場合に発生します。「)」や「"」のつけ忘れなどです。
論理エラーはVBAの文法に誤りはないが、論理的な誤りがある場合のエラーです。論理エラーは、更にコンパイルエラーと実行時エラーにわけられます。
コンパイルエラーは、マクロが実行される前のコンパイル段階で発生するエラーです。
実行時エラーは、マクロ実行中に論理的な誤りがあり発生するエラーになります(参照先が存在しないなど)。
エラーの分類は、Excel VBA スタンダードの公式テキストをもとに解説しましたが、ネットで検索すると、記事によって定義が少しずつずれています。
例えば、分け方が「論理エラー」「実行時エラー」「コンパイルエラー」となっており「論理エラーは、VBAはエラー無く動作するが、結果が想定と違ったものとなるエラー」として紹介しているものもあります。
また、公式テキストの「記述エラー」も、実際に動作させると「コンパイルエラー」として表示されます。
ただし、試験対策としては公式テキストの通りに覚えておくようにしましょう。
On Errorステートメント
On Errorステートは、エラーが発生した時、あらかじめ定めた命令に処理をジャンプするVBAの構文です。使用例は以下の通りです。
Sub Macro1()
On Error GoTo myError
Sheets("Sheet3").Activate
Exit Sub
myError:
MsgBox "Sheet3が見つかりません!"
End Sub
On Errorステートメントは「On Error GoTo ジャンプ先のラベル名」の形で記述します。
続く「Sheets(“Sheet3").Activate」で、Sheet3がアクティブになる処理を実行していますが、Sheet3が無い(エラーが発生した)場合、先に定めておいた「myError」のラベルに飛ぶようになっています。
また、上記の例では、エラーが発生しなかった場合は「myError」の処理を実行する前に「Exit Sub」でMacro1の処理を終了しています。Exit Subなどで処理を抜けないと、エラーが発生していない場合も「myError」が実行されてしまうので、注意が必要です。
また「On Error Resume Next」とすると、発生したエラーを無視することができます。
試験範囲外の補足。
公式テキストでは言及されていませんが「On Error Goto ジャンプ先のラベル名」の記述を一度行うと、それ以降の処理でのエラーが、対象のラベルにジャンプするようになります。
そのため、On Errorステートメントを適用したい範囲が終わったら「On Error Goto 0」と記述し、ジャンプしないよう再設定する必要がります。
エラーの内容を確認する
実行時エラーの情報は、Errオブジェクトのプロパティ格納されます。Excel VBA スタンダードの対策としては、以下の内容を暗記する必要があります。
- Numberプロパティ:エラー番号が格納されます
- Descriptionプロパティ:エラーの内容を表すメッセージが格納されます
- Clearメソッド:エラー情報をクリアします(「Err.Clear」で実行)
9.2 エラーが起きないデータに整える(2019年5月改訂で追加)
ブックの保護
ProtectStructureプロパティで、ブックの保護をしているかが確認できます。ブックの編集ができない場合、原因の一つとして考えられます。
半角・全角文字の変換(StrConv関数)
半角・全角文字の変換には、StrConv関数を使い「StrConv(変換前の文字列, 変換する文字の種類)」の形で記述します。
'全角に変換する場合
Range("A1") = StrConv(Range("A1"), vbWide)
'半角に変換する場合
Range("A1") = StrConv(Range("A1"), vbNarrow)
試験範囲外の補足。
StrConv関数という名称と、定数の接頭辞が「vb」になっていることで気づく人もいるかと思いますが、StrConv関数はExcelのオブジェクトがもつメソッドではなく、VBAで利用できる関数です。
次に紹介するReplace関数、DateSerial関数も、同様にExcelのオブジェクトが持つメソッドではありません。
不要な文字を除去する(Replace関数)
Replace関数は、文字列の置換に利用できる関数です。「Replace(変換前の文字列, 検索文字列, 置換文字列)」の形で利用します。
不要な文字を消去する場合「Replace(変換前の文字列, 削除する文字列, “")」の形で記述します。以下の例では、A1セルにある「バオバブーン」の「バオ」を削除します。
Sub Macro1()
Range("A1") = Replace(Range("A1"), "バオ", "")
End Sub
日付の操作(DateSerial関数とNumberFormatプロパティ)
DateSerial関数は、数値を日付に変換することのできる関数です。「DateSerial(年, 月, 日)」の形で記述します。
Sub Macro1()
MsgBox DateSerial(2020, 14, 50)
End Sub
上の例では「2021/03/22」と表示されます。日付や月の数が多すぎる場合、繰り上がって翌月、翌年になるよう処理されます。ちなみに、扱える範囲は1900年1月1日から9999年12月31日までです。
NumberFormatプロパティを使うと、セルの書式記号を設定できます。
「Range(“A1").NumberFormat = “yyyy/mm/dd"」のように、NumberFormatプロパティに指定したい書式を代入することで、書式の設定が可能です。
デフォルトでは文字列は左詰め、日付は右詰となるため、書式を変更した後に右詰に直したい場合は、以下ようにセルに値を代入し直します。
Sub Macro1()
Range("A1").NumberFormat = "yyyy/mm/dd"
Range("A1").Value = Range("A1").Value
End Sub
<<第八章 テーブルの操作へ | 第十章 デバッグへ>>