Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


886 / 2272 ツリー ←次へ | 前へ→

【9646】Access VBAの変数について。 ジバク 07/7/3(火) 22:40 質問[未読]
【9650】Re:Access VBAの変数について。 hatena 07/7/4(水) 0:00 回答[未読]
【9651】Re:Access VBAの変数について。 ジバク 07/7/4(水) 2:38 お礼[未読]
【9652】Re:Access VBAの変数について。 小僧 07/7/4(水) 11:22 発言[未読]
【9663】Re:Access VBAの変数について。 ジバク 07/7/6(金) 2:14 お礼[未読]

【9646】Access VBAの変数について。
質問  ジバク  - 07/7/3(火) 22:40 -

引用なし
パスワード
   はじめまして、Accessを使うようになって一週間程度でVBAも今回初めて触っている初心者のジバクと言います。よろしくお願いします。

**環境**
OS:ウィンドウズ2000  Access97です。

**現状**
Accessで作られたシステムの改修をやっています。

**質問**
自分の会社のAccessで使われているプログラムを見ていて疑問に思ったのですが。

Dim strVar As String

っと変数が宣言されていたとします。

この変数に使われたメモリーは、その変数を使う処理が行われた後に、自動で開放されるのでしょうか?

色々なHPを見て、参考にしながら、改修を行っているのですが、多くのHPが、

Set strVar = Nothing

と、その変数が使われる処理が抜ける際に書かれ、メモリを開放しているようなのです。

ところが、改修を行っているAccessのプログラムでは、一度も使われていませんでした。

この事を先輩に告げ、

「そのシステムに使われてる変数に対して、処理の終わりにNothingで開放すると言うのを付け加えて行った方が良いんじゃないですか?」

と、自分が言った所、
先輩は、

「Accessだから、大丈夫なんじゃない?。よくわからんけど、大丈夫だよ」

と、曖昧な返事を返されてしまいました。

実際の所、どうなのだろう・・・?っと気になって仕方が無いです。


言葉足らずな所もありますが、実際はNothingで開放する行為は必要なのでしょうか?

それとも、やらなくても良い事なのでしょうか?

もし、メモリを開放しない事で、システムダウンや不具合が起こる可能性があるとしたら、もう一度、先輩にその事を告げてみようと思います。

自分でも、調べる努力は致しますが、解る方がおられましたら、お教えください。

よろしくお願いします。

以上です。

【9650】Re:Access VBAの変数について。
回答  hatena  - 07/7/4(水) 0:00 -

引用なし
パスワード
   >Dim strVar As String
>
>っと変数が宣言されていたとします。
>
>この変数に使われたメモリーは、その変数を使う処理が行われた後に、自動で開放されるのでしょうか?

自動で解放されます。しかし、
厳密には「処理が行われた後」ではなく、変数の有効期間が終わったときです。
例えば、Function内で宣言すれば、そのFunctionが終了するとき解放されます。
フォームモジュールで宣言すれば、フォームを閉じるときに解放されます。
標準モジュールでPublic宣言するとAccess自体を閉じるまで解放されません。
詳細はヘルプで、「変数の有効期間の概要」のトピックを検索してみてください。

>色々なHPを見て、参考にしながら、改修を行っているのですが、多くのHPが、
>
>Set strVar = Nothing
>
>と、その変数が使われる処理が抜ける際に書かれ、メモリを開放しているようなのです。

これは、オブジェクト変数の場合ですね。
最初に例示されたString型などの通常の変数ではそのような
記述はできません。

オブジェクト変数の場合も有効期間が終わると自動で解放されます。
ですので通常は必要のない記述です。
たまにしているのを見かけますが、それは念のため、とか、気分的な
要素が多いように思います。
一つの使い道としては、
オブジェクト変数を標準モジュールでパブリック宣言して、共有して
使おうとするときに、使い終わったら
Set objVar = Nothing
と明示的に解放して、他の場所で使うときに、そのオブジェクトが
有効かどうか、
If objVar = Nothing Then
と判断するということはあるかと思います。

【9651】Re:Access VBAの変数について。
お礼  ジバク  - 07/7/4(水) 2:38 -

引用なし
パスワード
   hatenaさんへ。

ご返信ありがとうございます。

hatenaさんの解り易い解説のおかげで疑問が全て吹き飛びました。ありがとうございます!!。

