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

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

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

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

解決済

VBAのSet 変数 = Nothingの対象とタイミングをご教示ください

Unknown2030
Unknown2030

総合スコア33

VBA

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

3回答

0評価

0クリップ

333閲覧

投稿2022/06/14 15:09

編集2022/06/15 12:31

VBA初心者の新人プログラマーです。
VBAのSet 変数 = Nothingの対象とタイミングをご教示ください。

①Set 変数 = Nothingの対象
変数に対して、処理後にメモリ解放が必要とざっくり理解しております。
変数の中でも「参照を行っている変数」に対して必要とのことですが、その判断はコードの作り次第なのでしょうか?
例として、下記コードを作成しました。質問箇所のご確認をお願いします。

VBA

'変数の宣言 Dim ws_sheet1 As Worksheet Dim str_name As String Dim str_kaisya As String Dim cn As Object 'ADO接続に使用する変数 Dim rs As Object 'ADO接続に使用する変数 On Error GoTo myError '変数のset Set ws_sheet1 = Worksheets("明細") Set str_name = ws_sheet1.Range("A1").Value Set str_kaisya = "TEST会社" 'ADO接続・処理箇所は省略します rs.Open '省略... cn.Open '省略... rs.Close cn.Close '●●●●質問箇所●●● '解放が必要と思われる変数 Set ws_sheet1 = Nothing Set rs = Nothing Set cn = Nothing '解放が必要でしょうか? Set str_name = Nothing Set str_kaisya = Nothing myError: '解放が必要と思われる変数を記載 MsgBox "エラー" Exit Sub End Sub

②Set 変数 = Nothingのタイミング
End sub直前にメモリ解放を必要性はあるのでしょうか?
まず自身のメモリ解放についての認識ですが、誤りがある場合ご指摘をお願いします。
参照範囲が大きい変数は、処理毎に解放を行う必要があり、End subで暗黙的にメモリ解放が行われる認識です。
上記コードのように参照範囲が大きくなく、プロシージャ間の受け渡しがない場合、メモリ解放は必要でしょうか?※ADOのObjectはほとんどの場合において必要との認識です。

ネットで調査したところ、「End sub直前は不要」「エラー発生時等の保守性を考慮して書いておくべき」と双方のご意見があるようです。

以上です。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

meg_

2022/06/14 15:38

> 新人プログラマーです。 先輩に確認するのが良いかと思います。御社のコード規約に従えば良いのではないでしょうか?
Unknown2030

2022/06/14 15:55

回答ありがとうございます。まずコード規約につきまして、弊社ではVBA開発実績がないため、規約も特にありません。そのため一般的な規約に沿ったものを開発する方針です。 また開発実績のある先輩がおらず、触れたことのある先輩に確認をしましたが、よく分からないままの現状で困っています。以下確認した結果です。 ○メモリ解放の対象→(回答)オブジェクト変数 ○メモリ解放のタイミング→(回答)End sub前に必要 ※VBAの慣例だから

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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