Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
On error gotoを入れてもエラーメッセージが表示され止まる
投稿日時: 20/06/08 09:49:25
投稿者: S.Kos

みなさま、こんにちは。
 
20/06/02付け Alice87さん「On error gotoを入れてもエラーメッセージが表示され止まる場合の対処」と同じような現象に直面しました。
 
予め
Type DataBaseInfo
  UserID As String
  UserPWD As String
  ConnectStatus As Boolean
  AdCon As New ADODB.Connection
  AccessSw As Boolean
End Type
 
と定義したうえで、
 
'DB接続
Public Sub DbOpen_ByADO(DbInfo As DataBaseInfo)
  Dim conStr As String, usStr As String, psStr As String, ntStr As String
 
  On Error GoTo Con2Acs <-※1
  DbInfo.AdCon.Open "Provider=MSDASQL;Data Source=BYSQLEXPRESS", "us", "psw"
  DbInfo.AccessSw = False
  On Error GoTo 0
  Exit Sub
 
Con2Acs:
  On Error GoTo ConAcsByDef <-※2
  DbInfo.AdCon.Open "Provider=MSDASQL;Data Source=ByAccess", "us", "psw"
  DbInfo.AccessSw = True
  On Error GoTo 0
  Exit Sub
 
ConAcsByDef:
  On Error GoTo 0
  ntStr = Worksheets(paraSh).Range(netPassRng).Value
  DbInfo.AdCon.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & ntStr & ";"
  DbInfo.AccessSw = True
End Sub
と記しました。
 
SQLEXPRESSへの接続に失敗すれば、※1によって、ODBC経由でACCESSへの接続を試みます。
ここは問題なく、期待どうりに動きます。
 
ODBC経由でACCESSへの接続に失敗したとき、※2によって、ACCESSへ直接に接続したいのですが、これが巧く働きません。
 
データソース名が見つからない・・旨をメッセージして、
  DbInfo.AdCon.Open "Provider=MSDASQL;Data Source=ByAccess", "us", "psw"
で止まります。
 
続けての"On Error なんちゃら"が原因か、と思い、
 
Con2Acs:
  On Error GoTo 0
  On Error GoTo ConAcsByDef <-※2
 
も試みましたが、ダメでした。
 
心当たりのある方はおられませんか?

回答
投稿日時: 20/06/08 20:30:03
投稿者: よろずや

On Error GoTo 飛び先
 で飛んだ先では、エラー処理はできません。
 
Resume 再実行先
 で飛ばせば、エラー状態から解除されますので通常のエラー処理が可能です。
 

  On Error GoTo Con2Acs1 <-※1
  DbInfo.AdCon.Open "Provider=MSDASQL;Data Source=BYSQLEXPRESS", "us", "psw"
  DbInfo.AccessSw = False
  Exit Sub
 
Con2Acs1:
  Resume Con2Acs2
 
Con2Acs2:
  On Error GoTo ConAcsByDef1
  DbInfo.AdCon.Open "Provider=MSDASQL;Data Source=ByAccess", "us", "psw"
  DbInfo.AccessSw = True
  Exit Sub

ConAcsByDef1:
  Resume ConAcsByDef2

ConAcsByDef2:
  ntStr = Worksheets(paraSh).Range(netPassRng).Value
  DbInfo.AdCon.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & ntStr & ";"
  DbInfo.AccessSw = True
End Sub

 
こんなみっともないコードを書く位なら、
On Error Resume Next
を使った方がよろしいかと。

回答
投稿日時: 20/06/08 22:12:20
投稿者: よろずや

On Error Resume Next
を使った例

  On Error Resume Next
  DbInfo.AdCon.Open "Provider=MSDASQL;Data Source=BYSQLEXPRESS", "us", "psw"
  If Err.Number = 0 Then DbInfo.AccessSw = False : Exit Sub
 
  On Error Resume Next
  DbInfo.AdCon.Open "Provider=MSDASQL;Data Source=ByAccess", "us", "psw"
  If Err.Number = 0 Then DbInfo.AccessSw = True : Exit Sub
 
  On Error Resume Next
  ntStr = Worksheets(paraSh).Range(netPassRng).Value
  DbInfo.AdCon.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" & ntStr & ";"
  If Err.Number = 0 Then DbInfo.AccessSw = True
End Sub

投稿日時: 20/06/09 10:28:57
投稿者: S.Kos

よろずやさん、ご教示のほど感謝です。
 
>On Error GoTo 飛び先
> で飛んだ先では、エラー処理はできません。
>
これが知りたかったのです。
EXCEL-VBAのアレコレを解説するサイトは星の数ほど(?)ありますが、ナニナニはできない、との記載を見ることは稀です。
 
>On Error Resume Next
>を使った例
>
整えられたサンプルコードの提示、こちらにも重ねて御礼申し上げます。
 
ありがとうございました。
ここで閉じます。