【第1位(続き)】エクセルVBA高速化ランキング
前回は、「エクセルVBA高速化ランキング第1位の発表」と題して
「画面更新の非表示」というものについて、とにかくこれはエクセルVBA
の高速化にはダントツの効果があり、当方で実施したベンチマークの実測値でも
実に14倍の速さが出たという話をしましたが、
実は、この「画面更新の非表示」というものには一つ大きな問題があります。
今回は、その辺について話していきたいと思います。
画面更新の【半】非表示
その問題とは、前回の最後にも言いましたが、
「画面更新の非表示」って詰るところ、ユーザーに動作を見せない!という ことに他なりませんので、いくら高速化ができるからといって開発者が勝手 にユーザーに動作状況が見えないようなプログラムなんてものを作ってしま ってもいいのだろうか?という疑問です。
私たちの日常生活の中でも、
例えば、エレベータに乗るときにボタンを押したんだけど中々来ない。 「いまどの階にいるんだろう?当分来ないなら、どうせ3階までなんだから 階段使ったっていいんだよなぁーもぉ。イライラ!」
なんてこと、よくありますよね。
人間、待つ時間が予め分かってさえいれば、多少その時間が長かったとして も案外苦にならずに待てるものですが、 「あとどれくらい待てばいいのかが全くわからない。」 という場合には、ひどくイライラし、苦痛に感じてしまうものです。
なので最近では、歩行者用の信号でも青に変わるまでの残り時間がランプ表 示されるようなものや、バスなどでも、今どの辺まで来ているのかが分かる ような表示のある停留所というのを多く見うけるようになってきました。
前置きが長くなりましたが、そこできょうの本題ですが、 システムの場合においても、これとまったく同じことが言えるのではないか と思っています。
そこで、今日ご紹介する内容は、待ち時間にユーザーをイライラさせないた めのテクニックです。
それは一言でいうと、「一部分だけわざと見せる」という手法です。
これは、全てを非表示にするよりもスピードが遅くなることは当然ですし、 表示と非表示の切り替え自体にも時間は食いますのでスピードダウンにはな ります。
が、この手法を使うことで、全てを非表示にした場合に生じるユーザーの イライラ感や不安感といったものが格段に解消される効果があります。
正確には、「画面更新の非表示」+「一部分だけわざと見せる」ということ になります。
そこで、前回の「画面更新の非表示」を使ったサンプル2のプログラムを、 この+「一部分だけを見せる」という手法を使って書き直すと、次のように なります。
サンプル3 ―――――――――――――――――――――――――+ Application.ScreenUpdating = False For i = 1 To 1000 Application.ScreenUpdating = False For j = 1 To 99 Cells(i, j).Select ActiveCell.FormulaR1C1 = 1 Next j Application.ScreenUpdating = True Cells(i, 100).Select ActiveCell.FormulaR1C1 = 1 Next i Application.ScreenUpdating = True ―――――――――――――――――――――――――+こうすると、処理速度の実測値は
サンプル2が 11秒
だったのに対して
サンプル3が 31秒
という結果です。
これだと、サンプル2よりは約3倍の時間が掛かるということになるわけな のですが、それでも前回のサンプル1に比べれば5倍以上速い速度が期待で きる結果となっています。
処理速度をまとめると、
サンプル1は 154秒 ・・・[全表示]
サンプル2は 11秒 ・・・[全非表示]
サンプル3は 31秒 ・・・[一部分だけ表示]
です。
じゃぁ、どれが一番良いのか?については、まぁ、ケースbyケースでもあるわけですが
たとえば私の所では、エクセルで大量のデータを扱うようなシステム開発の 依頼のプレゼンなどをやる時には、この「画面更新の非表示」+「一部分だ けわざと見せる」という手法を活用したデモを行なうようにしています。
なぜなら、これだとデモを見てくれるクライアントのリアクションが全然 良くなりますので^^。(これはあくまでも私の経験則での話ですが。。)
ちなみに、サンプル3をもうひと工夫して下記サンプル4のようにすると、 より一層、見栄えはよくなりますので、ぜひご参考にしてみてください。
サンプル4 ―――――――――――――――――――――――――+ Application.ScreenUpdating = False For i = 1 To 1000 Application.ScreenUpdating = True Cells(i, 1).Select ActiveCell.FormulaR1C1 = 1 Application.ScreenUpdating = False For j = 2 To 100 Cells(i, j).Select ActiveCell.FormulaR1C1 = 1 Next j Next i Application.ScreenUpdating = True ―――――――――――――――――――――――――+サンプル4は 32秒・・・[最初の列の更新だけを見せる]
(サンプル3との違いは、見せる部分が最初か最後か、の違いです。)
今回はこれで終了です。
NEXT >>
・第2位 CSVのシート取り込み
・高速化ランキングの目次へ戻る