これから,以下の条件を全て満たす方を想定して,Excel VBAの基本操作を記します.

  • DTP関連で1年以上の業務経験(デザイナー・校正者等不問)
  • プログラミング経験なし
  • Excelのボタンを使ってSUM関数ぐらいは使える

それではよろしくお願いします.

用語の整理

Excel VBAでは,Excelの「マクロ」を作ることができます.
VBAとマクロの違いが分からないと思いますので,はじめに似た用語を整理しておきましょう.

プログラム
コンピュータに対する命令(処理)を記述したもの。01で書かれた機械語や、人間にも意味がイメージしやすいプログラミング言語によって記述します。
ソースコード
あるプログラミング言語を用いて書かれたテキスト、あるいはテキストファイルのことです。
VBA (Visual Basic for Applications)
Microsoft Officeシリーズのプログラミング言語のことです。
マクロ
「巨大な」という意味の語です。 コンピュータ関連では普通、複数の処理をまとめたプログラムのことを指します。 ExcelではVBAのコードを編集・実行するためのボタンが「マクロ」と名付けられているので、紛らわしいですがちょっとしたプログラムでもマクロと呼ぶことにします。

マクロの保存

Excelで通常作成するファイルの拡張子はxlsxですが,xlsxではマクロを実行することはできても,マクロを保存することができません.
マクロを保存するには,xlsmという特別な拡張子にして保存します.
ファイルを他者と共有する場合,マクロを渡すべきかどうかに応じて,拡張子を使い分けてください.

拡張子xlsmに変更して保存する

それと重大な注意を一つ.
Microsoft Officeを動かせるVBAはExcelより強いため,マクロを実行するとExcelの機能ctrl + zで元に戻すことができません.(Word VBAだと戻せるのですが…)
業務でマクロを使うのでしたら,その前にバックアップを控えてください.

編集画面を開く

それではマクロを作成する画面,VBE (Visual Basic Editor)を開いてみたいと思います.

  • Windows:メニューバーの表示>マクロからマクロを編集することができます.
  • Mac:メニューバーの開発>マクロからマクロを編集することができます.
  • Android・iOS:スマートフォンやタブレットでもMicrosoft 365を利用できますが,VBAマクロの編集・実行を行う機能は提供されていません.このため,他のいくつかのプログラミング言語と同じように,テキストエディタでコードを作成・確認することになります.もし出先でマクロの編集を行いたいのであれば,PCのマクロ編集画面にあるコード全体をテキストファイルとして予めコピーしておけばよいでしょう.

MacでVBEを開く例

「マクロ」のボタンを押した後,Helloという名前のマクロを新規に追加してみましょう.
MacのVBEは日本語入力しづらいため,個人的には,テキストエディタでコードを書いてから貼りつけて使っています.

マクロの登録

簡単な例

それでは,まずは1つマクロを作ってみましょう.

Sub Hello()
Cells(2, 1) = "hello!"
End Sub

入力したら,メニューバーの動画再生ボタンのようなアイコンでマクロを上から順に読み込ませ,実行することができます.

マクロ実行ボタンの位置

Excelのシートをご覧ください.
A2セルにhello!という文字が入力されたと思います.

マクロによる文字入力の例

部品の説明

まずは大枠について.

SubEnd Subの範囲が1つのマクロです.
Subの直後にマクロの名前を書き,()を入力することでマクロの定義が開始されます.
上の例ではHelloマクロを作っています.
マクロ名は日本語も通ります.

SubEnd Subで囲まれる部分はSubプロシージャと呼ばれます.プロシージャはSub以外にもあり,プログラミングに高度な機能を提供してくれます.Subはサブルーチン(=メインルーチンから呼び出す,意味のある処理1セット)という英単語に由来しています.

引数,すなわち括弧の中身,が空になっていますが,ここには変数を投げ込むことができます.
つまり,マクロをさらに別のマクロから呼び出す際に何か値を共有して処理したいといったときに値を投げ込む場所として用います.
マクロの学習を始めてしばらくは,括弧の中身が空のものを作ることになろうかと思います.

