Excel VBA スタンダード・エラー対策について

Excel VBAのエラー対策はについて解説します。

エラーを解決するためには、問題の原因を理解し、適切な手段を使って修正することが大切です。また、プログラミングのスキルや知識を磨くことで、エラーの解決能力も向上させることができます。

 

Excel VBA 記述エラー

「記述エラー」は、コードに誤りがある場合に発生します。VBAがコードを理解できない部分があるときに表示するエラーです。

 

記述エラー対応

エラーメッセージを読んで、どの行やどの部分でエラーが発生しているかを確認します。

コードの該当箇所を見直し、スペルミス、文法エラー、または正しくないコードがないか確認して修正します。

 

Excel VBA 論理エラー

「論理エラー」は、コンパイル時のエラーや実行時のエラーを指します。コードの文法的な誤りや、実行時における不整合などの問題によって発生します。

 

論理エラー対応

コードを書いたり実行したりする際に、エラーメッセージや実行時の問題を確認します。

コンパイル時のエラーは、コードを実行する前にVBAが識別するエラーです。VBEでコードを書いているときに表示します。

実行時のエラーは、コードの実行中に発生します。コードが実行されている途中でエラーが見つかった場合に表示します。

 

実行時エラーは、実行中に条件が満たされなかったり、予期しない状況が発生した場合に発生します。条件分岐のロジックや変数の値などを確認して問題を特定します。

 

Excel VBA On Error GoTo

On Error GoToステートメントは、Excel VBA でエラーが発生した場合に特定のエラーハンドリング処理を実行するための方法です。

 

On Error GoToの使い方

On Error GoToステートメントを使って、エラーが発生したときに実行するエラーハンドリング用のラベルを指定します。このラベルは、エラーが発生したときにジャンプする先の場所を示します。

一般的に、エラーハンドリングのコードはプロシージャの先頭で定義します。

エラーが発生したら、指定されたラベルにジャンプしてエラー処理を実行します。エラー処理が完了したら、通常のコードの流れに戻ります。

 

On Error GoTo ステートメントは、エラーが発生した場合に指定されたラベルに移動するため、エラーハンドリング処理が正しく動作しないと予期せぬ問題が発生する可能性があります。

エラーハンドリングのコード内で、エラーが修復されない場合や無限ループに陥る可能性がある場合には、注意が必要です。

 

Sub Example()
    On Error GoTo ErrorHandler ' エラー発生時の処理先を指定

    Dim x As Integer
    x = 0
    Debug.Print 10 / x ' ゼロで割り算するエラーを発生させる

ExitSub:
    Exit Sub ' サブルーチンの正常終了
ErrorHandler:
    ' エラー処理を行うコード
    Debug.Print "エラーが発生しました。"
    Resume ExitSub ' 正常終了処理にジャンプする
End Sub

On Error GoTo ErrorHandlerで、エラーが発生したら ErrorHandler ラベルにジャンプし、エラー処理を実行します。エラー処理が終了したら Exit Sub にジャンプしてプロシージャを終了します。

 

Excel VBA Resume Next

On Error Resume Next は、エラーが発生した場合にエラーを無視し、次の行に進むVBAステートメントです。エラー処理を無視し、実行を継続する際に使用されます。

 

On Error Resume Nextの使い方

On Error Resume Next を使用すると、エラーが発生した場合にそれを無視し、次の行のコードを実行します。

エラー処理を一時的に無効にするため、プログラムを続行させたい特定のセクションに配置します。

 

On Error Resume Next を使用すると、実行時にエラーが発生しても、エラーチェックが行われず、実行が続行されます。

エラーが発生してもその後のコードが実行されるため、バグの原因となる可能性があります。エラーを無視するため、エラーが発生した原因を特定しにくくなることがあります。

 

Sub Example()
    On Error Resume Next ' エラーハンドリングを無視する

    Dim x As Integer
    x = 0
    Debug.Print 10 / x ' ゼロで割り算するエラーを発生させる

    ' エラーを無視して処理が続行されるため、次のコードが実行される
    MsgBox "エラーが発生しましたが、次のコードが実行されました。", vbInformation
End Sub

On Error Resume Next を使用して、ゼロで割るエラーを無視し、次の行のコードが実行されることを示しています。エラーが発生しても、エラー処理が実行されずに次のコードが実行します。

 

Excel VBA Errオブジェクト

Errオブジェクトは、エラーが発生したときに、そのエラーの詳細情報を格納します。

 

Errオブジェクト

Err.Number
エラー番号を取得します。

Err.Description
エラーの説明を取得します。

 

Errオブジェクトは、エラーが発生しない限り情報を持ちません。エラーが発生した後にのみ有効な情報が格納されます。

エラーが発生すると、Err オブジェクトは自動的に情報を取得しますが、その情報は直前のエラー情報に関連付けられます。新しいエラーが発生した場合、Err オブジェクトは新しいエラーの情報で上書きされます。

 

Sub Example()
    On Error Resume Next ' エラーハンドリングを設定

    ' エラーを意図的に発生させる
    Dim x As Integer
    x = 0
    Debug.Print 10 / x ' ゼロで割り算するエラーを発生させる

    If Err.Number <> 0 Then ' エラーチェック
        MsgBox "エラーが発生しました:" & Err.Description, vbExclamation
        Err.Clear ' エラー情報のクリア
    End If
End Sub

