質問: i + 1 loop erase ans unload userform1 exit sub errend: msgbox "これ以上の配列を設定できません。" & vbcrlf & "上限は" & i & "です。" & vbcrlf & err.description erase ans unload userform1 end sub
回答: こんにちは、 > ここで、redim preserveのpreserveをとって、redimだけにすると、数字の増え方が目に見えて遅くなります。 > redim preserveとしたときは9.5秒ぐらいですが > redim の時は 30秒以上かかっています redim は 新築 redim preserve は 増築 という喩で説明になっているかと思います。 実際には、eraseして、メモリの再割り当てをしつつ、配列のサイズ(ディメンション)を再定義するのがredim 既存のメモリを維持しつつ、メモリを拡張、サイズを再定義するのがredim preserve ということになります。 必然的にredimを繰り返したら遅くなります。 ご提示のコードでpreserve キーワードを抜くと、 kankakuごとに、redimしている訳ですから、 せっかく格納したそれまでの値を消去していることになります。 可変長のstring型変数の場合は特殊で、割り当てられるメモリサイズが固定ではありませんから 格納したり消去(長さ0の文字列を格納)したりするのに特に時間が掛かります。 ご提示のコードでpreserve キーワードを抜くと、 それまでに格納した文字長に比例したメモリサイズ、は無視されてしまいます。 本来の目的から外れたテストになってしまいます。 可変長の変数なのですから、要素数、だけではなくて、 要素数と文字長、の2点について、色々パラメータを変えながら テストしてみた方がより有意義なものになるのではないかと思います。 dim ans() as string のように一旦、文字列型として、動的配列変数を予め定義しておいた方が テストの精度が高まりますし、redimに掛かる時間も短くなります。 以上です。