VBAでは必須ではありませんが,構文(=ある特定の文の組立て方の規則で,何らかの機能を与えるもの)は,インデント等によって明確にしてやるとコードが読みやすくなるので望ましいです.
ここではSubEnd 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 (列, 行)といった表記がむしろ特殊です.
もしこれまでにプログラミングを行った経験がない場合は,ご注意ください.

問題
  1. 次のマクロを実行し,間の2行でどのような処理を行っているか説明してください.(ヒント:=とはどのような意味の記号でしたか?)
Sub 文言コピーの例()
Cells(1, 1) = "文言"
Cells(1, 2) = Cells(1, 1)
End Sub
  1. VBAでなくExcelには現在日時を表示するNOW関数という関数があります.VBAでは,普通通りセルに関数を文字列として入力できるので確認してください.(ヒント:TODAY関数なら
Sub 普通のTODAY関数を入力する例()
Cells(1, 1) = "=TODAY()"
End Sub
となります。)

コメント

コードは読みやすく

リーダブルコードという書籍の冒頭に,優れたコードを書くための原則として「読みやすさの基本定理」が述べられています.
(Boswell, D. and T. Foucher (2011), The Art of Readable Code, O’Reilly Media.(邦訳:Boswell, D. and T. Foucher「リーダブルコード」, オライリー・ジャパン, 2012.))

コードは他の人が最短時間で理解できるように書かなければいけない。

コメントの付け方

アポストロフィー'以降に書かれた文は,その行の処理から無視されます.
この機能を利用してコメントを適宜残すことで,コードが分かりやすくなります.
2つ例を挙げましょう.

Sub Hello()
'A1セルに文言を入力します。
Cells(1, 1) = "hello!"
End Sub
Sub Hello()
Cells(1, 1) = "hello!" 'A1セルに文言を入力します。
End Sub

コメントは無視される

短いコードなので上の2つのコメントは同じ意味になります.
しかし,コメントを付す位置に応じて若干ニュアンスが違います.
使い分けのため,参考例として少し長いコードをご覧ください.

Sub アイスのラインナップ()
'販売しているフレーバー各種をセルに入力するマクロ。
'全フレーバー分の処理はまだ作ってない。これだけで納品しないこと!
Cells(1, 1) = "バニラ"
Cells(2, 1) = "チョコ"
Cells(3, 1) = "イチゴ" 'ストロベリーでもどっちでもいいと指示書に書いてある。
End Sub

頭のコメントはコードを読んでいるときに目に入り,以降の処理に関わる重要性の高いコメントであると受け止められる一方,行の後ろに付帯したコメントは,その行のみに与えた補足情報と受け取られます.
一般に,行の後ろにつけたコメントは見逃すことが多いので,概要を説明したり警告文を述べるために付けるコメントは行の後半に書かないようにしましょう.

コメントアウト

処理を無視するというコメント機能の性質を使って,不要なプログラムを止めておくことができます.
これをコメントアウトといいます.
動かしたくなったときにアンコメント(=コメントから戻す)してやってください.

Sub コメントアウトの一例()
Cells(1, 1) = "どうしようもないくらい、すき"

'隣のセルに文言を入れたければ、次行をアンコメントしてください。
'Cells(1, 2) = "家で牛丼を食べたい"
End Sub

ブロックコメント

複数行をコメントアウトしたいという場合、プログラミング言語によってはブロック(かたまり)をまとめてコメントするブロックコメントの記法が提供されていますが残念ながらVBAにはありません。

代わりに、選択行をコメントアウトしたり、コメントを外すためのボタンがメニューバーに存在します。
複数行を選択して、コメントアウト/アンコメントしてください。

コメントのせいで分かりにくくならないように

コメントだらけになるとコメントを読んでもらえません。
変数やマクロの命名を適切に行なっていれば、コメントは必要なものに絞ることができます。
コメントを含んだコード全体を、「他の人が最短時間で理解できる」ように書くことを心がけましょう。

文字列の結合

文字列の結合は+または&で行えます。
特に理由がなければ、&を使う方が優れます。数字の足し算と明確に区別して、文字列の足し算を記述することができるからです。

Sub 文字の結合()
Cells(1, 1) = "シュー" + "クリーム"
Cells(2, 1) = "シュー" & "クリーム"
End Sub

