t-hom’s diary

主にVBAネタを扱っているブログです。

VBA 脱初心者を目指す ~ Functionを使いこなすにはHowではなく、Whatに注目する

VBAではFunctionプロシージャを使いこなせるようになったら、中級の域に達したと言っていいと思う。あくまで個人的な意見であるが。

さて、Functionプロシージャの仕組み自体は、それほど難しいものではない。ただ初心者の方と話をしていると、Functionを使うと「あっちいったりこっちいったり」するので難しいとのこと。

ひょっとするとコードを読み込んでいくなかで、Functionの中身まで読んでしまうことが難しいと感じる原因かもしれない。

こういうコードの読み方をしていないだろうか。
f:id:t-hom:20160925031617p:plain

Functionはプロシージャのコードが見えてしまっているがために、中身を理解しようとして、本筋に戻った時に「あれ?なんだっけ」となりやすい。

Functionプロシージャはそういう読み方をするものではない。
むしろ、コードを隅々まで読みたくないがために、Functionプロシージャを作るのだと考えることもできる。
※それがFunctionの主目的ではないが、副次的なメリットである。

Functionを使いこなすにはHowではなく、Whatに注目する

VBAの組み込み関数を使用するケースをイメージしてほしい。
たとえば文字列を左から任意個切り取る、Left関数など。
使うときにいちいち仕組みがどうなっているか気にするだろうか。
まあ一度くらい気にしたことはあるかもしれないが、大抵の場合意識するのは「What(何がなされるか)」であって、「How(どのようになされるか)」ではない。

先ほどのLeft関数でたとえば、以下のプログラムを作るとする。

Sub Left関数サンプル
    MsgBox Left("Hello, VBA", 5)
End Sub

この場合、「"Hello, VBA"に対して左から5文字切り取られる」ということは意識しても、内部でどのように文字列を加工しているかは意識しないだろう。

自分でFunctionプロシージャを作るときも、基本的な考え方は同じである。
Functionを作るときはもちろんHowを意識する必要があるが、いちど作ってしまえばWhatを覚えておくだけで良い。

他人の書いたFunctionを読む

他人の書いたプログラムを読むとき、Functionが多用されているケースはどう読むのか。
メインコードから順にトレースしていきFunction呼び出しが出てきたときにその中身を確認する方法もあるが、この読み方だと「あっちいったりこっちいったり」になってしまう。

この読み方が難しいのは、メインコードのロジックを一旦脇においてFunctionの中身を確認する際、Functionのロジックに集中すると、脇においていたメインコードのロジックを忘れてしまう点にある。
あるいはメインロジックとFunctionのロジックがごっちゃになってこんがらがる。

個人的におススメする読み方は、まず最初にFunctionを読んでWhatを把握してしまうことである。
覚えておくのが難しければ、最初に理解したタイミングでコメントを書いてしまえばよい。

中にはFunctionの中でさらに別のFunctionを読んでいるケースもある。
難しいと感じる場合は一度呼び出し関係を図にしてしまうといい。

【参考】
thom.hateblo.jp

自分でFunctionを作るときに気を付けたいこと

まず一番大事なのは、Function名である。
そのFunctionが何をするものなのか、つまりWhatを適切に表現した名前を付けることで、中身を読む前にその関数の働きを想像することができる。
また、一度読んだ後に名前と結び付けて記憶に残りやすい。

myFunc1といった適当な名前を付けてしまうと、結局内部動作とmyFunc1という関数名の結び付けを頭の中で無理に覚えておかなければならない。
名前から自然にその働きが想起できることが重要である。ひねったりせず、安直で一目瞭然な名前を付けること。

また、自分だけでなく他人が読んだときにも分かりやすい名前にしておくことが重要だ。
ためしにFunction名だけ同僚に見せて、何をする関数なのか当ててもらうと良い。
的中または惜しい答えが返ってきたら、それは理想的な名前に近いと思われる。
「いや、そのまんまやんけお前!」とツッコミをいただいたら100点だ。

GetApplicationConfigurationStringやSaveAllChangeSetToDatabaseなんていう長い関数名の事例もある。
以下のページ、トピ主は長すぎる関数名に違和感を感じているようだが、対するコメントはおおむね「省略すべきではない」との見方が多い。

【参考】長い関数名、変数名、どこまで許せる? | スラド デベロッパー

VBAなら日本語でFunction名を付けることもできる。
例) GetApplicationConfigurationStringの代わりに「アプリ設定の文字列を取得」という関数名
個人や内輪で使うツールなら日本語を使っても問題ない。

次に大事なのは、参照透過性(さんしょうとうかせい)である。
これについては過去に書いた以下の記事を参照してほしい。
thom.hateblo.jp

まとめ

  • Functionは、Whatを把握するために読む。WhatがわかればHowは忘れて良い。
  • 呼び出し関係が分かりにくいときは図にまとめよう。
  • 自分でFunctionを作るときは、その働きを想起させる適切な名前を付ける。
  • Functionはなるべく参照透過に設計する。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。