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

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

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

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

Access

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

Q&A

解決済

3回答

2595閲覧

空っぽかどうかわからない変数を空っぽにする方法

neet_studier

総合スコア21

VBA

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

Access

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

0グッド

0クリップ

投稿2018/03/16 05:28

エクセルVBAで、あるACCESSファイルに接続しテーブル内容を編集し、また、別のエクセルファイルの内容も自ファイルに取り込むプロシージャを作成しています。このプロシージャのエラー発生時の動作をどう書けばいいのか困っています。

Public Sub ExRead() On Error GoTo Err Dim ReadBook As Workbook, exf As String, acf As String Dim rdst As Worksheet Dim con As New ADODB.Connection Dim conStr As String exf = 読込対象のエクセルファイルのパス   Set myst = ThisWorkbook.Worksheets("読込情報")   Set ReadBook = Workbooks.Open(exf)   Set rdst = ReadBook.Worksheets("読み取らせ情報") (略)読み込んで自ファイル内シートに取り込み   Set rdst = Nothing   ReadBook.Close acf = 接続対象のアクセスファイルのパス   conStr = "Provider =Microsoft.ACE.OLEDB.12.0;Data Source = " & acf   con.Open (conStr) Dim rs As New ADODB.Recordset rs.Open "tbl1", con, adopenkeyset, adlockoptimistic (略)Accessのテーブルを編集するコード   Set rs = Nothing   con.Close   Exit Sub Err:   Set rdst = Nothing   ReadBook.Close   Set rs = Nothing   con.Close MsgBox Err.Description End Sub

このようなコードなんですが、この、Err:部分を適切な形にしたいです。
というのも、実行中、どの段階でエラーが発生するのかわからないのですが、もし読込対象エクセルファイルが開いたままだったり、アクセスファイルとつながった状態だとまずいので、エラー発生だとしても、ちゃんと閉じてから終了したいです。
おそらく、「もしReadbookが開いていたら」とか「もしconが接続中なら」という条件を書けばいいのでしょうが、どう書いていいのかわかりません。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

使い終わったら、片付けるのは作法(マナー)ですよね。
でも大事なのは、マナーに期待する事ではなく、使う時に使える状態にする事(初期化)です。

で、質問は後片付けの方法についてですが、前提としてスコープ有効期間について理解しておいた方が良いかと思います。

以下有効期間から抜粋

有効期間の終了
プロシージャが終了すると、そのローカル変数の値は保持されません、およびVisual Basic自らのメモリを解放します。 次回、プロシージャを呼び出すすべてのローカル変数は新しく作成、再初期化します。

クラスまたは構造体のインスタンスが終了すると、非共有変数には、自らのメモリおよびその値が失われます。 クラスまたは構造体の新しいインスタンスごとでは、作成し、非共有変数を再初期化します。 ただし、Shared変数は、アプリケーションの実行が停止されるまで保持されます。

上記にある通り、エラー出口で殊更プロシジャー内のローカル変数の掃除を行う必要はありません。
考慮する必要があるのはグローバル変数等です。
メモリ開放などの意味もあるので、初期化して良いものはインスタンスの破棄(Nothing)は行った方が良いですね。

投稿2018/03/16 07:21

sazi

総合スコア25138

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

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

ExcelVBAer

2018/03/16 07:29

表題は変数の解放のように書かれてますが、 開いたブックが開かれたままなら閉じる、とか終了処理系の話のようです。
sazi

2018/03/16 08:17

成程、bookについて書かれてますね。あまり意識していませんでした。 確かにステータス系については、きっちり後始末する必要がありますね。
neet_studier

2018/03/16 21:21

ご回答ありがとうございました。 実際に試しましたが、たしかに、別ブックを開いたエクセルが開きっぱなしになってしまうところだけが困ってしまいましたが、教えていただいたとおり、もっと有効期間について学ぼうと思います。 「ステータス系」という言葉もはじめて知りました。 ありがとうございました。
guest

0

ベストアンサー

ちゃんとやるならこんな感じでしょうか。
基本的には、オブジェクトが生成されているか確認し、更にオープンしてたら閉じるって感じでしょうか。

VBA

1Err: 2 ' Workbook 3 If Not (ReadBook Is Nothing) Then 4 ReadBook.Close 5 Set ReadBook = Nothing 6 End If 7 8 ' Worksheet 9 If Not (rdst Is Nothing) Then 10 Set rdst = Nothing 11 End If 12 13 ' Recordset 14 If Not (rs Is Nothing) Then 15 If rs.State > adStateClosed Then 16 rs.Close 17 End If 18 Set rs = Nothing 19 End If 20 21 ' Connection 22 If Not (con Is Nothing) Then 23 If con.State > adStateClosed Then 24 con.Close 25 End If 26 Set con = Nothing 27 End If

ワークシートはそこまで気を使わなくてもよいような気がします。
レコードセットもコネクションを閉じれば、関連するものを全て破棄してくれるようなことが書いてあるので不要かもしれません。
https://msdn.microsoft.com/ja-jp/library/cc364123.aspx

Close メソッドを使って Connection オブジェクトを閉じると、その接続に関連するアクティブな Recordset オブジェクトもすべて閉じます。

投稿2018/03/16 07:02

ttyp03

総合スコア16996

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

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

0

めんどくさがり屋さんでしたら、以下の方法でどうでしょう。
Dim ErrMsg As String
ErrMsg = Err.Description
On Error Resume Next
Set rdst = Nothing
ReadBook.Close(False)
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
On Error GoTo 0
MsgBox ErrMsg

投稿2018/03/16 05:40

ExcelVBAer

総合スコア1175

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

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

neet_studier

2018/03/16 21:17

ご回答ありがとうございました。 on error goto resume つまり、「ダメでも次へ」としておいて、それから変数を空にするってのをひとつひとつやる、ってことですね。 まったくその発想はありませんでした。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問