|
▼Yuki さん:
>>理屈から言うとUsedRangeのほうが早そうですね。
>
>試す毎に値が変化します。
>UsedRangeが早くなったりCellsが早くなったりです。
>どっちにしても体感できる値ではなさそうです。
Yukiさん、検証ご足労かけます
ごめんなさい、どうチェックしたらよいか分からなくなりました...
実は、つい最近
> With Worksheets("Sheet2")
> .Cells.ClearContents
と同じようなコードを検証していて
ステップ実行していったら、
> .Cells.ClearContents
の行で体感的にとても時間がかかってたので、今回の発言と
なりました。
で、こちらで以下のようなコードでテストしてみたところ
'---------------------------------------------
Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub myTest1() 'Cells プロパティ
Dim t&
'準備
Sheets(2).Cells.Copy Sheets(1).Cells(1)
t = timeGetTime()
Sheets(1).Cells.ClearContents
Debug.Print "'cells"; timeGetTime() - t
Sheets(1).UsedRange.Clear
End Sub
Sub myTest2() 'UsedRange プロパティ
Dim t&
'準備
Sheets(2).Cells.Copy Sheets(1).Cells(1)
t = timeGetTime()
Sheets(1).UsedRange.ClearContents
Debug.Print "'Used"; timeGetTime() - t
Sheets(1).UsedRange.Clear
End Sub
結果は
'Used 15
'cells 15
'Used 16
'cells 16
'cells 0
'Used 0
'cells 0
'Used 0
というものでして、まるで差が出ませんでした。
きっとテストのしかたが悪いのだと思います。
それとも【ここが重要なところですが】
ClearContentsメソッドには Cellsプロパティで シートの
全範囲を指定しても、自動で UsedRangeに範囲限定する機能が
備わってるのでしょうか?
クリアでなく、【値Copy】のときには Cellsと UsedRangeは
たしかにちがいます。
他の掲示板で 某回答者の発言ですが、
---------------------------------- <引用>
> Cells.Value = Cells.Value
最近のPCだと余裕でできるんですかね?
当方のへっぽこPCだと、あっさりメモリ不足になりますけど。
最近のPCだとExcelで使用できるメモリ量も多いのでしょうか?
65,536×256=16,777,216個の要素を持つVariant型の二次元配列を
取得しようとする処理(右辺の評価)で、当方ではコケます。
コケなくても、相当にしんどい処理になると思いますので、
UsedRangeとかで範囲を絞った方がよろしいかと。
個人的には、コピー→値貼り付け→CutCopyMode = True/False
の方が、高速ですし、間違った処理(データ型変換)もしませんし、
接頭辞(')を落としてしまうこともないですし、データの
文字数制限(2003だと1データ911文字まで)もありませんので、
そちらをおすすめします。
------------------------------------ </引用>
この事例と ClearContents のときとは、やはり違うんですかね
ご無礼 しました。
|
|