

VBA フォームのボタン クリックイベント時に書き込んだ記述で、次のような記述があります。
Dim temp() as string
ReDim temp(0)
(next processing)
一度、イベントを処理した後(フォームは閉じません。)
再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。
ReDimで Preserve宣言を使っていないので内容が消去されると考えていました。
ReDimのまえに、
Erase temp
という処理を設けて対応しますが、
ローカルウィンドウやウオッチウィンドウでメモリがクリアされたか確認できていません。
ReDimとEraseの処理でどのような違いがあるのでしょうか?
どなたかよろしくお願いします。
No.2ベストアンサー
- 回答日時:
----ヘルプより引用----
Eraseステートメント
固定サイズの配列の場合は要素を再初期化し、動的配列の場合は割り当てたメモリを解放します。
----------------------
今回は、動的配列なので、メモリ解放ですね。
----ヘルプより引用----
ReDim ステートメント
動的配列変数に対するメモリ領域の再割り当てを行います。プロシージャ レベルで使用します。
----------------------
通常は動的配列のサイズを変更する時に使います。
また、Preserve を付けない場合は値は残りません。
ReDim temp(0) ですが、Option Base 1 なら、エラーになります。
Option Base 0 (又は、省略)の場合、添え字 0 の要素が利用可能です。
UBound(temp) は 0 となります。
つまり、ReDimで配列の要素を 0 個にすることは出来ません。
ちなみに、Eraseした場合、UBound()はエラーになります。
Erase temp
Debug.Print UBound(temp) ' この行でエラー
>再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。
この部分が疑問ですね。
プロシージャ内で宣言した変数なら、プロシージャが終了した時点で捨てられるので、次のイベントに値が残ることはありません。
どこか別の場所に値が残っているのでは?
No.4
- 回答日時:
こんにちは。
>再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。
こういう問題は、コードを見せるのが最低条件です。大方、配列変数を、モジュールレベルにおいているからだと思います。Erase と Redim の対比なんていうのは、意味がありません。
>Officeのヘルプは分量ある割りに役立たないのですよね
ヘルプは、VBAを理解し、イメージとして曖昧な記憶にあるものを、言葉にして確認するときに必要なものであって、それ自体をわからない人の説明にはなっていません。言い換えれば、次元の世界の違うモノです。モノは物でなので、形や大きさが存在しますが、目では見えません。
あえて、回答というなら、Redim と Erase の根本的な違いは何かというなら、その頻度が違います。Redim は、中・上級レベルの全体の中の 10% の使用率なら、もう片方は、Erase は、0.1 %ぐらいです。
なお、質問からだいぶお時間も経っているようですから、もし、問題が解決していない場合は、一旦、ここを終了して、再度、質問したほうがよろしいかもしれませんね。特に、補足側につけても、確認しづらいです。
No.3
- 回答日時:
再度の登場です。
回答は出てますが一言。
>ReDim temp(0)とErase tempの働きは同じという認識でよろしいですか?
No2さんの回答にもありますが全然別の働きをさせるものです。
(1)ReDim temp(0)
要素1個の配列再確保(この時、初期化される)
(2)Erase temp
動的配列tempのメモリー開放なので極論を言えば初期かもなにもtemp自体がなくなる
故にこの先、tempを使いたければ、tempの再宣言が必要になる
現在しているように、
Erase temp
ReDim temp(0)
としなければならない
動的配列は、ReDim temp(??)と宣言されたときに初期化されるので、初期化の処理は不要。
また、動的配列に限らず、今回のようなプロシージャで宣言された変数の適用範囲は、そのプロシージャの中のみなので、初期化の必要はない。
>Officeのヘルプは分量ある割りに役立たないのですよね
●間違ったことが書いてあることはありますが、熟読してそこに書いてあることを実際に試してみれば、大いに役に立つと思いますがねぇ・・(^^;;;
No.1
- 回答日時:
>前に行ったデータが消去されずに残っているようです
何をもってそう判断したのか分からないので何なんですが、
何れにしろ新しいブックで以下を試してみれば一目瞭然です。
UserFormにCommandButtonをひとつ配置。
'-------------------------------------
Private Sub CommandButton1_Click()
Dim temp() As String
ReDim temp(1)
temp(0) = "AAA"
temp(1) = "BBB"
MsgBox "x: " & temp(0)
ReDim temp(0)
MsgBox "y: " & temp(0)
End Sub
'------------------------------------------
RedimとEraseについてはヘルプに詳しく書いてありますので参照。
それでもなお不明な点があれば再質問してください。
この回答への補足
有難うございます。
試したところ、"y : "しか表示されませんでした。
Officeのヘルプは分量ある割りに役立たないのですよね。
では、
ReDim temp(0)
と
Erase temp
の働きは同じという認識でよろしいですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VB6 配列を初期化したい
Visual Basic(VBA)
-
Redimした動的配列はEraseする必要があるのか
Visual Basic(VBA)
-
VB6.0-整数と余りを求める
Visual Basic(VBA)
-
-
4
CloseとDisposeの違い
Visual Basic(VBA)
-
5
VB6のメモリ解放に関して
Visual Basic(VBA)
-
6
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
7
frxファイルの役目
Visual Basic(VBA)
-
8
split関数で区切り文字がない場合
Visual Basic(VBA)
-
9
配列をEraseしてもメモリが開放されていない?
Visual Basic(VBA)
-
10
表にフィルターをかけ、絞ったデータ(可視化セルのみ)を一次元配列として変数に入れるという動作を書きた
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでMODE関数をつくる
-
構造体配列内の文字列検索のよ...
-
C#,繰り返し処理での最大値の取...
-
レコードセットの中身を配列に...
-
VBA 変数名に変数を使用したい。
-
C#で作成したdllをVBScriptで使...
-
スロットマシンの判定方法(VB...
-
2つ目のレコードの値を取得す...
-
c言語で自分のホームディレク...
-
【ExcelVBA】値を変更しながら...
-
アクセス ステータスバーの文...
-
「テーブルに主キーがありませ...
-
他のMDBのテーブルに追加したい
-
VBからID3タグをいじる方法
-
COBOLのコーディングについて
-
エクセル・グラフの 横軸に値を...
-
Access :ALTER TABLE で作成...
-
DataGridの全行編集状態での行追加
-
INT64対応のprintf系関数はあり...
-
oo4oによるBLOBデータ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
エクセルでXY座標に並べられた...
-
vba フィルター 複数条件 3つ以...
-
配列のペースト出力結果の書式...
-
OutOfMemoryExceptionの回避策...
-
配列の中の最大値とそのインデ...
-
複数のtextboxの処理を一括で行...
-
Dir関数で読み取り順を操作でき...
-
VB6からの移行したいけど、VB.N...
-
COBOLの基本的な事なので...
-
構造体配列の特定のメンバーをF...
-
大量の変数を定義するにはどう...
-
EXCEL VBAの課題です
-
Redim とEraseの違いは?
-
VB.NETの配列にExcelから読み込...
-
VBAでMODE関数をつくる
-
VB.NETにて、構造体へデータを...
-
1ビットごとの配列を作りたい
-
VBAで配列引数を値渡しできない...
おすすめ情報