前回に引き続き、セミナーで出てきた話題を一つ。
セミナー中の質問でよくこういうものがある。
「どういう時はエクセルのワークシート関数を使うべきで、どういう時はマクロ使うべきなのでしょうか?」
今日は、そんな話題について回答したい。
まず、マクロを使った方が良い絶対的な例としては、エクセルの関数でできないことを実現する場合が挙げられる。
1. ある元データに基づいて、複数のシートを作りながらデータを入力していく
2. 不特定な複数のエクセルファイルを開き、その中身を調べていき、それをもとに一つの集計表を作る
3. エクセルのワークシート関数には存在しない複雑な計算をする
4. エクセルシートの上にあるセルの状態(例えばセルの高さとか幅とか、そのセルで使われているフォントとか)によって処理を振り分けるとき
こんな時には、マクロを使った方がいいのは言うまでもない(というより、エクセルの関数では無理)。
一方、エクセルのワークシート関数でも実現できるような計算をするときは、マクロでもどちらでも可能だ。
そういうときには、どちらを選ぶのか。
基本的には、大掛かりな事をするのでなければ、エクセルのワークシート関数で十分だ。
ただ、以下の条件が当てはまる的には、マクロの方がよいだろう。
1. ワークシート関数で実現しようとすると、とてもややこしい数式なってしまう場合
2. 他のシート、他のファイルのデータを沢山利用して集計表などを作る場合
ワークシート関数で実現しようとするととてもややこしい数式なってしまう場合がある。
小川も、IBMで管理部門系の部署にいたとき、一つのセルの中にIf文が三つも四つも入った上に、複雑な財務関数を「高度に」連携させたややこしい仕組みのエクセルファイルを見ては、何度も頭をクラクラさせたものだ
(^^;
こういうややこしい数式は、作った時には何とかなるのだが、得てして、してしばらくすると誰にもメンテナンスできない状態になってしまう。
可読性が低く、どこで何が残っているのかが分りにくいからだ。
その点、同じ計算でも、マクロ実行させた上でその計算値がでてくるようなものを作ると、可読性が高く、読みやすく、メンテナンスのしやすいものを作ることができる。
マクロの中にコメントを振ることもできるので、引き継ぎも容易だ。
それからもう一つ。
複数のシート間、複数のファイル間でデータをやりとりする場合にも、あまりワークシート関数は使わない方がよいだろうと思う。
それはどうしてかというと、例えばある台帳を基に取引先ごとの伝票のファイルを複数作るといった場合、ワークシート関数を使うと、作るのに手間もかかる上に、出来上がったファイルは、台帳上のデータが損なわれてしまうとすぐに壊れてしまう、とても脆弱な伝票になる。
その点、マクロを使って台帳上にあるデータを分析して勝手にエクセルファイルを作成し、そのファイルにデータを書き込むようなマクロを作る場合は、そのような問題も起こらない。
なぜなら、新しいファイルに書き込まれるのは台帳になっているシートへのリンクではなく、その台帳に入っているデータをもとに計算された値そのものだからだ。
そして、そういう形で処理をするともう一つのメリットがある。
それは何かというと、マクロを使って計算した結果が書き込まれただけのファイルは、台帳のデータの入ったファイルのセルの値も参照していないので、そのファイル単体でどこへでも移動できるということだ。
例えば、そのファイルだけをメールに添付して上司や取引先に送ってもまったく問題なく動作する。
これが、エクセルの関数を使った場合にはそうは行かない。
別のファイルにあるセルの値を参照しているエクセルファイルがある場合、そのファイルを送られた相手がファイルを開く都度、「このファイルには他のデータソースへのリンクが含まれています」といった趣旨のメッセージが出てきて、わずらわしいことになる。
今回は、このメッセージがどういう意味なのかということについては特に書かないが。
そもそも、こういうメッセージは、出ないようにした方が良いということは間違いない。
結論をくり返すと:
どういうときにエクセルのワークシート関数ではなき、マクロを使うべきかというと、
1. ワークシート関数で実現しようとすると、とてもややこしい数式なってしまう場合
2. 他のシート、他のファイルのデータを沢山利用して集計表などを作る場合
ということになる。