ヘルプの「変数の有効期間の概要」、メモらせてもらいました。明日、会社に行ったら、見てみようと思います。

正直、自分の能力は、1からAccessで何かを作るといったレベルでは無いので、もっともっと勉強し、なるべく、自己解決できるようにしてしていきたいです。

今回は、有益な情報を提供して戴き、本当にタメになりました。自分も他人に有益な情報を提供できるよう精進致します。

それでは失礼致しますね、本当にありがとうございました。

【9652】Re:Access VBAの変数について。
発言  小僧  - 07/7/4(水) 11:22 -

引用なし
パスワード
   ▼ジバク さん、hatenaさん

おはようございます。

変数の有効期間については hatena さんのご提示の通りですが、
Public 変数に関して、一部例外があるので補足です。

MSサポートオンラインより
[VBA] Public 宣言された変数の有効期間

h tp://support.microsoft.com/kb/408871/ja

(こちらの掲示板は直リンクが禁止ですので、補完してください。)


そちらのサイトにも

> Public 変数がアプリケーション終了時まで有効であることを期待する
> VBA マクロの実装は、推奨されません。


とありますが、変数の有効期間は小さく取るのが一般的です。
興味がおありでしたら Google等の検索エンジンで「VB」「スコープ」
をキーワードに検索されてみて下さい。


さて、本題の Set XX = Nothing なのですが、
宣言する、しないに関わらずメモリが解放される事がほとんどですので
(一部例外もありますが)

宣言する意味がない場合が殆んどです。


ただ当方が1プログラマとして思うのは
「時が経てば自動でしまる」という扉を、
開けっ放しで去っていくというのはどうかと思います。(笑)

それが仕様なんだからそのままで良い、
という考え方を否定するつもりはありませんが、

日頃から
・自分が Open したオブジェクトは自分で Close する
・自分が呼び出したオブジェクトは自分で解放する

癖をつけておく事が、他トラブル防止につながるのではないでしょうか。


処理によっては
1.オブジェクトをセットする
2.オブジェクトを Open する
3.何らかの処理
4.オブジェクトを Close する
5.オブジェクトを破棄(Set XX = Nothing)する

という一連の流れの中で、
4、5の動作を行わなかったり、
5の順序を間違ったりして
ファイルそのものを壊してしまう事があります。

Set XX = Nothing をしなかったからだ、とは言えませんが
日頃から変数の宣言や挙動に気をつけてれば
回避する事ができるのではないか、と思います。


長くなりましたが、ご参考までに。

【9663】Re:Access VBAの変数について。
お礼  ジバク  - 07/7/6(金) 2:14 -

引用なし
パスワード
   小僧 さんへ。

ご返信、真にありがとうございます。

「VB」 「スコープ」で検索してみました!。

自分は今年から、パソコンを使う仕事を始めたばかりでして、プログラマと恥ずかしくて名乗れない位の初心者なのですが、「スコープ」と言う概念を知る事が出来て、とても勉強になりました。

無知の為、可笑しな事を言ってしまってるかもしれませんが、出来る言語と言えばCOBOL系統だけだったので、幅広く活躍する為にはC言語系も勉強していかなければいけないなと切に感じました。


自分でも色々調べた結果、面白いHPを見つけましたので貼っておきます。

h tp://www.tsware.jp/labo/index.htm

既にご存知のHPかも知れませんが、自分のような悩みを持っている方の参考になればと思い、貼らせて頂きました。

中には「Nothingはメモリの節約になるのか?」等、Accessを効率よく動かすための事が書かれています。

実際は、Nothingは使わなくても良いと言う結果になっているのですが、自分も「開いた扉は閉じないと気持ちが悪い」方なので、自分が触った部分だけでも変えておこうかと思います。

**以下余談ですが**

「プログラムとはなんぞや?」っと言う本を見ている限り、プログラムって難しいんだなーっと思っていましたが、ただ作る分には結構簡単な事に驚いています。技術の進歩と言う奴なのでしょうか。。。。

少しでも、どういった風に動いているのかを突き止めて、より効率の良いプログラムを書けるように精進したいと思います。

hatenaさん、小僧さん、今回は質問に答えて頂き、本当にありがとうございました。新しい事を知る事が出来き、とても勉強になりました。ここで教えてもらった事を活かし、発展させ頑張って行こうと思います。

それでは、失礼致します。

886 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free