はじめに

エクセルで関数を作成することによりVBA(Visual Basic for Application)の本当に基本的な部分の説明を行います。授業では4〜5回ぐらいで講義を行いますが、当然ながら、この4回ぐらいでプログラマーになれるわけではありません。将来、皆さんがVBAを使うようになったときに、最初の一歩ぐらいにはなると思います。そのつもりでVBAを使ってみてください。
VBAは様々な使い方があるのですが、ここでは独自の関数を作成することを例に説明します。


オプションの設定

開発タブをリボンに表示するために一度だけオプションの設定を行います。この設定はパソコンごとに1回だけやれば済む作業です。大学では一度やれば次のシステム入れ替えまでどのマシンを使っても、やる必要はありません。自宅で自習する場合も、1台のPCに対して1回やれば次からは必要ありません。操作方法はオフィスボタンをクリックし、画面の下にある「エクセルのオプション」をクリックし、「開発タブを表示する」のチェックボックスをクリックするだけです。「OK」をクリックするとリボンに開発タブが表示されます。
オプションの設定
開発タグを表示


ビジュアルベーシックエディターの起動

「開発タブ」から、「コード」グループの「Visual Basic」をクリックします。すると別ウインドウに「Microsoft Visual Basic」が起動します。このウインドウはエクセルのファイルの一部を別の機能で開いているもので、これから記載する内容はエクセルのファイルに対して記録されていきます。
ビジュアルベーシックの起動
プルダウンメニューの「挿入」から「標準モジュール」を選択します。するとタイトルバーの記述が「Microsoft Visual Basic -Book1-[Module1(コード)]」となります。今追加されたウインドウ内に入力していきます。
標準モジュールの挿入
文字を入力する領域


値の代入

関数を作成するときに各種の値を代入し、それらの値を使って様々な処理を行います。代入できるものは文字データと数値データです。それぞれのデータにより指定方法が異なります。

文字列の代入

自分の名前を返す関数を作り、文字を代入することを説明します。

コメントの入力

標準モジュール内に『'自分の名前を返す関数』と入力してみます。鍵カッコは入力しないでください。「'」は「Shift」+「7'や」で入力できます。

一行目に以下の分を入力し改行します。入力された文字の色は最初は黒ですが、改行すると緑色になります。「'」を入力すると「'」を含めいて右側がコメントになります。コメントはプログラム上何の意味も持ちません。プログラムを書いている人のメモ書きとして利用されます。でも、コメントは非常に重要です。プログラムを書いているときは集中して考えているため一連の複雑な処理を頭の中で生成し、それをプログラムに表現しますが、頭の中の出来事はどこかに記載しておかないとすっかり忘れます。そのための備忘録としてコメントを利用し、プログラムを書いているときに思いついたこと、考えていることなどをできるだけ書き留めるようにします。

続けて『'関数名 Namae』『'引数 なし』を入力します。エクセルでは関数を「関数名(引数)」といった書式で記載することになっています。今回は「Namae」という関数を作りました。関数名は基本的に自由に作成することができますが、あらかじめエクセルが使っている関数名や特別な意味を持つ単語は使用することができません。エクセルの関数名は英語が使用されることが多いため、授業では使えなくなるリスクを避けるためローマ字表記の日本語を使用します。関数名は全角日本語でも出来るようですが、そもそも操作が煩雑なこともあり、関数名はすべて日本語入力を切った状態でローマ字表記による日本語とすることとします。 今回の関数には引数は指定しません。

エクセルでは、関数の結果を表示させることを「返す」と呼んでいます。値が「返される」と以後はその表示された結果を値として認識し次の処理を行います。数字が表示されていればその数字として扱い、各種の計算を行うこともでき、また別の関数の引数として指定することも可能です。この値のことを「戻り値」と言います。
コメント入力例

名前を返す関数の作成