文字を結合する例

もちろんセルに入力されている値を使うこともできます.

Sub 文字結合して同じセルへ再入力()
Cells(1, 1) = "シュークリーム"
Cells(1, 1) = "コロンブス" & Cells(1, 1) 'A1セルにコロンブスシュークリーム(←革靴のクリーム)と入力される
End Sub
応用(敬称)
  1. A1セルに入っている社名を株式会社御中で囲んでください.(書類を送る場合,会社には「様」でなく「御中」を使います.)
  2. B1セルに入っている人名を部長で囲んでください.(役職名と「様」はどちらも敬称となりますが,両方必要となる場合の書き方です.)
応用(見出しタグ)
  1. A1セルに入っているテキストを<h2></h2>で囲んでください.(webページに用いられるHTMLファイルでヘッドラインのレベル2,つまり,2番目に大きいレベルでの見出しであることを表します.レベルは6段階つけることができます.)
  2. A2セルに入っている文言を<p></p>で囲んでください.(pはパラグラフの意味で,このタグは段落を囲うのに用います.)

ダブルクオートを入力するには?

文字列の囲みに使ったダブルクオートを入力したい場合,VBAでは2連続で""と打ちます.
プログラミングにおいて,特定の意味を与えられてしまっている文字を通常の文字として入力することをエスケープといいます.

使用例として,靴つながりで,靴磨きの本(長谷川「靴磨きの本」亜紀書房, 2016)から題材をとりましょうか.

