1年間ExcelVBAを勉強して驚いたのは処理の高速化の世界があるということ

ExcelVBAやAccessVBAなどのプログラミングの勉強を始めてだいたい1年ぐらいが経ちましたが、その中で非常に驚いたことがあります。それは、プログラミングには

「さらなる高速化の世界がある」

ということです。

 

このブログでは、1年程前からとあるきっかけによって、ExcelVBAによってつくられたマクロの威力について思い知らされた、といった記事をいくつか書いてきました。

 

というのも、普通に手作業で進めていたら1時間とかそれ以上かかっていたであろう仕事が、Excelのマクロを利用することによって文字通り「一瞬」で終わってしまったからです。

 

それからは、マクロやExcelVBAに魅了されて、自分でコツコツ勉強しながら実務でもちょっとずつ使っていくという日々が続きました。それから1年が経つのですが、プログラミングの世界を勉強していると経理の仕事とはまた違った世界を見ることができます。

 

プログラミングの世界を勉強していると、今までとは全く違う価値観を垣間見ることができるのですが、それは先にも書いたように

「さらなる高速化」

です。今回はこのことについていろいろと思ったことを書いていってみます。

ただでさえ超高速なのにさらに高速化しようとしていることに驚く

スピードを超過している車の速度計

経理や事務職の仕事でExcelVBAやマクロを使ったことがある人ならわかると思うのですが、仕事に合わせて適切にマクロを組むことができれば文字通り「一瞬」でプログラムが業務を処理をしてくれてます。

 

しかし、プログラミングの世界には驚くべきことに「さらなる高速化」をしようとしている人たちがいるようです。自分はこの事実を初めて知ったときは、

 

「えっ?ただでさえ速すぎるくらいなのに、これ以上まだ速くする必要があるの?」と驚きました。

 

最初のうちはこの事実にただただ驚くことしかできなかったのですが、「なんでそこまでするんだろう?」と考えた時、この理由として何となく心当たりはありました。

ブログやWebサイトの表示速度の高速化

例えばブログを書いたりしていると、どうすればもっと上手く書けるようになるだろうかと考えて、他の人はどんな風に書いているのだろうか見にいったりして、いろいろと知りたくなるものです。

 

そのようにインターネットであちこち見て回っていると、偶然にWebサイトの構築化とか、より専門的なサイトを見つけることがあります。そのようなサイトには

 

「読者のユーザビリティ向上のためには表示速度をより速めることが必要です」

 

といった言葉が書かれている時があります。最初のうちは、

「ブログやサイトを他の人に見てもらうためにそこまでする必要があるのだろうか?」

「表示速度の向上といった難しいことは、システムエンジニアやプログラマーなどその道の凄い専門家ならできることであって、自分のような普通の人間には関係ないだろう」

なんて思ったりしていました。

 

でもよくよく考えてみると、やっぱり遅いよりかは速い方が良いというのは理解できます。自分も何らかのサイトを見ようとした時、表示されるまでに1分とか2分もかかってしまったら、さすがにそこまで待ってはいられないので離脱します。

高速化のための2つのアプローチ

『VBAエキスパート公式テキスト Access VBA スタンダード』を最近読んでいたのですが、その中に「VBAの高速化」について書かれた箇所があります。そこには次のように書かれています。

P.186

高速化の考え方

高速化には2つのアプローチがあります。1つめは、できる限り無駄な処理を行わないこと、2つめは、より処理速度の速い処理を選択することです。

VBAのプログラミングにおいて高速化を図るには2つの方法があるということですね。それが、

  • 無駄な処理を行わない
  • より処理速度の速い処理を選択

ということらしいです。

 

処理の高速化を図るというのはVBAの世界にもあるようですね。この記述を見る前は、先に書いたように処理の高速化が必要なのはブログとかWebサイトの表示速度についてだけだと思っていました。

 

しかし、今回の公式テキストの記述やVBA以外の様々なプログラミング言語について書かれたサイトなどを見てみると、処理の高速化というのはプログラミングの世界全体について言えることのようです。

 

例えば『VBAエキスパート公式テキスト Access VBA スタンダード』には「無駄な処理を行わないヒント」として「無駄な処理の多くは、繰り返し処理や分岐処理の中に隠れています」とあり、その事例のひとつとして次のようなコードを記述しています。

P.187

For i = 1 To 10

     ‘処理1

     For j = 1 To 10

           ‘処理2

           For k = 1 To 10

                 ‘処理3

           Next k

    Next j

Next i

この場合「処理1」は10回の処理、「処理2」は100回の処理、「処理3」は1000回の処理をすることになります。本書では処理1の処理時間を1/100秒短縮しても全体で0.1秒しか短縮できないが、「処理3」の処理時間を1/100秒短縮すれば、全体で10秒の時間を短縮できると記述しています。

 

先に書いた高速化のための2つのアプローチの1つめである「無駄な処理を行わないこと」という視点で考えると、例えば2つも3つもネスト(入れ子)をする必要があるのかといったことや、途中で目的の処理ができたら、全ての処理をさせずに「Exit For」などで繰り返し処理を抜けるという方法が考えられます。

 

また、2つめのアプローチである「より処理速度の速い処理を選択」する視点だと、そもそもFor…Nextステートメント使わないという方法も考えられます。

 

以上の方法以外にも、本書では処理速度の速い処理をするためのヒントとして、事前バインディングではなく実行時バインディングを選択するという方法や、変数において適切な型かつ適切な適用範囲で宣言することによってメモリの無駄な消費を抑えられるとあります。

 

要は、VBAにおける処理の高速化のためにはいろんな方法があると、そのたくさんの方法の中からより高速で適切な手法を選択していくことによってVBAの処理の高速化を図ることができるということです。

コメント