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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
ReDim PreserveよりもReDimが遅い
Visual Basic(VBA)
-
配列をEraseしてもメモリが開放されていない?
Visual Basic(VBA)
-
Cellsのかっこの中はどっちが行と列なの?
Visual Basic(VBA)
-
-
4
Variant型で宣言してるのにEmptyになる
Visual Basic(VBA)
-
5
VBAの配列サイズとメモリに関して
Visual Basic(VBA)
-
6
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
7
VBA 1次元配列を2次元に追加する
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Dir関数で読み取り順を操作でき...
-
vba フィルター 複数条件 3つ以...
-
グラフの「項目軸ラベルに使用...
-
Redim とEraseの違いは?
-
Excelのメモリ(配列)の上限は2G...
-
【緊急】インクルードファイル...
-
VB6のメモリ解放に関して
-
RPG 配列宣言について
-
構造体配列内の文字列検索のよ...
-
定数配列の書き方
-
テキストボックの文字を一行ず...
-
VBAのワークシート関数で配列の...
-
VB.NETの配列にExcelから読み込...
-
大至急!!! プログラミングC...
-
8bitインデックス画像の入出力方法
-
Segmentation Fault (メモリ制限?)
-
DBから取得した値を配列へ代入する
-
エクセル VBA 変数を一括で宣言...
-
VBA フォルダ内のファイルを、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
Excel2010のinputboxで複数デー...
-
エクセルでXY座標に並べられた...
-
構造体配列の特定のメンバーをF...
-
定数配列の書き方
-
コンボボックスのインデックス...
-
OutOfMemoryExceptionの回避策...
-
Dir関数で読み取り順を操作でき...
-
CheckBoxの配列化
-
構造体配列内の文字列検索のよ...
-
COBOLの基本的な事なので...
-
Redim とEraseの違いは?
-
VBAで配列引数を値渡しできない...
-
2次元配列の初期値
-
配列の中の最大値とそのインデ...
-
VB6からの移行したいけど、VB.N...
-
大量の変数を定義するにはどう...
-
VB6のメモリ解放に関して
おすすめ情報