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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) userformでSheetを選択して開くコード 1 2023/05/15 16:27
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Excel(エクセル) Excel VBAについてです。 少しだけ知識はあるのですが、 うまくいかなかったので 質問させてい 3 2022/09/13 18:40
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
VB6 配列を初期化したい
Visual Basic(VBA)
-
Redimした動的配列はEraseする必要があるのか
Visual Basic(VBA)
-
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
-
4
VBの「As String * 128」とは?
Visual Basic(VBA)
-
5
VB6 開発環境のエディタに行番号を表示
Visual Basic(VBA)
-
6
VB6.0-整数と余りを求める
Visual Basic(VBA)
-
7
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
8
CloseとDisposeの違い
Visual Basic(VBA)
-
9
VB6からVB2010への変換について
Visual Basic(VBA)
-
10
VBプログラムの終了
Visual Basic(VBA)
-
11
VBの画面サイズについて
Visual Basic(VBA)
-
12
VB.NET でのLaod/unLoad について
Visual Basic(VBA)
-
13
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
14
VBのReturnの使い方
Visual Basic(VBA)
-
15
配列をEraseしてもメモリが開放されていない?
Visual Basic(VBA)
-
16
DoEventsがやはり分からない
Visual Basic(VBA)
-
17
VB6で時刻の範囲に入っているか調べたいのですが。
Visual Basic(VBA)
-
18
FriendとPublicの違い。。。
Visual Basic(VBA)
-
19
16進数の変換処理
Visual Basic(VBA)
-
20
VB6.0 Dir関数について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
エクセルでXY座標に並べられた...
-
Dir関数で読み取り順を操作でき...
-
VB6のメモリ解放に関して
-
CheckBoxの配列化
-
定数配列の書き方
-
ReDim PreserveよりもReDimが遅い
-
C#でbyte配列から画像を表示さ...
-
free()関数の多用 と Segment...
-
vba フィルター 複数条件 3つ以...
-
構造体配列の特定のメンバーをF...
-
エクセル(VBA)の空白配列の削除...
-
VB.NETの配列の限界を教えてく...
-
OutOfMemoryExceptionの回避策...
-
VBAでMODE関数をつくる
-
Excel2010のinputboxで複数デー...
-
VBAで配列引数を値渡しできない...
-
配列の要素がすべてカラかどう...
-
VBAのワークシート関数で配列の...
-
SPLIT関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
エクセルでXY座標に並べられた...
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
配列の中の最大値とそのインデ...
-
Excel2010のinputboxで複数デー...
-
Dir関数で読み取り順を操作でき...
-
大量の変数を定義するにはどう...
-
Redim とEraseの違いは?
-
VB6のメモリ解放に関して
-
CheckBoxの配列化
-
COBOLの基本的な事なので...
-
コンボボックスのインデックス...
-
構造体配列の特定のメンバーをF...
-
構造体配列内の文字列検索のよ...
-
定数配列の書き方
-
Excelのメモリ(配列)の上限は2G...
-
Segmentation Fault (メモリ制限?)
-
複数のtextboxの処理を一括で行...
おすすめ情報