質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

1982閲覧

[ExcelVBA]ADODB.Openした後にErr.Raiseした際、Close処理は行われるか

woria

総合スコア36

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/12/05 07:33

編集2019/12/06 00:32

ExcelVBAでAccessに接続するため、以下のようなクラスを作ります。

vba

1Const strFilePath = "C:hoge.accdb" 2 3Dim adoCn As Object 4Dim adoRs As Object 5 6Private Sub Class_Initialize() 7 Set adoCn = CreateObject("ADODB.Connection"): adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFilePath & ";" 8 Set adoRs = CreateObject("ADODB.Recordset") 9End Sub 10 11Public Function strTarget(Syain_ID As String, System_Name As String) 12 13 Dim strSQL As String 14 strSQL = "SELECT Target FROM テーブル1 WHERE Syain_ID = '" & Syain_ID & "' AND System_Name = '" & System_Name & "'" 15 16 adoRs.Open strSQL, adoCn 17 18 If Not adoRs.EOF Then 19 strTarget = adoRs!Target 20 Else 21 Err.Raise 1234, , "社員番号:" & Syain_ID & vbCrLf & "システム名:" & System_Name & vbCrLf & "以上を満たすレコードが見つかりません" '←これが起こった場合 22 End If 23 24End Function 25 26Private Sub Class_Terminate() 27 adoRs.Close: Set adoRs = Nothing 28 adoCn.Close: Set adoCn = Nothing 29End Sub

その後、標準モジュールで以下のコードを書きます。

vba

1Sub main() 2 With New Class1 3 MsgBox .strTarget("1234567", "System") 4 End With 5End Sub

AccessにSQLを投げ、0件の場合その時点でErr.Raiseをしたいのですが、この場合Class_Terminateに書かれたClose処理は行われるでしょうか。
また、もしClose処理が行われる前にマクロが終了した際の悪影響についてもご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答の前に確認ですが
strPassword = adoRs!Target

strTarget = adoRs!Target
の書き間違いですよね?


Classの場合、参照が終わると自動的に解放されます。その時にTerminateイベントが呼び出されます。途中でErr.Raiseでエラーを発生させても同じです。(エラー画面で終了させたり律せとしたらだめですが)

質問のコードでは、'With New Class1'でクラスを生成してますので、End With で参照が終了するのでそこでTerminateが呼び出されてClose処理も実行されます。もし、On Error GoTo ・・・でエラーハンドラに跳んでプロシージャを抜けた場合はその時点でClassが解放されてTerminateが実行されます。
下記のようにデバッグコードを埋め込んで動作を確認してみてはどうでしょうか。

vba

1Private Sub Class_Terminate() 2 adoRs.Close: Set adoRs = Nothing 3 adoCn.Close: Set adoCn = Nothing 4 Debug.Print "Close処理完了" 5End Sub

以下、質問の回答ではないですが、結果が0件というのはエラーではないのでErr.Raiseで処理するというのは違和感があります。
strTarget の返り値を Null または "" にするのがいいように思います。
例えば、Accessの標準のDLookup関数なんかも該当データがない場合Nullを返します。

投稿2019/12/06 00:29

編集2019/12/06 00:48
hatena19

総合スコア34064

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

woria

2019/12/06 00:40

回答ありがとうございます。 今回の処理はMsgboxで"レコードが見つからない"と出し、NullをReturnするようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問