On Error Resume Next ステートメントでエラーハンドリングを設定し、Err オブジェクトを使ってエラーをチェックしています。Err.Number と Err.Description を使用して、エラー情報を取得してメッセージボックスで表示しています。また、Err.Clear メソッドを使って、エラー情報をクリアしています。

 

エラー対策

プログラムを作成する際に、エラーを予防するための対策として次のポイントがあります

1.オブジェクトの存在確認
ブックやシートが存在するかどうかを確認します。存在しない場合、エラーが発生する可能性があります。Workbook や Worksheet オブジェクトが存在するか確認し、存在しない場合の処理を追加します。

2.データの正当性を確認
データが正しい形式であることを確認します。例えば、文字列が数字を含んでいるか、データが欠落していないかなど、データの整合性を確認することでエラーを予防できます。

3.条件分岐や例外処理の追加
条件分岐文 (If...Then) や例外処理 (On Error) を追加して、予期せぬ状況に対処できるようにします。存在しないオブジェクトへのアクセスや操作などのエラーが発生した場合、適切に処理することができます。

4.変数やオブジェクトの初期化
変数やオブジェクトを使用する前に、適切に初期化しましょう。未定義の値を使用することはエラーの原因となります。

5.エラーハンドリング
On Error Resume Next や On Error GoTo を使用して、エラーが発生した場合の処理を設定します。具体的なエラーコードやメッセージを取得し、対処法を決定します。

これらの対策でエラーを発生させる可能性を低減し、より安定したプログラムを作成できます。

たとえば、ProtectStructureプロパティはブックが保護されているかチェックできます。ブックが使える状態が前提であればチェック不要ですが、エラー対策で使えるプロパティです。

 

Excel VBA データクレンジング

データクレンジングは、データの変換、形式の統一、データの標準化など、異なるデータソースからのデータを一貫性のある形式に変換するプロセスを指します。クレンジングは、データの正確性を高め、統一されたデータセットを作成するために行われます。

 

データクレンジングは、不正確な、欠落している、重複しているなどの不適切なデータを修正または削除するプロセスです。これにより、データの品質が向上し、分析や処理の正確性が確保されます。クレンジングは、データを整理して一貫性を保つために行われます。

 

StrConv 関数

StrConv 関数は、文字列を別の形式に変換するために使用されます。

第1引数には変換したい文字列を指定し、第2引数には変換の種類を示す定数を指定します。

 

Sub Example()
    Dim i As Long
    For i = 1 To 8
        Cells(i, 2).Value = StrConv(Cells(i, 1).Value, vbWide)
    Next i
End Sub

vbWide は、文字列を全角に変換します。これは、半角文字を全角に変換する場合や、半角カタカナを全角カタカナに変換する場合などに使用します。

 

Sub Example()
    Dim i As Long
    For i = 1 To 8
        Cells(i, 2).Value = StrConv(Cells(i, 1).Value, vbNarrow)
    Next i
End Sub

vbNarrow は、文字列を半角に変換します。全角文字を半角に変換する場合や、全角カタカナを半角カタカナに変換する場合などに使用します。

 

Replace関数

Replace関数は、文字列内で特定のテキストを別のテキストに置き換えるための関数です

Replace(元の文字列, 検索文字, 置換文字)

 

Sub Example()
    Dim originalString As String
    Dim replacedString As String
    
    originalString = "This is an example text."
    replacedString = Replace(originalString, "example", "sample")
    Debug.Print replacedString ' "This is an sample text."
End Sub

originalStringの文字列から example を sample に置き換えて、replacedString に新しい文字列を格納しています。

 

DateSerial関数

DateSerial関数は、年、月、日を指定して日付を生成する関数です。

DateSerial(年, 月, 日)

 

不正な日付に対してエラーを返しません。たとえば、13 月を指定すると、次の年の 1 月になります

 

Sub Example()
    Dim myDate As Date
    myDate = DateSerial(2023, 12, 31)
    Debug.Print myDate ' "2023/12/31"と出力されます
End Sub

DateSerial 関数を使用して、2023 年 12 月 31 日を myDate に代入しています。

 

NumberFormatプロパティ

NumberFormatプロパティは、セルの書式を設定するためのプロパティで、セルに表示される数値の表示形式(通貨、日付、小数点以下の桁数など)を指定します。

表示形式の設定は、Excel の表示形式のコードを使用します。

Range("A1").NumberFormat = "書式コード"

 

Sub Example()
    Range("A1").NumberFormat = "0.00" ' A1セルの数値を小数点以下2桁で表示
    Range("B1").NumberFormat = "yyyy/mm/dd" ' B1セルの日付を表示形式で表示
    Range("C1").NumberFormat = "0.00%" ' C1セルの数値をパーセンテージ形式で表示
End Sub

NumberFormat を使用して A1 セルを小数点以下 2 桁の数値、B1 セルを日付形式、C1 セルをパーセンテージ形式に設定しています。

Excel VBAのスキルを活かして、開発者としてのキャリアを築いてみませんか?

当サイトでは、Excel VBAエキスパート認定資格取得に向けた情報を提供しています。興味がある方は、ぜひ以下の問題集からチャレンジしてみてください。

 

ExcelVBAエキスパートベーシック
仕事の効率をあげるためにExcelVBAを利用する人が対象の問題集です。


ExcelVBAエキスパートスタンダード

ExcelVBAの開発を仕事にする人が対象の問題集です。