VBA・SQL|Accessでエラーを無視して処理を実行する方法

エクセルVBA VBAでSQL



VBAを使ったSQLでAccessを処理しようとしたときに、エラーを無視したまま処理を続けたいという質問がよく来ます。

エラーを無視したまま処理を実行するには、

On Error Resume Next

を使います。

今回は、VBA・SQLでAccessを操作する際にエラーを無視した状態で処理を続ける方法について徹底的に解説していきますね☆



VBA・SQL|Accessでエラーを無視して処理を実行する方法

エラーが出ても処理を実行するにはResume Nextステートメントを使用する

Resume Nextステートメントを使用すると、エラーが発生した行の次の行から処理を再実行します。

つまり、本来エラーで処理が止まってしまうところをエラーを無視して処理を継続することができるのです。

基本的には、エラーを無視したい処理を「On Error Resume Next」の直後に記載します。

そして、その処理の最後に「On Error GoTo 0」を記載します。

使用する形は以下のとおりです。

~エラーを無視しない処理~
On Error Resume Next
【エラーを無視したい処理】
On Error GoTo 0
~エラーを無視しない処理~

実際には、以下のサンプルコードのように使います。

サンプルでは、VBA・SQLでAccessファイルを指定して開く際に、テーブル「hoe、hoe2、hoe3」があったら同テーブルを削除するという処理です。

【エラーを無視して処理を継続するサンプルコード】

Dim myConn As New ADODB.Connection
Dim myRs As New ADODB.Recordset

'選択したファイルを取得する
Dim OpenFileName As String
ChDir ThisWorkbook.Path
OpenFileName = Application.GetOpenFilename("アクセス,*.accdb")

'キャンセル処理
If OpenFileName = "False" Then
  MsgBox "キャンセルしました"
  Exit Sub
End If

myConn.Open _
"Provider=Microsoft.ACE.OLEDB.16.0;" & _
"Data Source=" & OpenFileName & ";"

On Error Resume Next  '以下の処理ではエラーを無視する
''テーブルhoe、hoe2、hoe3があったら、削除する。
Dim sSql As String
sSql = "DROP TABLE hoe,hoe2,hoe3;"
myConn.Execute sSql
myConn.Close: Set myConn = Nothing
On Error GoTo 0 'エラー無視を解除する

以上のように、本来はもし削除対象のテーブルが見つからなかった場合にはエラーになって処理が止まってしまうところです。

したがって、if文などで「テーブルが有った場合にテーブルを削除する」という処理をしなくてはならないところ、On Error Resume Nextを使用するとテーブルの有無を確認する必要がなくなるのです。

また、終わったら「On Error GoTo 0」 でエラー無視を解除することを忘れないようにしてください。

そうしないと、本来エラーになってしまうところで、エラーを無視したまま処理が続いてしまい、欲しい結果が得られないという問題が発生します。

それに加え、エラーの箇所が特定できなくなることになってしまいます。

したがって、On Error GoTo 0でエラー無視を解除するのを忘れたままコードを最後まで実行しないようにしてくださいね。

まとめ

今回は、VBAを使ったSQLでAccessを処理しようとしたときに、エラーが出ても無視したまま処理を続ける方法について説明しました。

エラーを無視したまま処理を実行するには、以下の形になります。

On Error Resume Next

~エラーを無視したい処理~

On Error GoTo 0

のように記載します。

また、On Error Resume Next でエラー無視状態にしたら、その後On Error GoTo 0でエラー無視状態を解除することを忘れないようにしてください。

VBA・SQLを使う以上、エラー対処方法は永遠の課題ですので、ぜひ覚えておいてくださいね☆




VBAでSQL
ブイサバ【Excel VBAサバイバル】~とりあえずここに来れば解決できる~

コメント

タイトルとURLをコピーしました