アプリ版:「スタンプのみでお礼する」機能のリリースについて

Public Sub Test(SourceRange As Range, TargetRange As Range)
Dim ResultArray() As Variant
' ここから

' ここまでに該当処理
TargetRange = ResultArray
End Sub

2次元配列について
ReDimで大きな配列を作って1行ずつ代入してからセルに貼り付けるのと、
ReDim Preserveで配列を1行ずつ少しづつ追加してからセルに貼り付けるのと、
5000×5000くらいだとどちらが速いですか?

私のPCだと性能不足で測定困難です。
代わりに試して頂けると助かります。

A 回答 (2件)

VBA(MicrosoftのBasic)でRedimすると、配列を増減するのではなく、新たな場所に新しい大きさのメモリを確保して、配列の参照先を変えます。


今までの配列の本体は参照元が無くなるので、空いた時間に削除されます。
ReDim Preserve は、既存のデータをコピーするので、更に時間がかかります。
なので、頻繁にReDim Preserveすると、メモリの確保とデータのコピーと不要になった配列の掃除のために大忙しになるので、やめた方がいいと思います。
これは文字列の追加でも起こるので、文字列の追加も気を付けた方がいいと思います。

それとVariantはどの型になるか不明なので、1データ16バイトの大きさが必要です。
普通の変数ならあまり気にする必要はありませんが、大きな配列だと、不要にメモリを消費します。
ReDim Preserveも要素数が同じでも他の型の変数と違って、大きなメモリのなるので時間がかかる可能性が高くなります。
例えばIntegerなら2バイトなので、必要なメモリは1/8になり、速度も上がります。

ただし、今のExcelは32ビットで動いているのでLongの場合メモリは1データ4バイト必要ですが、全体の処理は速いかもしれません。

とりあえず、Redimは出来るだけしない方がいいと思います。
ReDim Preserveは更に時間がかかります。
    • good
    • 0
この回答へのお礼

ReDim Preserve って追加だけじゃなくぜんぶコピーしてるんですね。存在意義がよく分からないですね、どう使い分けたら良いのでしょう?

お礼日時:2019/01/02 22:31

こんばんは。



一応、試さないで何かを言うのは失礼だから試してはみたものの、
実際、どんなコードを予想していらっしゃるのかしら?

>ReDimで大きな配列を作って1行ずつ代入してからセルに貼り付けるのと、
セル一つのデータを一つのインデックスに入れました。

>ReDim Preserveで配列を1行ずつ少しづつ追加してからセルに貼り付けるのと、
>5000×5000くらいだとどちらが速いですか?

比べる必要などはないと思うのです。
Redim Preseve とはいっても、1次側を固定しなければならないし、それでも、遅いのに決まっています。何分経ったか、20分は過ぎていますね。いえ、ハングしてしまいました。

>私のPCだと性能不足で測定困難です。
こちらのPCのスペックは悪くありませんよ。PCは、第6世代だったと思います。それに、Excel2013がネックということもないでしょう。


予め Redim xArray(5000,5000)
なら、73.543 s

Redim Preseve xArray(....
計測不能。途中でハング
    • good
    • 0
この回答へのお礼

ありがとうございます。助かりました。

お礼日時:2019/01/02 22:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています