DTPのためのExcel VBA基礎 (1) はじめに
これから,以下の条件を全て満たす方を想定して,Excel VBAの基本操作を記します.
- DTP関連で1年以上の業務経験(デザイナー・校正者等不問)
- プログラミング経験なし
- Excelのボタンを使ってSUM関数ぐらいは使える
それではよろしくお願いします.
用語の整理
Excel VBAでは,Excelの「マクロ」を作ることができます.
VBAとマクロの違いが分からないと思いますので,はじめに似た用語を整理しておきましょう.
- プログラム
- コンピュータに対する命令(処理)を記述したもの。01で書かれた機械語や、人間にも意味がイメージしやすいプログラミング言語によって記述します。
- ソースコード
- あるプログラミング言語を用いて書かれたテキスト、あるいはテキストファイルのことです。
- VBA (Visual Basic for Applications)
- Microsoft Officeシリーズのプログラミング言語のことです。
- マクロ
- 「巨大な」という意味の語です。 コンピュータ関連では普通、複数の処理をまとめたプログラムのことを指します。 ExcelではVBAのコードを編集・実行するためのボタンが「マクロ」と名付けられているので、紛らわしいですがちょっとしたプログラムでもマクロと呼ぶことにします。
マクロの保存
Excelで通常作成するファイルの拡張子はxlsxですが,xlsxではマクロを実行することはできても,マクロを保存することができません.
マクロを保存するには,xlsmという特別な拡張子にして保存します.
ファイルを他者と共有する場合,マクロを渡すべきかどうかに応じて,拡張子を使い分けてください.
それと重大な注意を一つ.
Microsoft Officeを動かせるVBAはExcelより強いため,マクロを実行するとExcelの機能ctrl + z
で元に戻すことができません.(Word VBAだと戻せるのですが…)
業務でマクロを使うのでしたら,その前にバックアップを控えてください.
編集画面を開く
それではマクロを作成する画面,VBE (Visual Basic Editor)を開いてみたいと思います.
- Windows:メニューバーの表示>マクロからマクロを編集することができます.
- Mac:メニューバーの開発>マクロからマクロを編集することができます.
- Android・iOS:スマートフォンやタブレットでもMicrosoft 365を利用できますが,VBAマクロの編集・実行を行う機能は提供されていません.このため,他のいくつかのプログラミング言語と同じように,テキストエディタでコードを作成・確認することになります.もし出先でマクロの編集を行いたいのであれば,PCのマクロ編集画面にあるコード全体をテキストファイルとして予めコピーしておけばよいでしょう.
「マクロ」のボタンを押した後,Hello
という名前のマクロを新規に追加してみましょう.
MacのVBEは日本語入力しづらいため,個人的には,テキストエディタでコードを書いてから貼りつけて使っています.
簡単な例
それでは,まずは1つマクロを作ってみましょう.
Sub Hello() |
入力したら,メニューバーの動画再生ボタンのようなアイコンでマクロを上から順に読み込ませ,実行することができます.
Excelのシートをご覧ください.
A2セルにhello!という文字が入力されたと思います.
部品の説明
まずは大枠について.
Sub
〜End Sub
の範囲が1つのマクロです.
Subの直後にマクロの名前を書き,()
を入力することでマクロの定義が開始されます.
上の例ではHello
マクロを作っています.
マクロ名は日本語も通ります.
Sub
〜End Sub
で囲まれる部分はSubプロシージャと呼ばれます.プロシージャはSub以外にもあり,プログラミングに高度な機能を提供してくれます.Sub
はサブルーチン(=メインルーチンから呼び出す,意味のある処理1セット)という英単語に由来しています.
引数,すなわち括弧の中身,が空になっていますが,ここには変数を投げ込むことができます.
つまり,マクロをさらに別のマクロから呼び出す際に何か値を共有して処理したいといったときに値を投げ込む場所として用います.
マクロの学習を始めてしばらくは,括弧の中身が空のものを作ることになろうかと思います.
VBAでは必須ではありませんが,構文(=ある特定の文の組立て方の規則で,何らかの機能を与えるもの)は,インデント等によって明確にしてやるとコードが読みやすくなるので望ましいです.
ここではSub
〜End Sub
の間をインデントしました.
細かいところを見つめていきましょう.
Cells(2, 1)
は2行1列目のセル,すなわち,A2セルを意味します.
=
は等しいという意味で使う場合もありますが,プログラミングでは大抵の場合,右辺を左辺に入れるという意味で用います.
ダブルクオート"
で囲まれた範囲は文字列として扱われます.結果,A2セルにはhello!
という文字列が入力されます.
ダブルクオート"
を抜いてCells(2, 1) = hello!
としてみると,hello!
をコンピュータがどのように扱って良いかがわからずにエラーとなってしまいます.文字列であると特定されなければ,コンピュータへの命令や変数の名前である可能性を排除できないからです.
Cells(2, 1)は2行1列目という数字の並びになっていますが,この並びはA列2行目(=1列2行目)と逆順であることに注意してください.
一般にプログラミング言語はデータを(行, 列)と並べます.
ExcelのA2 (列, 行)といった表記がむしろ特殊です.
もしこれまでにプログラミングを行った経験がない場合は,ご注意ください.
問題
- 次のマクロを実行し,間の2行でどのような処理を行っているか説明してください.(ヒント:
=
とはどのような意味の記号でしたか?)
Sub 文言コピーの例() |
- VBAでなくExcelには現在日時を表示するNOW関数という関数があります.VBAでは,普通通りセルに関数を文字列として入力できるので確認してください.(ヒント:TODAY関数なら
Sub 普通のTODAY関数を入力する例() |
コメント
コードは読みやすく
リーダブルコードという書籍の冒頭に,優れたコードを書くための原則として「読みやすさの基本定理」が述べられています.
(Boswell, D. and T. Foucher (2011), The Art of Readable Code, O’Reilly Media.(邦訳:Boswell, D. and T. Foucher「リーダブルコード」, オライリー・ジャパン, 2012.))
コードは他の人が最短時間で理解できるように書かなければいけない。
コメントの付け方
アポストロフィー'
以降に書かれた文は,その行の処理から無視されます.
この機能を利用してコメントを適宜残すことで,コードが分かりやすくなります.
2つ例を挙げましょう.
Sub Hello() |
Sub Hello() |
短いコードなので上の2つのコメントは同じ意味になります.
しかし,コメントを付す位置に応じて若干ニュアンスが違います.
使い分けのため,参考例として少し長いコードをご覧ください.
Sub アイスのラインナップ() |
頭のコメントはコードを読んでいるときに目に入り,以降の処理に関わる重要性の高いコメントであると受け止められる一方,行の後ろに付帯したコメントは,その行のみに与えた補足情報と受け取られます.
一般に,行の後ろにつけたコメントは見逃すことが多いので,概要を説明したり警告文を述べるために付けるコメントは行の後半に書かないようにしましょう.
コメントアウト
処理を無視するというコメント機能の性質を使って,不要なプログラムを止めておくことができます.
これをコメントアウトといいます.
動かしたくなったときにアンコメント(=コメントから戻す)してやってください.
Sub コメントアウトの一例() |
ブロックコメント
複数行をコメントアウトしたいという場合、プログラミング言語によってはブロック(かたまり)をまとめてコメントするブロックコメントの記法が提供されていますが残念ながらVBAにはありません。
代わりに、選択行をコメントアウトしたり、コメントを外すためのボタンがメニューバーに存在します。
複数行を選択して、コメントアウト/アンコメントしてください。
コメントのせいで分かりにくくならないように
コメントだらけになるとコメントを読んでもらえません。
変数やマクロの命名を適切に行なっていれば、コメントは必要なものに絞ることができます。
コメントを含んだコード全体を、「他の人が最短時間で理解できる」ように書くことを心がけましょう。
文字列の結合
文字列の結合は+
または&
で行えます。
特に理由がなければ、&
を使う方が優れます。数字の足し算と明確に区別して、文字列の足し算を記述することができるからです。
Sub 文字の結合() |
もちろんセルに入力されている値を使うこともできます.
Sub 文字結合して同じセルへ再入力() |
応用(敬称)
- A1セルに入っている社名を
株式会社
と御中
で囲んでください.(書類を送る場合,会社には「様」でなく「御中」を使います.) - B1セルに入っている人名を
部長
と様
で囲んでください.(役職名と「様」はどちらも敬称となりますが,両方必要となる場合の書き方です.)
応用(見出しタグ)
- A1セルに入っているテキストを
<h2>
と</h2>
で囲んでください.(webページに用いられるHTMLファイルでヘッドラインのレベル2,つまり,2番目に大きいレベルでの見出しであることを表します.レベルは6段階つけることができます.) - A2セルに入っている文言を
<p>
と</p>
で囲んでください.(pはパラグラフの意味で,このタグは段落を囲うのに用います.)
ダブルクオートを入力するには?
文字列の囲みに使ったダブルクオートを入力したい場合,VBAでは2連続で""
と打ちます.
プログラミングにおいて,特定の意味を与えられてしまっている文字を通常の文字として入力することをエスケープといいます.
使用例として,靴つながりで,靴磨きの本(長谷川「靴磨きの本」亜紀書房, 2016)から題材をとりましょうか.
Sub エスケープでは二重打ちにする() |
この例では,A1セルに「"基本の磨き"はシューケアとシューシャインの2工程に分けられる.」と表示されます.
応用(webリンク)
A3セルに入っているURLの前にリンク先は<a href="
,URLの後に">こちら</a>
というテキストを結合してください.(aタグはアンカーに由来します.href属性はリンク先を表し,ハイパーリンクと参照を意味するレファレンスという英単語の略です.)
変数
変数に文字列を格納する
変数に格納しておけば,文言の修正が必要となっても一箇所のみ書き換えれば済みます.
Sub 大事なことなので二度申し上げます() |
変数は1文字である必要はありません.
識別しやすい名前をつけましょう.
Sub かえるの合唱() |
できない命名
数字から変数名を始めることはできません。
4kwa = "くわ、くわ、くわ、くわ"
のようなコードはエラーになります。
kaeru no uta
のように途中にスペースやタブを挟むこともできません。
長い変数名には、kaeruNoUta
のように最初は小文字だけど区切りだけ大文字という形式を用いるようにすると良いでしょう。
長い変数名を付けるにはいくつかの記法があります。蛇に似ているスネーク記法kaeru_no_uta
、デコボコは駱駝の背中のコブに似ているキャメル記法kaeruNoUta
、頭も大文字ではじめるパスカル記法KaeruNoUta
といったものが代表的です。VBAではマクロの名前などを大文字で始めるパスカル記法とし、マクロの中で定義する変数はキャメル記法とすると、元から存在するマクロや変数と記法が揃うので読みやすくなります。
問題
変数kero
にけろけろ
という文言を格納し、どこか好きなセルにその変数の中身を入力してください。
数値の入力
文字列の入力にはダブルクオート"
が必要でしたが、数値の場合にはダブルクオートは要りません。
計算も簡単な記述で行えます。
Sub 数値にはダブルクオートが要らない() |
変数でセル位置を指定する
数値を変数に格納し,セルを指定することがVBAプログラミングでは非常に多くあります.
次のような形です.
Sub 変数でセル位置を指定する() |
i = 2
なら2行目,i = 3
なら3行目に文言を入れることができます.
簡単かもしれませんが,これでCells(i, 1) = "hello!"
の部分のコードを変えることなく,処理するセルだけを可変にすることができるようになりました.
A1セルを指定するのに,Cells(1, "A")
という書き方もできます.しかし,変数を使って指定するセルを動かすことを考えれば,アルファベットより数字で書いておいた方が楽です.
問題
- 2つの変数
i
,j
を用いてセルの位置を指定し,どこかのセルに文言を入力できますか? - 新しく変数を作らずに,
i + 1
かj + 1
を用いて,いま入力したセルの右隣に同じ文言を入力してください.
型を指定して安全に
次のように在庫数を入力しているマクロがあるとします.
コピーして実行してみてください.
Sub ありがちな間違いを犯した在庫数マクロ() |
コードを書いていたり,引き継いだときに,変数が文字列であるか数値であるか分からなくなってしまうと,ちょっとしたことでバグを引き起こしかねません.
このため,変数には型を宣言し,例えば数値の型にして文字列を投げ込めないようにするなど安全のために制約を課して使うべきです.
VBAには様々な型が用意されていますが,まずは文字列型String
と長整数型Long
を覚えましょう.
他の型は出会ったときに覚えればいいと思います.
ちなみに,英単語そのままに整数型としてInteger
という型名が存在します.しかし,コンピュータの扱える桁数は無限ではありませんから,桁数に制限があります.現代では,桁数が大きくても処理に困らなくなり,昔からあるInteger型を使う必要はなくなりました.VBAでLong
と名付けられた長い整数を格納できる型を使うのが一般的です.
宣言を省略した場合には何でも格納できるバリアント型Variant
となって,適宜文字列や数値として解釈されます.Dim 変数名
とだけ書いて,As 型名
を省略した場合も同様です.しかし,先のようにバグの原因となるため,型名を知っているのであれば適切な型に定義するのが望ましいと言えます.知らない型の名前を調べて回る必要はありませんが,型名を知っているならば安全性を高めておくべきでしょう.
文字列型の例
型宣言の構文は
Dim 変数名 As 型名 |
です.
似た要領で,2種類の数字を格納する変数を作ることもできます.複数の値を格納する変数を配列といい,宣言に用いるDim
は次元を意味するディメンションに由来しています.
変数str
を文字列型String
で宣言する場合,
Sub 変数の型を宣言する例() |
のようになります.
問題
- 変数
takeshiYearOld
を整数型で宣言してください. - さらに,変数
takeshiName
を文字列型で宣言してください. takeshiYearOld
にジャイアン
という文言を格納しようとすると,エラーになることを確認してください.takeshiName
にジャイアン
という文言を格納し,takeshiName
をどこかのセルに書き出してください.
長整数型の例
問題のあった在庫数マクロでは次のように変数stock1
・stock2
を整数で宣言しておくべきでした.
Sub ちょっとミスしても正しく動かせる在庫数マクロ() |
数値の型に文字列で数字が流し込まれると,問題がない場合には正しく数値として解釈してくれます.
ですから,A1セルには30と表示されます.
変数宣言の強制
バグを減らすために,変数宣言を強制するというオプションを設定することが強く推奨されています.
macOSのExcelだと,VBEの環境設定で開くウィンドウから設定できます.
次回
マクロでやりたいことはルーティンワークの自動化です.
次回は処理を反復するためにFor文を紹介します.