【VBA】1+1=2 を計算するプログラム

「プログラムなんて1行も書いたことないよ!」
という人のための VBA 超入門講座 の初回です。この講座では、とにかく簡単なプログラムを書いてみて、それを少しずつ変更していくというスタイルで進めていきます。オブジェクトやプロパティなどの用語はその時々で少しずつ解説します。記事を読み進めていくうちに
「なーんだ。プログラミングって案外簡単なんだね」
と思ってもらえると嬉しいです。作って、触って、動かして、プログラミングを目いっぱい楽しんでください。

【VBA】足し算するプログラムを書きましょう

 最初のプログラムと書くときは「 Hello World 」というメッセージを表示するのがプログラム界の慣例(?)となっていますけど、ここは数学サイトなので、やはり数学らしく「 1 + 1 」を計算させるマクロを書いてみることにします。
 
 それでは記念すべき(?)最初のマクロです。
 次のマクロをコピーしてモジュールに貼りつけてください。

Sub Addition()
  Dim x As Long
  x = 1 + 1
  MsgBox x
End Sub

 このマクロを実行するとメッセージボックスが現れて「 2 」という数字が表示されるはずです。たった5行の簡単なマクロですけど、大事な要素がたくさん詰まっています。1つ1つ丁寧に見ていきましょう。最初に覚えておかなくてはならないのが1行目の

Sub Addition()

という記述と

End Sub

という記述です。1行目を入れると最終行は自動的に記述されます。冒頭 Sub というのは Subroutine(サブルーチン)のことです。サブルーチンの「サブ」はメインのマクロの部品として働くことからそう呼ばれています。今は「 1 + 1 」を計算する立派な「主役」ですが、必要なときには他のプログラムで呼び出して使うこともできます。なので普通のマクロには、この Sub というコードが必ずついています。

 Sub のあとに続く「足し算」がプログラム(マクロ)の名前です。
 さらに () がついていますが、これはサブルーチンとしてはたらくときの引数を入れておくためのものです。メインで動かす場合は使用しないので、今はあまり気にせずに、マクロの名前のあとに () を付けるという規則だけ覚えておいてください。この Sub と End Sub で括ったところがひとまとまりのプログラム(マクロ)として認識されます。

 2行目に書かれている

Dim x As Long

は変数を宣言しています。Dim とは Dimension の頭文字で、は「変数の型」を宣言するステートメントです。Long は難しく言うと「長整数型」とよばれるデータ型ですが、要するに整数を入れる箱だと覚えておけば十分です。なので、このコードには

x を整数と宣言します

ということが書かれています。このように宣言することで、整数を入れる箱 x を用意したことになります。3 行目の

x = 1 + 1

は「 x に 1 と 1 を加えたものを入れる」という記述です。4行目の

MsgBox x

という記述では MsgBox関数を利用して、x の値をダイアログボックスに表示させます。 VBA にはこのようにちょっと複雑な処理を行ってくれる VBA関数がいくつも用意されています。関数を全部覚える必要はまったくないので、その時々に応じてヘルプなどで探して使うようにします。

データ型を変更します

 Addition() では、x は 整数 (Long) であると宣言しています。そこでもし、このプロシージャの内容を

Sub Addition_2()
  Dim x As Long
  x = 1 + 1.8
  MsgBox x
End Sub

と書き換えるとどうなるでしょう? 
「そりゃもちろん、2.8 でしょ」
と思うかもしれません。しかし、実際には「 3 」が返ってきてしまいます。1 + 2 = 2.8 という数字を変数 x に格納しようとしても
「 x は整数型で宣言されているから、そんな数字は入れられないよ」
ということで、勝手に切り上げて 3 という数字に変えてしまったのです。これは変数の宣言の仕方に問題があります。小数の計算をさせたかったら、値を格納する変数もそれに合ったものを用意しておきます。Dim の宣言文を変えて

Sub Addition_3()
  Dim x As Double
  x = 1 + 1.8
  MsgBox x
End Sub

としてみましょう。すると無事に「 2.8 」という値が表示されます。
 
 Double には「倍精度浮動小数点数型」というやたらと長くて面倒な名前がついているのですが、今の段階でそれが正確に何を意味するのかを勉強してもあまり面白くありませんし、学んだところでプログラミングが上手くなるわけでもないので、とりあえず

