ここから本文です

VBA でガベージコレクションを強制的に実行させることはできませんか?

ice********さん

2016/11/2202:59:33

VBA でガベージコレクションを強制的に実行させることはできませんか?

C#でいうGC.Collect()です。
Set XX= Nothingは実行しているつもりですが、
マクロを実行するたびに解放できないものがあるみたいでメモリ消費が増えていき困ってます。
ご教授いただきたい。

閲覧数:
2,720
回答数:
4
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

kxk********さん

2016/11/2208:28:02

VBAにはガベージコレクタという考え方(メモリ開放処理を後でまとめてやる、みたいな)はなく、参照がなくなったオブジェクトはその時点で解放されます。

オブジェクトのデストラクタ(class_terminate)は、参照がなくなった段階で実行されますので、これは試してみて下さい。
(ガベージコレクタがある場合は、デストラクタの実行時期は保証されない)

マクロを実行するたびに解放できないものがあるということは、相互参照とかで、参照が無くなっていないからオブジェクトが消えない、ということです。
C#だと、相互参照があるオブジェクトでも、ガベージコレクタが到達できないかどうか判定してくれますが、VBAはそうはなっていない、ということです。

Set XX= Nothing は、変数XXからの参照を無くするというだけで、オブジェクトを破棄する意味ではありません。

  • kxk********さん

    2016/11/2312:42:29

    あと考えられるものとして、Excel にはGDIオブジェクトを正しく解放しないことがあるというバグがあります。こいつのせいだ、という可能性もあります。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

kak********さん

2016/11/2212:43:27

Excel本体もしくは、実行するVBAコードが書かれているBookを起動したままですと、標準モージュールの宣言セクションに記述されている変数はオブジェクトを参照したままです。
そのあたりが怪しいのではと思います。

UserFormにボタンを1つ貼り付けて下記のコードを実行してみてください。
フォームを閉じても、ボタンをクリックすると値が増えていくのが確認できます。

’UserForm1
Option Explicit

Private Sub CommandButton1_Click()
Call MsgBox(CStr(Sample))
End Sub

’標準モジュール
Option Explicit

Private Counter As Integer

Public Function Sample() As Integer
Counter = Counter + 1

Sample = Counter
End Function

por********さん

2016/11/2210:25:01

こんにちは。
doeventsが、ちかいのですが、「実行するたびに増える」というのは、
VBAコードで発行したコードで、完全に終わっていない、ということなんでしょうか。

だとしたら、コード全体を見直しすることや、終了処理に、時間をかけて、メモリが開放してから、使い始める、という工夫も必要かもしれません。

エクセルVBAは、cpu100%で実行しようとします。OSの作業を待たせるべきときは、doeventsぐらいしか、逃げ道がないです。

Ex3さん

2016/11/2206:45:38

普通は「End Sub」で終了すればメモリも解放されると思いますが、VBAにはガベージコレクションに相当する命令はありません。

サブプロシージャは「End Sub」でなければいけませんが、メインプロシージャのところは「End Sub」の前に「End」で終了させてみてはどうでしょう。

他にも使用上の注意がありますので、詳細はヘルプで。

昔のバージョンに「Application.MemoryUsed」(メモリ使用量を測る)があったのですが、実際にはあまり役に立つ情報ではなかったようです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる