- 締切済み
Excelでのセル内容の高速消去方法
いつもお世話になっております。 Excel VBAで、広範囲のエリア(例えばA1:G65535)を消去したいのですが、動作させるとタスクがフリーズしたようになり(PC自体は正常)応答が帰ってきません。範囲を狭くすれば何も問題ないのですが・・・良い智恵をお貸し下さい。 コードは Range("A***:G***").ClearContents を使ってます。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yama1718
- ベストアンサー率41% (670/1618)
>ところが、『行の高さ』を変更すると劇的に遅く(重く)なるのです! >Excelの設定は変えていないし、PCもPen4 3GHz メモリ1Gなのでスペック的にも問題ないと思います。 >これって、Excelのバグかなんかでしょうか? 重くなっても時間が経てば復帰するなら不具合とは言えないですね。 Excel内部のデータの記録方法により、部分的な変更で良いか、 データ全体を書き換えないといけなくなるかで、処理の重さは変わってきますから。 ちなみに使用のWindowsとExcelのバージョンは? Office 2000や2003だとメモリが充分にあってもExcelが扱えるサイズに限度がありますし、 2007では、その制限も大幅に緩和され処理の最適化もされていますが、メモリが多く必要になります。 2007なら2GB以上は必要かも知れません。
- yama1718
- ベストアンサー率41% (670/1618)
大体はNo.1の方が言われている通りで1命令で処理できるマクロを高速化できる余地はあまりありません。 後は気休め程度にしかならないかも知れませんが、画面更新を中止させるとか、そのセルを参照している計算式が多くあるなら再計算を一時中止させるくらいしか Dim wst As Worksheet '高速化の為に画面更新を中止させる Application.ScreenUpdating = False 'ワークシートの再計算を停止する For Each wst In ActiveWorkbook.Worksheets wst.EnableCalculation = False Next wst Range("A1:G65536").ClearContents 'ワークシートの再計算を再開する For Each wst In ActiveWorkbook.Worksheets wst.EnableCalculation = true Next wst '高速化の為に画面更新を再開する Application.ScreenUpdating = true
補足
yama1718さん --HV--さん ありがとうございます 再計算や画面更新の停止で少しは早くなった?かなっ?て感じです。 色々とTESTしてみたところ、 ・計算式、オブジェクトはあまり影響がない(多少はありますが...) ・列幅も影響がない ところが、『行の高さ』を変更すると劇的に遅く(重く)なるのです! Excelの設定は変えていないし、PCもPen4 3GHz メモリ1Gなのでスペック的にも問題ないと思います。 これって、Excelのバグかなんかでしょうか?
- --HV--
- ベストアンサー率25% (5/20)
あくまで参考意見ですが、 手作業でその作業をしたときとマクロで対応したときの処理速度はどれくらい違うんでしょうか? 手作業でも同じになるなら、PCスペックの問題な気がします。 あえてやるなら、細かい範囲の繰り返し消去でしょうか。 for i = 1 to 7 ' a->g range(cells(1,i),cells(65536,i)).ClearContents next i 行単位でもフリーズするなら、さらに細かくコーディングするしかないかも。
補足
WindowsXPでExcel2003です 原因はともかく、結果の回避はできそうです。 ありがとうございました。