実数を入れるのは Double 型

と覚えておきましょう。ほとんどの場合、数値の型は Long と Double を知っていれば事足ります。
 

ユーザーが任意の値を入力できるようにします

 Addition_3() はちゃんと足し算してくれますけど、まだまだ使いにくいマクロです。「別の足し算をしたいなあ」と思ったら 3 行目の「 x = 1 + 1.8 」を書き換えなければなりません。それはちょっと面倒ですよね。そこで
「好きな値を入力して足し算してくれるようにならないかな」
と考えます。そういうときに便利な関数が InputBox です。

Sub Addition_4()
  Dim x As Double, a As Double, b As Double
  a = InputBox("aを入力してください")
  b = InputBox("bを入力してください")
  x = a + b
  MsgBox x
End Sub

 Addition_4() では、a, b という 2 つの変数を付け加えるので、

Dim x As Double, a As Double, b As Double

というように宣言文を増やしています。このように変数宣言は「, 」で区切って横並びにして書くことができます。もちろん、宣言文を縦に並べて

Dim x As Double
Dim a As Double
Dim b As Double

と書くこともできます。宣言する変数が多いときは、あまり横にずらずらと並べずに、適当なところで改行して縦に並べたほうがよいでしょう。

 InputBox 関数は

InputBox("メッセージ")

と記述すると「メッセージ」付のダイアログボックスが現れて、ユーザーに値を入力するように促します。Addition_4() では、ダイアログボックスでユーザーが入力した値が a, b に放り込まれます。それから、a と b を足し合わせて x に入れます。実際に試してみましょう。Addition_4() を実行すると次のようなダイアログボックスが 2 回現れます。

 VBA-InputBox関数

 「 2 」、「 3 」を順に入力してみてください。
 「 5 」という値が戻ってくるはずです。
 単純なプログラムですが、これでも電卓と同じように好きな値で足し算できるのですから、なかなか大したものなのです。

 今回はワークシートと連携したプログラムを書いてみましょう。
 オブジェクトプロパティという概念に軽く触れますけど、今の段階では細かいことは気にせずに、大体の感覚を掴んでください。

オブジェクトとプロパティ

 今度は下図のようなワークシートを用意してください。

 エクセル足し算マクロシート

 セル C2 と C4 には何か数値を予め入力しておきます。この 2 つの値を足し算してセル C6 に出力する、というマクロを作ります。

Sub Addition_5()
  Dim x As Double, a As Double, b As Double
  a = Range("C2").Value
  b = Range("C4").Value
  x = a + b
  Range("C6").Value = x
End Sub

 Addition_5() を実行するとセル C2 に計算結果が表示されます。
 
 VBA の根幹となるオブジェクトとプロパティについて簡単に説明しておきます。英語の object は「物体」という意味です。現実世界の車がエンジンやタイヤ、ボディーなどで構成されているように、オブジェクトはエクセルを構成するパーツです。ブックやシート、セルなどがオブジェクトであり、それをエクセルの部品に見立てて VBA で制御する、という感覚です。そして、プロパティとはオブジェクトのもつ情報です。車でたとえるなら、色、走行距離、ナンバーや、どのようなパーツ(エンジン、タイヤ、ハンドル、ドア … )で構成されているのかなどです。さらに、

車.エンジン

という記述で、「車」オブジェクトの「エンジン」プロパティで車の下の階層にある「エンジン」オブジェクトを取得できます。この「エンジン」オブジェクトもエンジンの材質やモーターなどのプロパティ (情報) をもっています。

車.エンジン.モーター

という記述は、「車」オブジェクトの「エンジン」プロパティで「エンジン」オブジェクトを取得し、「エンジン」オブジェクトの「モーター」プロパティで「モーター」オブジェクトを取得することを意味します。

 Addition_5() の 3 行目に

a = Range("C2").Value

という記述がありますね。この Range がプロパティです。Range プロパティは(記述上では省略されている)Worksheet オブジェクトの構成要素の1つである Range オブジェクト (ここではセル範囲 C2) を取得しています。

 その後ろにくっついている Value もプロパティで、「セル C2 の値を取得する」という意味です。セルの値は

