言葉の定義
今回のタイトルには矛盾を感じるかもしれない。「知る」という言葉は、「覚える」という意味で使われることもあるからだ。
ここで私がいう「知る」とは、「存在を認識すること」だと考えてほしい。一方、「覚える」という言葉も広い意味で使われるが、ここでは、「忘れずにはっきりと記憶にとどめておく」という意味で使う。
具体例
例えば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で作成された手順書で、次のように番号が振られているとする。
既存の1と2の間に、新しく手順が必要になった場合、挿入自体は簡単でも、後続の番号を全て手で直すのは面倒くさい。
そこで、このようなマクロを作っておくと便利だ。
Sub 文字プラス() For Each 文字 In Selection If 文字.Value <> "" Then 文字.Value = Chr(Asc(文字.Value) + 1) Next End Sub
変更が必要な番号を選択し、実行すると、
このように、それぞれ一つ番号が増える。
このように、Ascで文字コードに戻し、1を足してからChrで文字に戻すことで、次の文字を得られる。
文字マイナスも作っておけば、手順が一つ減った場合も対応できる。
※上記のマクロは1文字にしか対応していないので、番号と見出しのセルが分かれていない場合は別途工夫が必要である。
※Excel方眼紙形式のドキュメントを例に挙げたが、文章メインのドキュメントをExcelで作成することは推奨しない。ただ、人の作ったものをメンテナンスするケースもあるため、このようなマクロが重宝している。