• ベストアンサー

Redim とEraseの違いは?

VBA フォームのボタン クリックイベント時に書き込んだ記述で、次のような記述があります。 Dim temp() as string ReDim temp(0) (next processing) 一度、イベントを処理した後(フォームは閉じません。) 再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。 ReDimで Preserve宣言を使っていないので内容が消去されると考えていました。 ReDimのまえに、 Erase temp という処理を設けて対応しますが、 ローカルウィンドウやウオッチウィンドウでメモリがクリアされたか確認できていません。 ReDimとEraseの処理でどのような違いがあるのでしょうか? どなたかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答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) ' この行でエラー >再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。 この部分が疑問ですね。 プロシージャ内で宣言した変数なら、プロシージャが終了した時点で捨てられるので、次のイベントに値が残ることはありません。 どこか別の場所に値が残っているのでは?

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 >再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。 こういう問題は、コードを見せるのが最低条件です。大方、配列変数を、モジュールレベルにおいているからだと思います。Erase と Redim の対比なんていうのは、意味がありません。 >Officeのヘルプは分量ある割りに役立たないのですよね ヘルプは、VBAを理解し、イメージとして曖昧な記憶にあるものを、言葉にして確認するときに必要なものであって、それ自体をわからない人の説明にはなっていません。言い換えれば、次元の世界の違うモノです。モノは物でなので、形や大きさが存在しますが、目では見えません。 あえて、回答というなら、Redim と Erase の根本的な違いは何かというなら、その頻度が違います。Redim は、中・上級レベルの全体の中の 10% の使用率なら、もう片方は、Erase は、0.1 %ぐらいです。 なお、質問からだいぶお時間も経っているようですから、もし、問題が解決していない場合は、一旦、ここを終了して、再度、質問したほうがよろしいかもしれませんね。特に、補足側につけても、確認しづらいです。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答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のヘルプは分量ある割りに役立たないのですよね ●間違ったことが書いてあることはありますが、熟読してそこに書いてあることを実際に試してみれば、大いに役に立つと思いますがねぇ・・(^^;;;  

  • onlyrom
  • ベストアンサー率59% (228/384)
回答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についてはヘルプに詳しく書いてありますので参照。 それでもなお不明な点があれば再質問してください。  

whatsnew
質問者

補足

有難うございます。 試したところ、"y : "しか表示されませんでした。 Officeのヘルプは分量ある割りに役立たないのですよね。 では、 ReDim temp(0) と Erase temp の働きは同じという認識でよろしいですか?

関連するQ&A