Range("C6").Value = x

によって値を x に変更できます(ワークシートのセル C2 の値が書き換えられます)。他にも VBA にはたくさんのプロパティが用意されていますが、別に全部覚える必要もないので、その都度少しずつ覚えていきましょう。

Function プロシージャ

 ここまでは、Sub と End で括られたプログラムを書いてきました。このような種類のプログラムを Sub プロシージャ、または Sub ルーチンといいます。VBA には、他にも Excel 関数のようにワークシートのセルに入力して使用できる Function プロシージャ (Function マクロ) が用意されています。Sub プロシージャと Function プロシージャの違いについて、ここで詳しく説明することは避けますが、Function プロシージャとは「引数を受け取って値を返す」関数だということだけ知っていれば実用上は十分です。

 2 つの数値を受け取って、足し合わせた値を返す Function プロシージャを作成してみましょう。

Function Add(a As Double, b As Double) As Double
  Add = a + b
End Function

 上のコードを書き終えたら、ワークシートの適当なセルに

=Add(100, 200)

と入力して、「 300 」が返ってくることを確認してください。Function プロシージャは

Function 関数名(引数1 as データ型, 引数2 as データ型, ...) as 戻り値のデータ型
  処理内容
End Function

の形式で記述します。処理内容には「関数名 = 戻り値」という一文を必ず入れるようにします。上で定義した Add 関数は、第 1 引数、第 2 引数、戻り値のすべてを Double 型で宣言し、

  Add = a + b

によって、引数の加算値を戻り値として定義しています。

イミディエイトウィンドウに実行結果を表示する

 マクロの編集画面(Visual Basic Editor)の一番下にはイミディエイトウィンドウと呼ばれる画面が用意されています。

VBAイミディエイトウィンドウ

 プログラムの動作を手軽に検査できるので、使い方を覚えておくと便利です。Function プロシージャは Sub プロシージャの中で呼び出すこともできます。さきほどの Add 関数の実行結果をイミディエイトウィンドウに表示してみましょう。

Sub Add_Test()
  Debug.Print Add(15, 30)
End Sub

 Add_Test() を実行すると、イミディエイトウィンドウに「 45 」が表示されます。

繰返し処理

 同じ処理を何度も繰り返すことをループとよびます。VBA にはこのループ処理を行うためのステートメントがいくつか用意されています。今回は For…Next ステートメントを用いて、1 から 9 の数字を順番に足してみます。

Sub Sum_Numbers()

  Dim i As Long, s As Long

  i = 0
  s = 0

  For i = 1 To 9
    s = s + i
  Next

  Debug.Print s

End Sub

 Sum_Numbers() を実行すると「 45 」が表示されます。

 変数 i と s は Long 型で宣言され、次の行で 0 が代入されています。この 2 行はなくても機能しますが、i と s の初期値がわかりやすいので、書いておいたほうがよいでしょう。

 要となるコードは次の 3 行

  For i = 1 To 9
    s = s + i
  Next

の部分です。For と Next で囲まれた行は繰り返し実行されます。i はカウンタ変数として用いられ、1 から 9 までの値が順次代入されます。この部分は次のように処理されます。

 ・i に 1 を代入する。

 ・変数 s に s + i (0 + 1) を代入する (s の値:1)。

 ・i に 2 を代入する。

 ・変数 s に s + i (1 + 2) を代入する (s の値:3)。

 ・i に 3 を代入する。

 ・変数 s に s + i (3 + 3) を代入する (s の値:6)。

 ・i に 4 を代入する。

 ・変数 s に s + i (6 + 4) を代入する (s の値:10)。

 ・ …………………………………………

 以下、i に 9 が代入されるまで同じ処理を繰り返し、結果として、

  1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9

を計算して 45 を得ています。ループ処理はプログラミングの基本中の基本であり、強力な武器の一つです。まずは For … Next 構文をたくさん書いてマスターし、VBA の他のループ処理も学んでみてください。

≫【VBA入門講座(2)】Cellsプロパティについて学びます

エクセルや数学に関するコメントをお寄せください