1200万人のプログラミング（VBA編）その2

##＜第2回＞プログラムコード##

[前回](https://qiita.com/istoyo/items/096a00f638b762ba5a7a)のプロローグでは、関数には「引数」と「戻り値」があり、引数と戻り値を格納するそれぞれの「変数」には「データ型」があるという話をしました。

では、実際のプログラミング言語にはどのようなデータ型があるのでしょうか。


###■データ型###
プログラミングで扱うデータは主に、**数値**、**文字**、**論理値**などです。

なので、ほとんどのプログラミング言語でそれらのデータ型をサポートしています。

さらに、それらを（プログラミング言語によって多少の違いはありますが）細かく分けた型を定義し、扱えるデータの範囲を限定しています。

大まかな分類例としては下記のようになります。

    論理 ─ 真（True）か偽（False）

    数値 ┬ 整数 ┬ 小さい整数
    　　 │　　　└ 大きい整数
    　　 │
    　　 └ 小数 ┬ 浮動小数点数
    　　 　　　 └ 倍精度浮動小数点数

    文字 ┬ 1文字
    　　 └ 文字列

※「**浮動小数点数**」というのは、小数点を含む数値のことです。

VBAにおける具体的なデータ型は、いろんなサイトで解説されていますのでここでは割愛します。

　　＜参考サイト＞**[VBA データ型](https://www.tipsfound.com/vba/02008)**

（※データ型を暗記する必要はありません。忘れたらその都度調べながら書いているうちに自然と覚えます。）

これによって、扱うデータの素性をはっきりさせることができます。

さて、今回は、前回に出てきた「**渡された値（引数）の10倍の値（戻り値）を返す関数**」を実際に VBA の文法でプログラミングしてみましょう。


###■プロシージャ（Procedure）###
VBA では、プログラムを『**プロシージャ**』と呼ばれる単位で記述し実行します。
プロシージャとは「**手続き**」という意味ですが、まぁ一種の関数だと思えばよいでしょう（というか関数です）。

プロシージャには『**Subプロシージャ**』と『**Functionプロシージャ**』があり、「戻り値」がある関数は Functionプロシージャとして記述します。
（※この他にも『**Propertyプロシージャ**』などがありますが、これはまた別の機会に解説します）

対照的に、Subプロシージャには戻り値がありません。

両者の違いは、**単体で実行できるかどうか**、です。

Functionプロシージャのように戻り値がある場合、それ単体では実行することができず、その戻り値を使ってくれる他のプロシージャから呼び出されることではじめて実行されます。

これに対し、Subプロシージャには戻り値がないので、それ単体で実行することができます。
（ただし、Subプロシージャが引数を取る場合は他のプロシージャから引数を受け取る必要があるので、単体で実行することはできません）

つまり、VBA のプログラムは Subプロシージャからしか実行することができず、プログラムの実行は、実質Subプロシージャが請け負っていることになります。（ C や Java では「**main関数**」がこれにあたります）

まず、Functionプロシージャは次のような構造で記述します。

    Function 関数名(引数 As 引数の型) As 戻り値の型

        関数名 = 戻り値

    End Function

＜解説＞

- 必ず、**Function** で始まり **End Function** で終わるブロックの中に記述します。
- 始まりの Function の後に**半角スペース**と**プロシージャ名**（関数名）および**半角括弧**「( )」が必要です。
- ( )の中に引数名と引数の型を指定します。※引数を取らない場合は何も書かない
- ( )の後に戻り値の型を指定します。
- 型は「**As**」キーワードで指定します。※ As の前後は半角空けます
- コードの中で自身のプロシージャ名と同じ名前の変数に戻り値を格納します。

これが、VBAにおける関数の基本的な書き方です。

これに倣って「渡された値（引数）の10倍の値（戻り値）を返す関数`f(x)`」を書いてみましょう。

変数のデータ型をとりあえず「**Long型**」にしておくと、

    Function f(x As Long) As Long

        f = x * 10

    End Function

となりますが、実際のプログラミングでは、変数や関数をアルファベット1文字で表すようなことはしません（可能ではありますが）。
なぜなら、1文字ではそれが何を意味する変数、関数なのかが分かりづらいからです。

なので、変数や関数にとどまらず、プログラム上のありとあらゆるデータに、分かりやすい名前をつけて記述するのがプログラミングのお作法です。

ここでは、変数`x` に「**jpCoin**」、関数`f` に「**GetMoney**」という名前をつけて記述してみます。

すると、以下のようになります。

    Function GetMoney(jpCoin As Long) As Long

        GetMoney = jpCoin * 10

    End Function

渡された値（引数）の10倍の値（戻り値）を返す「**GetMoney関数**」の完成です。

たった3行のコードですが、内容は実に盛りだくさんです。
おそらくここがプログラミング学習の最大の関門かもしれません。

詳しく解説していきましょう。まず、

- Function で始まり End Function で終わるブロックが一つの関数（プロシージャ）です。

次に、関数名（GetMoney）ですが、

- 関数名に使える記号はアンダーバー（ _ ）のみです。
- 数字は使えますが、1文字目には使えません。記号（ _ ）も1文字目には使えません。
- 大文字と小文字を区別しません。GetMoney も getmoney も GETMONEY もすべて同じ名前とみなされます。
- 日本語が使えます。
- VBAに登録されているキーワード（「**予約語**」といいます）は使えません。
- 他の関数と同じ名前は使えません。
- 関数名の後の括弧「 ( ) 」は必ず半角で記述します。
- 変数名（jpCoin）は関数名と同じルールで命名します。

ここまで大丈夫でしょうか？ まぁ、ここは単なる決まりごとなのでとくに問題はないと思います。

さて、Function と End Function の間にその関数が実行する処理を記述しますが、この GetMoney 関数は引数を10倍にして返すだけの関数なので、そのコードは、

    GetMoney = jpCoin * 10

と、たったこれだけです。

しかしながら、この1行にプログラミングの肝と言ってもいいぐらいの、理解すべきことがたくさん詰まっています。


###■演算子（operator）###
たいていのプログラミング言語では、四則演算（＋、－、×、÷）の記号をそれぞれ、「**+**」「**-**」「**\***」「**/**」で表します。

こういった演算記号を『**演算子**』といい、とくに四則演算に使う演算子は『**算術演算子**』と呼んだりします。

プログラミング言語によって分類や表記に若干の違いはありますが、算術演算子の他にも、「大きい」「小さい」のなどの比較に使う『**比較（関係）演算子**』や、「かつ」「または」などに使う『**論理演算子**』など、さまざまな演算子があります。

VBAにおける演算子には以下のようなものがあります。

　　＜参考サイト＞**[VBA 演算子](https://www.tipsfound.com/vba/02009)**

（※これも様々なサイトで紹介されていますから、わからなくなったらその都度調べればいいのですが、演算子は比較的覚えやすいと思います）

さて、「**=**」は、数学においては左辺と右辺が「**等しい**」ということを表す記号でしたが、プログラミングにおいては、

　　右辺を左辺に『**代入する**』

という意味になり、これを『**代入演算子**』といいます。

なので、たいていのプログラミング言語では、「等しい」ことを表す記号は「==」のように「=」を複数並べた表記を使ったりしますが、VBAに限っては「=」一つで「代入」と「等しい」の両方の意味を使い分けます。


###■戻り値（return value）###

VBA では、戻り値は代入演算子を使って、

　　**関数名と同じ名前の変数に演算の結果を代入する**

という形で記述します。つまり、

    GetMoney = jpCoin * 10

と書きます。

ちなみに、他のプログラミング言語では、「**return文**」と呼ばれるものを使って戻り値を返すコードを記述するものもあります。

たとえば、変数 jpCoin を10倍にして返す return文は

    return jpCoin * 10;

のように記述しますが、通常はこれをプロシージャの最後に書きます。

なぜなら、そのプロシージャ内では return文以降のコードは実行されないからです。

ところが、VBA では戻り値の文以降のコードも実行されます。
なので、とくに最後に書く必要はないのですが、プログラムの分かりやすさの面からも、できるだけ最後に記述することをお勧めします。

このように、プログラミングにおける関数や変数、演算などの概念はどのプログラミング言語でもほぼ同じですが、その表記の仕方や文法には言語独自のものがあります。


###■オペランド（operand）と「リテラル」###

上で演算子の話をしましたが、演算子の両脇には必ず「**演算の対象となるもの**」があります。（※「両脇」ではない場合もある）

この「演算の対象となるもの」のことを『**オペランド**（被演算子）』といいます。

上記の例で言えば、乗算記号（*）の両脇の「jpCoin」と「10」がオペランドです。（「=」の左側の「GetMoney」もオペランドです）

たいていの場合、オペランドは変数であることが多いのですが、今回の例のように「10」という数値が直接記述されていることもあります。

このように、プログラムコード中に数値や文字列が（変数としてではなく）直接記述されていた場合、それらを『**リテラル**』といいます。

まぁ「変数の対義語」ぐらいの理解でいいのですが、この「リテラル」という単語は、プログラミングを勉強していると、なぜか**何の前ぶれもなく突然出てきたりする**ので覚えておいて損はないでしょう。


さぁ、次回はいよいよ実際にプログラムを動かしてみましょう。

---
第3回につづく ＞＞