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

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

1 + 1 を計算させるプログラム

 最初のプログラムと書くときは「 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 で制御する、という感覚です。そして、プロパティとはオブジェクトのもつ特質です。車でたとえるなら、エンジンの材質やモーターなど、部品のさらに細かいところに相当します。 VBA ではオブジェクトに対してプロパティではたらきかける、という記述が頻繁に登場します。
 
 Addition_5() 3 行目に

a = Range("C2").Value

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

 その後ろにくっついている Value もプロパティで、「セル C2 というオブジェクトから値をもらいますよ」という意味です。このプロパティは代入演算子「 = 」によって、その性質を変えてしまうことができます。最初の状態ではこのセルには何も入っていませんが、命令文

Range("C6").Value = x

によって、x の値が入力されます。他にも、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 」が表示されます。

コメント

タイトルとURLをコピーしました