t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 関数は知っておくべき。しかし必ずしも覚える必要はない。

言葉の定義

今回のタイトルには矛盾を感じるかもしれない。「知る」という言葉は、「覚える」という意味で使われることもあるからだ。

ここで私がいう「知る」とは、「存在を認識すること」だと考えてほしい。一方、「覚える」という言葉も広い意味で使われるが、ここでは、「忘れずにはっきりと記憶にとどめておく」という意味で使う。

具体例

例えばVBAで文字列の一部分を取り出したいとき、「何かそのような関数があった気がするが思い出せない」という状態。これで良い。存在することさえ知っていれば関数名を忘れても一覧から検索できるし、まして使い方など綺麗さっぱり忘れてしまって良い。

一方で、存在を知らない場合、検索以前に「文字列の一部を取り出す」というアイデアがそもそも思いつかない可能性だってある。アイデアは自分が持っている知識の中から生まれる。したがって、知識が無ければそもそもアイデアなど浮かんでこない。

例えばこの世に鳥や虫などの飛ぶ生き物が存在しなかったら、人間は飛行機を発明しなかっただろう。空が飛べるものであるなどと思わないだろうし、そもそも飛ぶとはどういうことかすら知らないからだ。したがって、どうやったら飛べるかなどと悩むことすらない。

関数を知る

VBAの関数もこれと同じで、まずどのようなことができるのかをざっくりと抑えておくことである。

  • 文字列の一部を取り出すことができる。
  • 両端のスペースを取り除くことができる。
  • 文字数を取り出すことができる。
  • 文字と文字コードを相互に置き換えることができる。
  • 文字列の特定文字を置換することができる。

関数テクニック

たとえば、一次元配列の内容を全てタブ区切りで表示させたいとき、このように直接vbTabを挟むコードを書けば良い。

Sub hoge()
    Dim Arr(1 To 3) As String
    Arr(1) = "A"
    Arr(2) = "B"
    Arr(3) = "C"
    MsgBox Arr(1) & vbTab & Arr(2) & vbTab & Arr(3)
End Sub

しかしJoin関数を知っていれば、もっと楽に書ける。

Sub hoge2()
    Dim Arr(1 To 3) As String
    Arr(1) = "A"
    Arr(2) = "B"
    Arr(3) = "C"
    MsgBox Join(Arr, vbTab)
End Sub


また、A~Fまでの文字を出力したいとき、このように書いていないだろうか。

Sub fuga()
    Debug.Print "A"
    Debug.Print "B"
    Debug.Print "C"
    Debug.Print "D"
    Debug.Print "E"
    Debug.Print "F"
End Sub

Asc関数とChr関数を知っていれば、次のように書ける。

Sub fuga2()
    For i = Asc("A") To Asc("F")
        Debug.Print Chr(i)
    Next
End Sub

Asc関数は、文字を文字コードに変換し、Chr関数は文字コードを文字に変換する。
文字コードはA~Zの順に並んでいるので、For文で回すことができるのだ。


ChrとAscを応用すると、次のようなこともできる。
例えばExcelで作成された手順書で、次のように番号が振られているとする。
f:id:t-hom:20151117065732p:plain

既存の1と2の間に、新しく手順が必要になった場合、挿入自体は簡単でも、後続の番号を全て手で直すのは面倒くさい。
f:id:t-hom:20151117070047p:plain

そこで、このようなマクロを作っておくと便利だ。

Sub 文字プラス()
    For Each 文字 In Selection
        If 文字.Value <> "" Then 文字.Value = Chr(Asc(文字.Value) + 1)
    Next
End Sub

変更が必要な番号を選択し、実行すると、
f:id:t-hom:20151117070611p:plain

このように、それぞれ一つ番号が増える。
f:id:t-hom:20151117071448p:plain

このように、Ascで文字コードに戻し、1を足してからChrで文字に戻すことで、次の文字を得られる。
文字マイナスも作っておけば、手順が一つ減った場合も対応できる。

※上記のマクロは1文字にしか対応していないので、番号と見出しのセルが分かれていない場合は別途工夫が必要である。
Excel方眼紙形式のドキュメントを例に挙げたが、文章メインのドキュメントをExcelで作成することは推奨しない。ただ、人の作ったものをメンテナンスするケースもあるため、このようなマクロが重宝している。

まとめ

関数の知識は、他の言語を学習するときにも役立つ。どのような言語でも基本的な関数は大体備わっているので、勘が働くようになる。

まずは、いろんな関数を知ることが大切だ。それによってプログラミングの幅が広がり、色々なアイデアが浮かぶようになる。もちろん、覚えられたらそれに越したことはないが、あまり拘るとプログラミングの学習がしんどくなってくるので、覚えなくても良い。

VBA 関数」と検索すると、関数の一覧が掲載されたサイトがいくつか見つかるので、一通り目を通しておくと良いと思う。

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