Excel VBA質問箱 IV

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

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


11172 / 13644 ツリー ←次へ | 前へ→

【17712】Eraceについて教えて下さい 音無 響子 04/9/6(月) 13:18 質問[未読]
【17717】Re:Eraceについて教えて下さい つん 04/9/6(月) 14:16 発言[未読]
【17718】Re:Eraceについて教えて下さい 音無 響子 04/9/6(月) 15:09 お礼[未読]
【17719】Re:Eraceについて教えて下さい Jaka 04/9/6(月) 15:17 回答[未読]
【17720】あ、終わってた。 Jaka 04/9/6(月) 15:19 発言[未読]

【17712】Eraceについて教えて下さい
質問  音無 響子  - 04/9/6(月) 13:18 -

引用なし
パスワード
   Redim (Redim Preserve)において作成された配列(構造体)を、
Eraceによって解体しています。

今、処理的は、簡単にいうとこんな感じになっています。


ReDim A.a(0)

For i = 0 To 10

  If XXX Then
    ReDim Preserve A.a(i)
    ---処理開始---
      :
    ---処理終了---
  End if

  Erase A.a()
Next


これだと、Redim (Redim Preserve)する場合と、しない場合あるんですが、
どちらにしても最終的には、Eraceによって処理してます。
現状、特に問題なく動いています。

何が聞きたいかと申しますと、
「Redim (Redim Preserve)によって配列(構造体)を作成しなしくても、
Eraceを使用しても本当に問題ないの?」
って、ことです。

今後、何か問題とか起こる可能性はあるのでしょうか?

【17717】Re:Eraceについて教えて下さい
発言  つん E-MAIL  - 04/9/6(月) 14:16 -

引用なし
パスワード
   音無 響子 さん、こんにちは。
>
>何が聞きたいかと申しますと、
>「Redim (Redim Preserve)によって配列(構造体)を作成しなしくても、
>Eraceを使用しても本当に問題ないの?」
>って、ことです。
>今後、何か問題とか起こる可能性はあるのでしょうか?

これは問題ないと思いますが・・・おそらく
他に気になることがあります。

「A.a(0)」という変数名ですけど、「ドット」は使えないと思います。
実際ドットを入れて宣言してみたら、VBEに叱られてしまいましたけど、そんなことありませんでした?

>ReDim A.a(0)
>
>For i = 0 To 10
>
>  If XXX Then
>    ReDim Preserve A.a(i)
>    ---処理開始---
>      :
>    ---処理終了---
>  End if
>
>  Erase A.a()
>Next

これだと、例えば、2.4.6.8.10がIf文で通ったとしたら、
A.a(2),A.a(4)・・・・・・に値が入って、A.a(0),A.a(1)・・・・・・が空になるんじゃないかと思うんですが、添え字用の変数を別にする必要がないですか?
それと、EraseをFor Next文の中に書いてますが、これだと、いちいち解放されてしまうので、外に出さなくてはいけないんじゃないかと思いますが・・・どないでしょう?

【17718】Re:Eraceについて教えて下さい
お礼  音無 響子  - 04/9/6(月) 15:09 -

引用なし
パスワード
   >これは問題ないと思いますが・・・おそらく
ありがとうございます。


>他に気になることがあります。
>
>「A.a(0)」という変数名ですけど、「ドット」は使えないと思います。
>実際ドットを入れて宣言してみたら、VBEに叱られてしまいましたけど、そんなことありませんでした?

口足らずな私ですいません。。。
現在、このように宣言しています。

Private Type KOUZOUTAI
  a() As String
  b As Integer
End Type

Private a As KOUZOUTAI


>
>>ReDim A.a(0)
>>
>>For i = 0 To 10
>>
>>  If XXX Then
>>    ReDim Preserve A.a(i)
>>    ---処理開始---
>>      :
>>    ---処理終了---
>>  End if
>>
>>  Erase A.a()
>>Next
>
>これだと、例えば、2.4.6.8.10がIf文で通ったとしたら、
>A.a(2),A.a(4)・・・・・・に値が入って、A.a(0),A.a(1)・・・・・・が空になるんじゃないかと思うんですが、添え字用の変数を別にする必要がないですか?

→おっしゃるとおり。
 何かおかしいと思てたら、掲載したサンプルロジックが間違えてました。
 すいません、間違いでした。↓
 
 誤:For i = 0 To 10
 正:Do While True

 でした。つまり、グルグルLoopして条件に合えば、Redimにより拡張します。
 

>それと、EraseをFor Next文の中に書いてますが、これだと、いちいち解放されてしまうので、外に出さなくてはいけないんじゃないかと思いますが・・・どないでしょう?
→おっしゃるとおり。確かにそうなんですが…何を隠そう、この配列を毎回Loop毎に、
 使い回ししてるんです。だから、毎Loop毎にEraceしています。
 
 変則的なロジックですいません。。。


まとめると…

Private Type KOUZOUTAI
  a() As String
  b As Integer
End Type

Private a As KOUZOUTAI

Dim i As Integer

ReDim A.a(0)

Do While True

  If XXX Then
    ReDim Preserve A.a(i)
    ---処理開始---
      :  ←ここで構造体Aにデータを格納
      :  ←ここで構造体Aのデータをセルに出力
    ---処理終了---
  End if

  Erase A.a()
Loop

【17719】Re:Eraceについて教えて下さい
回答  Jaka  - 04/9/6(月) 15:17 -

引用なし
パスワード
   こんにちは。
つんさまのまんまですが。

ヘルプより

配列の適用範囲内のプロシージャで、ReDim ステートメントを使って、次元数の変更、要素数の定義、各次元の上限と下限を指定します。また、必要に応じて動的配列を変更することもできます。ただし、ReDim ステートメントを実行するたびに、配列の現在の値が失われます。ReDim Preserve ステートメントを使用すると、配列の現在値を保持した状態で配列を拡張できます。たとえば、次のステートメントは元の要素に設定されている値を失わずに、配列 varArray を拡張して 10 要素を追加します。

dim aa(1 to 5) as long  静的配列

dim bb() as long
redim bb(1 to 5)   動的配列

Erase aa  配列の中が、宣言に応じて初期化される。
      この場合0

Erase bb  配列をメモリ上から開放する。


ReDim Preserveで、値を保持しつつ配列を拡張しているのに
Eraseで、配列を開放するのは待ったく意味ないです。

配列は、使い終わったら開放しないと、無駄にメモリを食って、後々処理が遅くなったります。

つんさまへ
私時間が無いので、私のかかわった所を変わりに回答してちょ。
お願いします。

【17720】あ、終わってた。
発言  Jaka  - 04/9/6(月) 15:19 -

引用なし
パスワード
   失礼しました。

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