Sub エスケープでは二重打ちにする()
Cells(1, 1) = """基本の磨き""はシューケアとシューシャインの2工程に分けられる。"
End Sub

この例では,A1セルに「"基本の磨き"はシューケアとシューシャインの2工程に分けられる.」と表示されます.

エスケープの例

応用(webリンク)

A3セルに入っているURLの前にリンク先は<a href=",URLの後に">こちら</a>というテキストを結合してください.(aタグはアンカーに由来します.href属性はリンク先を表し,ハイパーリンクと参照を意味するレファレンスという英単語の略です.)

変数

変数に文字列を格納する

変数に格納しておけば,文言の修正が必要となっても一箇所のみ書き換えれば済みます.

Sub 大事なことなので二度申し上げます()
x = "変数は繰り返すときに便利です"
Cells(1, 1) = x
Cells(2, 1) = x
End Sub

変数に格納した文言を使い回す例

変数は1文字である必要はありません.
識別しやすい名前をつけましょう.

Sub かえるの合唱()

kaeru = "かえるのうたが"
Cells(1, 1) = kaeru
Cells(2, 2) = kaeru
Cells(3, 3) = kaeru

kikoe = "きこえてくるよ"
Cells(1, 2) = kikoe
Cells(2, 3) = kikoe
Cells(3, 4) = kikoe

End Sub

できない命名

数字から変数名を始めることはできません。
4kwa = "くわ、くわ、くわ、くわ"のようなコードはエラーになります。

kaeru no utaのように途中にスペースやタブを挟むこともできません。
長い変数名には、kaeruNoUtaのように最初は小文字だけど区切りだけ大文字という形式を用いるようにすると良いでしょう。

長い変数名を付けるにはいくつかの記法があります。蛇に似ているスネーク記法kaeru_no_uta、デコボコは駱駝の背中のコブに似ているキャメル記法kaeruNoUta、頭も大文字ではじめるパスカル記法KaeruNoUtaといったものが代表的です。VBAではマクロの名前などを大文字で始めるパスカル記法とし、マクロの中で定義する変数はキャメル記法とすると、元から存在するマクロや変数と記法が揃うので読みやすくなります。

問題

変数keroけろけろという文言を格納し、どこか好きなセルにその変数の中身を入力してください。

数値の入力

文字列の入力にはダブルクオート"が必要でしたが、数値の場合にはダブルクオートは要りません。
計算も簡単な記述で行えます。

Sub 数値にはダブルクオートが要らない()
Cells(1, 1) = 1 'A1セルに1と入力される
Cells(2, 1) = 1 + 2 'A2セルに3と入力される
End Sub

セルに数値を入力する例

変数でセル位置を指定する

数値を変数に格納し,セルを指定することがVBAプログラミングでは非常に多くあります.
次のような形です.

Sub 変数でセル位置を指定する()
i = 1
Cells(i, 1) = "hello!"
End Sub

変数でセルを指定する例

i = 2なら2行目,i = 3なら3行目に文言を入れることができます.

簡単かもしれませんが,これでCells(i, 1) = "hello!"の部分のコードを変えることなく,処理するセルだけを可変にすることができるようになりました.

A1セルを指定するのに,Cells(1, "A")という書き方もできます.しかし,変数を使って指定するセルを動かすことを考えれば,アルファベットより数字で書いておいた方が楽です.

問題
  1. 2つの変数ijを用いてセルの位置を指定し,どこかのセルに文言を入力できますか?
  2. 新しく変数を作らずに,i + 1j + 1を用いて,いま入力したセルの右隣に同じ文言を入力してください.

型を指定して安全に

次のように在庫数を入力しているマクロがあるとします.
コピーして実行してみてください.

Sub ありがちな間違いを犯した在庫数マクロ()
stock1 = "10"
stock2 = "20"
Cells(1, 1) = stock1 + stock2
End Sub

コードを書いていたり,引き継いだときに,変数が文字列であるか数値であるか分からなくなってしまうと,ちょっとしたことでバグを引き起こしかねません.
このため,変数にはを宣言し,例えば数値の型にして文字列を投げ込めないようにするなど安全のために制約を課して使うべきです.
VBAには様々な型が用意されていますが,まずは文字列型Stringと長整数型Longを覚えましょう.
他の型は出会ったときに覚えればいいと思います.

ちなみに,英単語そのままに整数型としてIntegerという型名が存在します.しかし,コンピュータの扱える桁数は無限ではありませんから,桁数に制限があります.現代では,桁数が大きくても処理に困らなくなり,昔からあるInteger型を使う必要はなくなりました.VBAでLongと名付けられた長い整数を格納できる型を使うのが一般的です.

宣言を省略した場合には何でも格納できるバリアント型Variantとなって,適宜文字列や数値として解釈されます.Dim 変数名とだけ書いて,As 型名を省略した場合も同様です.しかし,先のようにバグの原因となるため,型名を知っているのであれば適切な型に定義するのが望ましいと言えます.知らない型の名前を調べて回る必要はありませんが,型名を知っているならば安全性を高めておくべきでしょう.

文字列型の例

型宣言の構文は

Dim 変数名 As 型名

です.

似た要領で,2種類の数字を格納する変数を作ることもできます.複数の値を格納する変数を配列といい,宣言に用いるDimは次元を意味するディメンションに由来しています.

変数strを文字列型Stringで宣言する場合,

Sub 変数の型を宣言する例()
Dim str As String
str = "文字列"
Cells(1, 1) = str
End Sub

のようになります.

問題
  1. 変数takeshiYearOldを整数型で宣言してください.
  2. さらに,変数takeshiNameを文字列型で宣言してください.
  3. takeshiYearOldジャイアンという文言を格納しようとすると,エラーになることを確認してください.
  4. takeshiNameジャイアンという文言を格納し,takeshiNameをどこかのセルに書き出してください.

長整数型の例

問題のあった在庫数マクロでは次のように変数stock1stock2を整数で宣言しておくべきでした.

Sub ちょっとミスしても正しく動かせる在庫数マクロ()
Dim stock1 As Long
Dim stock2 As Long
stock1 = "10"
stock2 = "20"
Cells(1, 1) = stock1 + stock2
End Sub

適切な型を使用することでバグを防げた例

数値の型に文字列で数字が流し込まれると,問題がない場合には正しく数値として解釈してくれます.
ですから,A1セルには30と表示されます.

変数宣言の強制

バグを減らすために,変数宣言を強制するというオプションを設定することが強く推奨されています.
macOSのExcelだと,VBEの環境設定で開くウィンドウから設定できます.

macで変数宣言を強制するためのチェックボックス

次回

マクロでやりたいことはルーティンワークの自動化です.
次回は処理を反復するためにFor文を紹介します.