今度は、「'」を使わずに、日本語入力を切り、『function Namae() as string』と入力します。この記載の大文字と小文字はとても重要です。関数名の N だけが大文字であり、後はすべて小文字で入力してあります。Namae の部分が関数名を宣言したことになります。今回は引数がないので()の中には何も記載しません。as string は戻り値の種類を定義しています。
変数は、次のいずれかのデータ型、ブール型 (Boolean)、バイト型 (Byte)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、日付型 (Date)、文字列型 (String) (可変長文字列の場合。固定長文字列の場合は、String * length。)、またはオブジェクト型 (Object) として宣言できます。データ型を指定しないと、バリアント型 (Variant) のデータ型が既定として割り当てられます。
関数の宣言
改行すると、function の F 、as の A 、string の S が大文字になり、Function、As、String のフォントの色が青くなり、そして「End Function」の行が追加されます。この処理により、Funciton などの単語が文法に則ったものであることが確認されます。このチェックのためにも関数の宣言以外では大文字を使わないことが好ましいと思います。
FUNCTION構文の書き始め
次に、関数の中身を記述します。関数の戻り値を表す変数名は、関数名とおなじものが使用されます。『namae="自分の名前"』と入力します。自分の名前は日本語で入力してみてください。「自分の名前」と入力しても、自分の名前を入力してもかまいません。このときの「=」は左辺と右辺が等しいという意味ではなく「右辺の値を左辺の変数に代入する」という意味となります。
文字列の代入
改行するとnamae の N が大文字に変わります。これにより宣言された単語と同じ綴りがなされたことを確認することができます。文法上あらかじめ決められた記述はスペルチェックを行えますが、自ら定義した関数名や引数名、変数名などはそもそもスペルチェックの対象とはなりません。ところが自分で宣言したにもかかわらず関数名、引数名、変数名などはスペルミスが多発します。そのため大文字小文字の情報を使いスペルチェックをする機能を持たせています。
オートコレクト例

名前関数を使う

エクセルのシートをアクティブにし、任意のセルに『=namae()』と入力し「Enter」をキーを押し下げます。すると自分の名前が表示されます。この時点では大文字も小文字も意味はありません。また、「'」は入力しません。
namae関数の使用方法

練習問題

自分の住所を返す関数を作成しなさい。作成する場所は、Namae関数の最終行の数行下から作成してください。
関数名は Jyuusyo とします。 


シリアル値の代入

コメントで、『自分の生年月日を返す関数』『関数名 SeiNenGaPpi』『引数 なし』と入力する。また、関数の宣言を行う。
コメント入力と関数の宣言
改行すると文法チェックが行われ、EndFunction行が追加される。
オートコレクトによるチェック
次に「SeiNenGaPpi」に自分の生年月日を代入します。西暦1966年10月21日を代入する場合は『seinengappi=#1966/10/21#』とします。生年月日の日付は自分の生年月日を指定してください。
シリアル値の入力
改行すると、シリアル値の部分が「#年/月/日#」から「#月/日/年#」に修正されます。
オートコレクトによる修正
SeiNenGaPpi関数を実際に使ってみると、戻り値は20000〜40000の間の整数が表示されます。セルの書式設定で表示形式を日付にすると生年月日が表示されます。


数字の代入

数字を代入します。数字の変数型は、バイト型 (Byte)、整数型 (Integer)、長整数型 (Long)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)の中から適したものを選びます。今回は年齢を返す関数を作りますので、年齢には正の整数しかはいりません。したがって今回の例ではバイト型を指定します。バイト型は0から255の正の整数の値を扱います。整数型は、-32,768から32,767のの範囲の整数の値をとります。つまり負の値のある整数を扱える型となります。長整数型は、整数型より大きな範囲の値が扱えるようになり、浮動小数点型は小数を含む数字を扱う時に使います。それぞれの範囲は各自検索してください。
関数の宣言
とりあえず、43という数字を代入してみます。『nenrei=43』と入力すると 43 という数字が nenrei に代入されます。各自自分の年齢を代入してみてください。 
数値の代入

「代入」のまとめ

値は文字データと数値データが代入できます。つまりすべての値が代入できます。文字を代入する場合は値を「"」で挟みます。シリアル値を代入する場合は値を「#」で挟みます。数字の場合はそのまま記述します。
ここでは「=」代入を意味しています。右辺の値を左辺の変数に代入しています。

  1. 値は文字データと数値データが代入できます。つまりすべての値が代入できます。
  2. ダブルコーテーション(")で値を挟むと文字データとなる。
  3. シャープ(#)で値を挟むとシリアル値となる。
  4. 数字の場合は何も使わない。
  5. ここでは「=」は代入として使われている。