前田 (2011年11月24日 19:39) システムソリューション事業部 / ビジネスソリューション課
こんにちは。 システムソリューション事業部 ビジネスソリューション課の前田です。
Excel VBAでは、 セルや行、列など、いわゆるRangeオブジェクトを操作することが多くあります。
例えば以下のような見出し行、サンプル行があるシートがあり、 データを読み込んで同じ書式で記録していく なんてことをやりたくなるものです。
例えばこんなのがあって...
こんな風にしたいとか
しかし、処理する行数が増えれば増えるほど、 処理に時間がかかってしまい、 ユーザにとってはストレスがたまります。
オブジェクトのコピー&ペーストは それなりにリソースを使うので 件数などを鑑みて、色々と考慮しないと パフォーマンスが落ちてしまいます。
対策としては、以下のようなものがあります。
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. 値だけコピーすればいいようにシートを工夫する。 究極ですが、要件によってはできないかもですね。 要は工夫ということですね。
では、また。
Excel VBAでRangeオブジェクトのコピーは要注意
前田 (2011年11月24日 19:39)
システムソリューション事業部 / ビジネスソリューション課
こんにちは。
システムソリューション事業部
ビジネスソリューション課の前田です。
Excel VBAでは、
セルや行、列など、いわゆるRangeオブジェクトを操作することが多くあります。
例えば以下のような見出し行、サンプル行があるシートがあり、
データを読み込んで同じ書式で記録していく
なんてことをやりたくなるものです。
例えばこんなのがあって...

こんな風にしたいとか

しかし、処理する行数が増えれば増えるほど、
処理に時間がかかってしまい、
ユーザにとってはストレスがたまります。
オブジェクトのコピー&ペーストは
それなりにリソースを使うので
件数などを鑑みて、色々と考慮しないと
パフォーマンスが落ちてしまいます。
対策としては、以下のようなものがあります。
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. 値だけコピーすればいいようにシートを工夫する。
究極ですが、要件によってはできないかもですね。
要は工夫ということですね。
では、また。