「関数」の考え方と記述の仕方を学びます.最初に関数の考え方を,具体例を通して学習します.ここでは関数の一般的意味をふまえた上で,Excelのワークシート上の作業で用いられる「ワークシート関数」の成り立ちを理解します.つぎに,VBAマクロにおける関数の作成の仕方を学びます.ここではまず,ワークシート関数を自分で作成する方法を学習します.さらにマクロのソースコードの記述において,自作したワークシート関数をサブルーチンとして呼び出して利用する方法を学習します.
ここでは「関数」の基本的な考え方を学習します.
関数は,入力される値に対して何らかの計算を行い結果を出力するブラックボックスとして捉えることができます.
ブラックボックスの内部には,入力された値を利用して計算を行う計算式が入っています.出力される値は,入力される値に応じて変化します.たとえば入力される値をx,計算式をx+1,出力される値をyとします.このとき,xの値が1であればyの値は2,xの値が2であればyの値は3になります(この入力値xと出力値yの関係はy=x+1と表すことができます.これは数学で「一次関数」と呼ばれます.)
関数とはこのように,二つの変数x,yの間に何らかの対応関係があって,xの値が定まるとそれに対応してyの値が従属的に定まる時の対応関係をさします(また,xに対して従属的に変化するyのことを「xに対する関数y」と呼ぶこともあります).
Excelにおいて関数といえば,すぐに思い出すのは「ワークシート関数」です.すべてのワークシート関数は,上述の一次関数と同様に,入力される値に応じて何らかの値を出力します.たとえばSUM関数は,セル範囲を「入力」すると,その範囲の中にある値の合計値を「出力」します.平均値を算出するAVERAGE関数や標準偏差を算出するSTDEV関数も同様の構造を持っています.
=SUM(A1:A5) →この式が入力されたセルにA1からA5の合計値を出力する =AVERAGE(A1:A5) →この式が入力されたセルにA1からA5の平均値を出力する =STDEV(A1:A5) →この式が入力されたセルにA1からA5の標準偏差を出力する
このとき関数に与える入力のことを「引数(ひきすう)」,関数が出力する値のことを「返値(かえりち)」と呼びます.たとえばSUM関数は,セル範囲を引数にとり,セル範囲内の値の合計値を返値として返す関数です.この引数,返値という呼び方は,Excelのワークシート関数に限らず,プログラミング用語として一般的に用いられます.
ここではVBAで関数を作成する方法を学習します.
ワークシート関数は,VBAによってプログラムを書くことで,自分でも作成することができます.ここでは身長を与えるとBMI値に基づく「標準体重」(第2回,3.3を参照)を算出するワークシート関数の作成を例に,ワークシート関数作成の手順を学習します(practice04.xls, Sheet1).
「標準体重算出」関数の仕様を確定しましょう.
まずは外見(動作の目に見える部分)から決めていくことにします.この関数は特定のセルに関数名「標準体重算出」を入力して利用します.その際に,引数として身長をcm単位で与えることにします.
リターンを押して関数を実行すると,以下のように,身長に応じた標準体重を返値として出力することにします.
ここまでに決めたことを箇条書きにまとめると以下のようになります.
仕様のアウトラインが決まったら,処理手順を構想します.まだ関数の作成の仕方を学んではいませんが,細かいことは気にせずに,現時点で考えられる最もおおまかな処理の手順をまとめることにします.すると,おそらくは以下のようになるでしょう.
ここで標準体重の算出の仕方を確認します.標準体重は次の式で求められます.
ただし上記の式の場合,身長はm単位でなければなりません.これをふまえて上記の処理手順の構想を若干修正して以下のようにします.
上記の処理手順の構想を手がかりに,実際にVBAで関数を記述すると以下のようになります.ソースコードを見ながら関数の記述の仕方を解説します.
Function 標準体重算出(身長 As Double) ' 身長(cm)から標準体重(kg)を算出する ' 引数:身長(Double型) ' 返値:標準体重(Double型) Dim 標準体重 As Double ' 身長をメートル単位に換算する 身長 = 身長 * 0.01 ' 標準体重を算出する 標準体重 = 身長 * 身長 * 22 ' 標準体重を出力する 標準体重算出 = 標準体重 End Function
VBAでワークシート関数を記述する際には,「Sub〜End Sub」ではなく「Function〜End Function」で囲みます(ちなみに関数はfunctionの和訳です).プロシージャ名と同様の位置に関数名を宣言します.
今までプロシージャ名の直後の()は空欄でした.この()の内部に引数(を受け取るための変数)を宣言します.標準体重算出関数の引数は身長でした.通常の変数宣言と同様の書式で変数名とデータ型を記述します.今回の場合,身長は小数値も受け取ることができるようにDouble型で宣言しておきます.
このように引数を宣言することで,ユーザーが入力した値を自動的に取得することができます.したがって,処理手順の1はこれで完了したことになります.
引数の値を処理に利用したい場合,引数として宣言した変数名をそのまま記述します.処理の1行目「身長をメートル単位に換算する」および2行目「標準体重を算出する」に記述された変数「身長」は,引数の宣言のところで宣言済みの変数です.
返値をセルに対して出力するためには,代入文を用います.代入文の左辺に「関数名」を,右辺に返値として出力する値(または値の入った変数名)を記述します.今回の場合,返値は変数「標準体重」に入っているので,「標準体重算出=標準体重」と記述します.
今度は身長と体重からBMI値を算出するワークシート関数,「BMI値算出」を作成しましょう.
標準体重算出関数と異なる点は,引数が2つある点です.ワークシート上では以下のようにカンマで挟んで身長,体重の順に引数を与えることにします.
このように,複数の引数をとる関数を作りたい場合,引数の宣言の箇所を以下のように記述します
Function BMI値算出(身長 As Double, 体重 As Double)
上記のように,使用したい引数をカンマで区切りながら順番に宣言します.引数を宣言する順序は,そのまま関数の利用時の引数の記述順序となります.ですから,利用時にどのような順番で入力するのが良いのかをよく考慮して宣言しましょう(ちなみに返値は一つしか指定できません).
ちなみに,BMI値は以下の式で算出されます.
上記の式でも身長はm単位です.
これらを手がかりに,自力で処理手順の構想を立てた上で関数を作成してみましょう.
上記のように作成した関数は,VBAマクロの記述においてサブルーチンとしても利用することができます.一般の,Subで記述されたプロシージャをサブルーチンとして呼び出す場合,プロシージャ名を記述します.Functionで定義された関数をサブルーチンとして呼び出す場合も,関数名で呼び出す点は変わりありません.
関数の呼び出しが一般のプロシージャの呼び出しと異なる点は,引数と返値がある点です.以下は「BMIによる肥満判定」マクロ(第2回,練習問題3.3参照)を,BMI値算出関数,標準体重算出関数を用いる形に書き換えたものです.書き換えられた箇所を見つけてみましょう.
Sub BMIによる肥満判定() Dim 身長 As Double Dim 体重 As Double Dim 標準体重 As Double Dim BMI As Double ' BMI算出に必要なデータを取得する 身長 = Range("B1").Value 体重 = Range("B2").Value ' BMIを算出し出力する BMI = BMI値算出(身長, 体重) 'BMIを算出する BMI = Application.WorksheetFunction.Round(BMI, 1) '四捨五入して小数点1桁に変換する Range("B3").Value = BMI 'BMIを出力する ' 標準体重算出に必要なデータを取得する 身長 = Range("B1").Value ' 標準体重を算出し出力する 標準体重 = 標準体重算出(身長) '標準体重を算出する 標準体重 = Application.WorksheetFunction.Round(標準体重, 1) '四捨五入して小数点1桁に変換する Range("B4").Value = 標準体重 ' BMIに基づいて肥満判定をし結果を出力する ・・・ソースコードは省略・・・ End Sub
関数が用いられているのは,「BMIを算出し出力する」と「標準体重を算出し出力する」の,それぞれ1行目です.以下にその2行だけ抜粋してみます.
BMI = BMI値算出(身長, 体重) 標準体重 = 標準体重算出(身長)
作成した関数をマクロ内で呼び出して利用するためには次のようにします.まず,利用したい箇所で関数名を記述するとともに,()内に必要な引数の値(または値の入った変数名)を記述します.その際には,必ず引数の個数と順序,そして引数のデータ型が,あらかじめ定義しておいたものと一致するようにします.複数の引数がある場合はカンマで区切ります.次に,関数の返値を受け取れるように,代入文を指示する=とともに,左辺に変数を記述します.左辺の変数のデータ型も,あらかじめ定義された返値のデータ型と必ず一致するようにします.
上記のソースコードでは,BMIを算出したあとで,再び身長の値をセルB1から取得し直しています(コメント「標準体重算出に必要なデータを取得する」部分).これはBMI値算出関数が身長をメートル単位に換算する処理を行うと,メインルーチン(「BMIによる肥満判定」プロシージャ)側の変数「身長」の値も同時にメートル単位に書き換えられてしまうからです.そのまま計算を続行すると,次の標準体重算出関数の内部でもメートル単位への換算を行うため,結果としてメートル単位の値がさらに1/100になってしまい正しい計算結果が得られません.そこで標準体重関数の処理に移る前に,改めてセルB1からセンチメートル単位の身長を取得しておくことで,正しい計算結果を得られるようにします.
円ドル換算をするワークシート関数を作成してみましょう.以下のように引数に円元金(換算したい円の金額)を入力すると,返値としてドル換算額が出力されるようにします.ただし換算レートはマクロ内部にあらかじめ記述しておくものとします.また,同様にしてドル円換算をするワークシート関数も作ってみましょう(practice04.xls, Sheet2).
以下のように特定のセルにユーザーの選択,元金を入力すると換算額を出力する「円ドル双方向換算」マクロを作成しましょう.マクロの内部では,問題1で作成した円ドル換算関数,ドル円換算関数を呼び出して利用するようにしましょう.