おそらく多くのユーザーが興味を持っているテーマだと思いますが、Webや雑誌などではあまり詳細に検証されるケースは少ないと感じます。今回は「新しいExcel 2007って、速度的にどーよ?」について書きます。ただ、Excel 2007は大きく仕様が変更されましたので、単純に同じマクロで検証するのは不適切なのかもしれません。そうした点も含めて、こうした動作速度の話は今後も何回かに分けて続けるつもりです。まずは、拙作「Excelベンチマーク」を使って測定してみました。「Excelベンチマーク」は、マクロで連続動作を自動的に実行し、終了までにかかった時間を計測する仕組みです。
xlBench2000では次のテストを行います。
テストに使用したパソコンのスペックは、以下の通りです。いわゆるショップブランドのパソコンです。
CPU:Intel(R) Celeron(R) プロセッサ D335 (2.80GHz)
チップセット:Intel(R) 845GV チップセット
メモリ:PC2700 768MB
ビデオ:Intel(R) エクストリームグラフィックス 3D (Intel(R) 845GV 内蔵)
OS:Windows(R) XP Home Edition Service Pack2
さて、結果をご覧ください。単位は秒です。
ほとんどのテストで、Excel 2007は散々な結果に終わりました。UserFormテストに関しては、ほとんど差がありません。これは画面を見た印象とも一致します。テキストボックスやリストボックスの操作はExcel 2003と同じくらいの速度でした。それ以外は・・・遅いですね(^^; このへんに関しては、新しいオブジェクトとの関連などいろいろな事情があるでしょうし、そうした事情の多くは公式なドキュメントとして公開されていませんので、まずは想像するしかないのですが。
最初の描画テストは、ワークシート上にオートシェイプを挿入するテストです。中心となるコードは
Sheet1.Shapes.AddShape(msoShapeOval, pos, pos2, 100, 100).Select Selection.ShapeRange.Fill.ForeColor.SchemeColor = Val(Right(pos, 1))
です。位置を決めるposとpos2は乱数で決めています。塗りつぶしの色は、乱数posの下一桁を設定しています。このコード自体は、Excel 2003でもExcel 2007でも問題なく動作します。ちなみに、Excel 2007では描画エンジンが新しくなりましたので、オートシェイプの初期値や設定できる項目などがExcel 2003に比べて変わっています。しかし、悲しいかな、Excel 2007(RTM版)でオートシェイプの挿入をマクロ記録しても、何も記録されません。ローカルウィンドウで調べたところ、従来と同じShapeオブジェクトが使われているようですし、従来と同じ方法でオブジェクトにアクセスできます。また、新しく追加されたオブジェクトの中には、オートシェイプに関係するオブジェクトが見あたりませんので、どうやらExcel 2007でもShapeオブジェクトで間違いなさそうです。遅くなった原因は、高機能になった新型の描画エンジンが原因なのでしょうか。
まぁ、オートシェイプの挙動が遅くなったのは、まだ許せる範囲です。一般的なユーザーは、オートシェイプの挿入や設定に関して、それほど神経質ではないでしょう。しかし、次の再計算テストが遅くなったのは問題です。これは描画エンジンだとか、新しいオブジェクトだとかの話ではありません。表計算ソフトとして最も重要なポイントです。
再計算テストは次のように行いました。
セルA2に「=A1+1」という数式を入力します。その下のセルA3には「=A2+1」というように、上のセルに1を加えるという数式をセル範囲A2:A30001まで30000個準備します。セルA1を変更すると30000個の参照式が再計算されますので、この速度を計測しました。セルA1の変更は400回です。
step = 4 For i = 1 To 100 * step Sheet1.Range("A1") = i Next i
ScreenUpdatingプロパティにFalseを設定して画面の更新を抑止するなど、マクロ的に高速化する手はいくつか考えられますが、何よりも一般的な手動操作で再計算が遅いようでは話になりません。何とかExcelの設定だけで速度の改善を検討したいところです。このへんの検証はかなり時間がかかりますので、後日あらためて行うつもりです。
さて、最も遅くなったグラフの書き換えですが・・・これは、次のコンテンツにまとめようと思います。先日「1つのコンテンツが長すぎて読むのが大変」とお叱りのメールをいただきましたので(^^; この話は何度かに分けて書くことにしましょう。