Excel VBA質問箱 IV

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

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


6339 / 13646 ツリー ←次へ | 前へ→

【45816】Dimについて tomo 07/1/15(月) 8:35 質問[未読]
【45817】Re:Dimについて ぱっせんじゃー 07/1/15(月) 8:42 発言[未読]
【45818】Re:Dimについて tomo 07/1/15(月) 9:52 質問[未読]
【45819】Re:Dimについて neptune 07/1/15(月) 10:07 回答[未読]
【45820】Re:Dimについて neptune 07/1/15(月) 10:20 回答[未読]
【45821】Re:Dimについて tomo 07/1/15(月) 13:29 質問[未読]
【45826】Re:Dimについて neptune 07/1/15(月) 14:52 回答[未読]
【45830】Re:Dimについて tomo 07/1/15(月) 15:56 発言[未読]
【45835】Re:Dimについて Kein 07/1/15(月) 18:07 発言[未読]
【45837】Re:Dimについて tomo 07/1/15(月) 20:06 お礼[未読]
【45824】Re:Dimについて Kein 07/1/15(月) 14:40 発言[未読]
【45833】Re:Dimについて tomo 07/1/15(月) 17:07 質問[未読]
【45834】Re:Dimについて Kein 07/1/15(月) 18:04 発言[未読]

【45816】Dimについて
質問  tomo  - 07/1/15(月) 8:35 -

引用なし
パスワード
   作成したコードで,『 Dim i(100) As Long 』とまず宣言しています。
この'100'という値ですが,使用条件によって値が変動し,場合によっては最大'10000'以上もあったりします。

現状では使用するたびに値(コード)をいじって,対応していますが,変更後の数値のまま保存することが多く,例えば'10000'に変更したまま,Excelを終了して,後日,使用するとき,メモリーの消費量が著しく,Excel自体の起動や終了に大きな影響が出てしまう状況です。

そこで,常にデフォルト値を'1'として,マクロ実行時にユーザーフォーム等で値の選定を行い,この値を使用できるようにしたいと思っています。(マクロ終了後は再び'1'に再定義)

イメージ的には
Dim i(set1) As Long 'と宣言し,
set1は前もってユーザーフォーム等で取得するような感じにしたいと思っています。

手持ちの本と過去のログからヒントがあればと思って検索したのですが,参考になるものが見つからず,投稿しました。
何か方法があればご教示願います。

【45817】Re:Dimについて
発言  ぱっせんじゃー  - 07/1/15(月) 8:42 -

引用なし
パスワード
   ReDim
してみてはいかがでしょう?

【45818】Re:Dimについて
質問  tomo  - 07/1/15(月) 9:52 -

引用なし
パスワード
   ▼ぱっせんじゃー さん:
>ReDim
> してみてはいかがでしょう?

回答ありがとうございます。
ReDim によって再割り当て数を'10000'以上の大きな値にすることで,使用しているマクロに対しては恐らく十分な割り当てを確保出るため,参考にさせていただきます。

ReDimについて,教えていただきたいのですが,割り当て数の大小によって終了までの所要時間(メモリーの使用量)に変化は出てくるものなのでしょうか?
ユーザーフォーム等の利用を考えたのは,この影響を予想し,その都度,最適値を代入する方法が一番ベストな方法なのではと思ったからです。

【45819】Re:Dimについて
回答  neptune  - 07/1/15(月) 10:07 -

引用なし
パスワード
   ▼tomo さん:
こんにちは。

>ReDimについて,教えていただきたいのですが,割り当て数の大小によって終了までの所要時間(メモリーの使用量)に変化は出てくるものなのでしょうか?
やった事ないですが、そんな事は計ってみればわかりますよ。
今回の質問では所要時間とメモリの使用量は関係ないような気もしますが?
要素数が増えれば当然メモリもその分使用します。

>ユーザーフォーム等の利用を考えたのは,この影響を予想し,その都度,最適値を代入する方法が一番ベストな方法なのではと思ったからです。
これは、その通りで、出来る限り必要な総素数をカウント、予測してから
再定義します。

redimは繰り返すと、体感できるほどの時間が必要になります。

【45820】Re:Dimについて
回答  neptune  - 07/1/15(月) 10:20 -

引用なし
パスワード
   ▼tomo さん:
>ReDimについて,教えていただきたいのですが,割り当て数の大小によって終了までの所要時間(メモリーの使用量)に変化は出てくるものなのでしょうか?
追記
VB系のサイトと勘違いしてました。
(キツさが・・・Excelではちょっとキツかった^ ^;)
redim自体での所要時間は要素数によって、体感できるほどの差は生じないです。
自分で計ってみれば納得します。

Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Private T1 As Long, T2 As Long

Sub t()
Dim a() As Long

  T1 = timeGetTime
  ReDim a(10)
  T2 = timeGetTime
  Debug.Print "要素数10   : " & (T2 - T1) / 1000 & " Sec"
  T1 = timeGetTime
  ReDim a(1000000)
  T2 = timeGetTime
  Debug.Print "要素数1000000: " & (T2 - T1) / 1000 & " Sec"

End Sub

【45821】Re:Dimについて
質問  tomo  - 07/1/15(月) 13:29 -

引用なし
パスワード
   ▼neptune さん:
>Public Declare Function timeGetTime Lib "winmm.dll" () As Long
>
>Private T1 As Long, T2 As Long
>
>Sub t()
>Dim a() As Long
>
>  T1 = timeGetTime
>  ReDim a(10)
>  T2 = timeGetTime
>  Debug.Print "要素数10   : " & (T2 - T1) / 1000 & " Sec"
>  T1 = timeGetTime
>  ReDim a(1000000)
>  T2 = timeGetTime
>  Debug.Print "要素数1000000: " & (T2 - T1) / 1000 & " Sec"
>
>End Sub
すいません。教えて下さい。
上記のコードはどう利用するのですか?

【45824】Re:Dimについて
発言  Kein  - 07/1/15(月) 14:40 -

引用なし
パスワード
   >例えば'10000'に変更したまま,Excelを終了
というのが、イマイチ具体的にどうしているのか分からなくて、
動作が重くなることが理解できないのですが、配列の要素は普通、
プロシージャの終了と共に消えてなくなるはずですね。
でも私は特に、動的配列については Erase で初期化して終わるように
習慣づけてます。動的配列の場合は静的配列と違って、メモリへの割り当て
まで開放できるからです。Erase のヘルプにそのように書いてあります。

【45826】Re:Dimについて
回答  neptune  - 07/1/15(月) 14:52 -

引用なし
パスワード
   ▼tomo さん:
こんにちは

>上記のコードはどう利用するのですか?
えっ・・という感じですが。。。

新しい標準モジュールを追加して、そこに私のUPしたソースをそっくりそのまま
コピペして
sub t
を実行して下さい。

要素数の違いによるredimの実行時間がイミディエイトウィンドウに
表示されます。

【45830】Re:Dimについて
発言  tomo  - 07/1/15(月) 15:56 -

引用なし
パスワード
   ▼neptune さん:
>▼tomo さん:
>こんにちは
>
>>上記のコードはどう利用するのですか?
>えっ・・という感じですが。。。
>
>新しい標準モジュールを追加して、そこに私のUPしたソースをそっくりそのまま
>コピペして
>sub t
>を実行して下さい。
>
>要素数の違いによるredimの実行時間がイミディエイトウィンドウに
>表示されます。

Debugの意味がわからなくヘルプで確認したところ,イミディエイトウィンドウが表示されることが書いてあったため,なにかウィンドウ表示がされるのだろうと思い,新しい標準モジュールに貼り付けて実行したのですが,何にも変化か見られなかったので,質問しました。

【45833】Re:Dimについて
質問  tomo  - 07/1/15(月) 17:07 -

引用なし
パスワード
   ▼Kein さん:
>>例えば'10000'に変更したまま,Excelを終了
>というのが、イマイチ具体的にどうしているのか分からなくて、
>動作が重くなることが理解できないのですが、配列の要素は普通、
>プロシージャの終了と共に消えてなくなるはずですね。
>でも私は特に、動的配列については Erase で初期化して終わるように
>習慣づけてます。動的配列の場合は静的配列と違って、メモリへの割り当て
>まで開放できるからです。Erase のヘルプにそのように書いてあります。

すいませ。説明が足りなかったようですね。

Auto_Openでまず,ユーザーフォームが表示されるプロシージャが実行されます。
このユーザーフォームは色々なチェックボタンがあり,チェックしたボタンに対応したプロシージャがCallされます。
このCallされたプロシージャに Dim i(10) As Long と宣言されています。

例えば,割り当て数10でAuto_Openを実行させ,割り当て数不足のためプロシージャが途中終了されるとします。
そこで Dim i(10000) As Long に変更し,マクロ終了後,いったんExcel(上書き保存で)も終了させます。
再度,Auto_Openでプロシージャを実行させた場合, Dim i(10000) As Long に書き換えられている状態となります。

このため,割り当て数10000 に必要なメモリーを確保した状態でマクロ実行されることになるため,動作が重くなってしまっているようです。(i(10)の場合とは明らかに差がありました)

以上により,Auto_Openで実行した初めに割り当て数の宣言が出来ればと思い投稿した次第です。(意味がわからなかったら,また指摘してください)

【45834】Re:Dimについて
発言  Kein  - 07/1/15(月) 18:04 -

引用なし
パスワード
   ともかく他の回答者も指摘しているように「要素の上限値を指定しない」で
配列変数を宣言し、使い終わったら Erase するように変更してみて下さい。
例えば

Dim i As Long, MyAry() As Long

Do
  i = i + 1
  If Cells(i, 1).Value = "ZZZ" Then Exit Do
  ReDim Preserve MyAry(i): MyAry(i) = Cells(i, 2).Value
Loop Until i = 1000

MyAry() を使う処理

Erase MyAry
End Sub

【45835】Re:Dimについて
発言  Kein  - 07/1/15(月) 18:07 -

引用なし
パスワード
   イミディエイトウィンドウは、VBE画面を出している状態で Ctrl + G のキーを
押すと出てきます。

【45837】Re:Dimについて
お礼  tomo  - 07/1/15(月) 20:06 -

引用なし
パスワード
   回答頂いた皆さん,ありがとうございました。
どうやら,かたくなに割り当て数の宣言をしなければ上手くできないと,思い込んでいたようで,なかなか理解できなかったようです。
Eraseを今後,活用していきたいと思います。
ありがとうございました。

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