システム開発ブログ

Excel VBAでRangeオブジェクトのコピーは要注意

前田

前田 (2011年11月24日 19:39)
システムソリューション事業部 / ビジネスソリューション課

こんにちは。
システムソリューション事業部
ビジネスソリューション課の前田です。

Excel VBAでは、
セルや行、列など、いわゆるRangeオブジェクトを操作することが多くあります。

例えば以下のような見出し行、サンプル行があるシートがあり、
データを読み込んで同じ書式で記録していく
なんてことをやりたくなるものです。

例えばこんなのがあって...
sample_only.jpg

こんな風にしたいとか
sample_plus_1.jpg

しかし、処理する行数が増えれば増えるほど、
処理に時間がかかってしまい、
ユーザにとってはストレスがたまります。

オブジェクトのコピー&ペーストは
それなりにリソースを使うので
件数などを鑑みて、色々と考慮しないと
パフォーマンスが落ちてしまいます。

対策としては、以下のようなものがあります。

1. Copy Destination:= を使う
Copyメソッド + PasteSpecialメソッドでもコピーはできますが、
Copyメソッド + パラメータDestination:= を使ったほうが早いです。

2. コピーする範囲を限定する。
Sheet1.Rows("2:2")
よりは、
Sheet1.Range("A2:H2")
の方がコピーする範囲が少ないです。

3. 処理の間、画面更新をさせない
画面更新されると、見た目にちらちらするだけではなく
スクリーンの処理だけで速度が落ちます。
以下のような設定で画面更新を抑止します。
Application.ScreenUpdating = False

4. 再計算モードを手動にする
変更ごとに再計算をしないようにして、
速度をアップします。
Application.Calculation = xlManual

5. Rangeオブジェクトをコピーせずに、書式設定もコードで行う。
極論ですが、この方が早い(ことが多い)です。
或いは書式のみコピーする感じですね。
ちなみに、同じオブジェクトに何度もアクセスする場合は、
オブジェクト変数にセットするか
With句を使う方が早いです。

6. 値だけコピーすればいいようにシートを工夫する。
究極ですが、要件によってはできないかもですね。
要は工夫ということですね。

では、また。

システムのトラブル解決を承ります。すぐにシステムリフォームを体験できますシステム診断・システムリフォームのお申し込みはこちらから。

システム開発ブログ

Twitterでilovex_officialをフォローしてください

最近の記事

カテゴリー

部署

月別アーカイブ

以前の部署別ブログ

ページのトップ