
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だと性能不足で測定困難です。
代わりに試して頂けると助かります。
No.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は更に時間がかかります。
ReDim Preserve って追加だけじゃなくぜんぶコピーしてるんですね。存在意義がよく分からないですね、どう使い分けたら良いのでしょう?
No.1
- 回答日時:
こんばんは。
一応、試さないで何かを言うのは失礼だから試してはみたものの、
実際、どんなコードを予想していらっしゃるのかしら?
>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(....
計測不能。途中でハング
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) userformでSheetを選択して開くコード 1 2023/05/15 16:27
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の中の最大値とそのインデ...
-
VBA 変数名に変数を使用したい。
-
EXCELを使って、アクセスログを...
-
Dir関数で読み取り順を操作でき...
-
Excel2010のinputboxで複数デー...
-
VBScriptでCSVファイルを読み出...
-
C#でbyte配列から画像を表示さ...
-
VB6のメモリ解放に関して
-
バイナリエディタ
-
定数配列の書き方
-
VB.NETの配列にExcelから読み込...
-
レコードセットの中身を配列に...
-
配列の中から最大値だけ取り出...
-
エクセルの列一括書き込み
-
VBで組み合わせのプログラム...
-
VBでの配列をEXCELに出力する方法
-
c++ 乱数生成について
-
VBAにて、配列のデータを一度に...
-
空白を埋めるマクロについて
-
C#で作成したdllをVBScriptで使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列のペースト出力結果の書式...
-
定数配列の書き方
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
Redim とEraseの違いは?
-
複数のtextboxの処理を一括で行...
-
VB.NETの配列にExcelから読み込...
-
COBOLの基本的な事なので...
-
Excel2010のinputboxで複数デー...
-
VBAでMODE関数をつくる
-
レコードセットの中身を配列に...
-
ReDim PreserveよりもReDimが遅い
-
EXCELを使って、アクセスログを...
-
配列の中の最大値とそのインデ...
-
VB6のメモリ解放に関して
おすすめ情報