3回目:関数について

更新日:2023/9/7 [投稿日:2023/3/5]

全6回で勉強するプログラミング、3回目です。今回はプログラムで使う関数について、使い方、作り方をざっくり学習します。

定義済み関数

定義済み関数とは

定義済み関数とは、あらかじめ用意されている関数です。エクセルならSum関数などが定義済み関数です。これはワークシート関数とも呼ばれます。Sum関数を使うときはセルに”=Sum(引数)”と入力すると結果がセルに表示されました。この表示される値をプログラムでは戻り値と呼んでいます。

VBAの定義済み関数と、エクセルの定義済み関数は全く別のものになります。例えばVBAにはSum関数はありません。また、VBAからエクセルの関数を呼び出すことは可能ですが、エクセルのシートからVBAの定義済み関数を直接使うことはできません。VBAの定義済み関数は組み込み関数とも呼ばれます。

関数を使う前に

プログラムで関数を使う前に確認するのが次の2点です。

  • 引数とそのデータ型
  • 戻り値とそのデータ型

例えば絶対値を返すAbs関数の引数と戻り値は次のようになります。

  • 引数とそのデータ型:引数は必須で、データ型は数値。
  • 戻り値とそのデータ型:引数と同じデータ型を戻す。

関数の使い方

Abs関数を使ったプログラムを書いてみましょう。

Sub test8()
Dim intA As Integer ‘引数用変数
Dim intRet As Integer ‘戻り値用変数
  intA = -88
  intRet = Abs(intA) ‘Abs関数に変数intAを渡して結果をintRetに代入する
  MsgBox intRet
End Sub

プログラムを実行すると「88」が表示されるはずです。Abs関数は引数を一つしかとりませんが、2つ以上だったり、配列(今学習では紹介してません)だったりと、複雑な関数もあります。ただ、戻り値は必ず一つです。

ユーザー関数

ユーザー関数とは、もうお分かりかと思いますが、定義済み関数以外の独自に作る関数です。一番簡単な構文は次のようになります。

Function 関数名
  
End Function

関数はFunctionというキーワードから始まりますが、構文はSubにとても似てます。実はVBAのFunctionは引数も戻り値も必須ではありません。引数と戻り値を定義する場合の構文は次のようになります。

Function 関数名(引数) As データ型
  
End Function

戻り値を定義しているのがAs データ型という箇所です。尚、構文は異なりますが、Functionというキーワードは他の言語でもよく使われます。

さっそく次のような関数を作ってみたいと思います。

2つの数値の差を返す関数で、2つの数値は整数。差は絶対値。

プログラムを書くと次のようになります。test9の中で呼ばれる「差分」という名前の関数を作りました。

Sub test9()
Dim intA As Integer
Dim intB As Integer
Dim intRet As Integer

  intA = 6
  intB = 10
  intRet = 差分(intA, intB) ‘関数呼び出し
  MsgBox intRet

End Sub
Function 差分(A As Integer, B As Integer) As Integer
Dim intRet As Integer

  intRet = Abs(A – B) ‘AとBの差の絶対値を変数intRetに代入
  差分 = intRet ‘戻り値を設定

End Function

関数は単独で実行することができず、上記のようなtest9というプログラムが必要になります。(専門的にはtest9をドライバと呼びます。)実行するにはtest9のどこかにカーソルを移動してF5を押下します。

ところで、test9の中の差分関数を呼び出す際の引数に注目してください。変数名は差分関数の引数と同じ名前でなくてもかまいません。しかし、データ型は同じでないといけません。

VBAでは関数の引数のデータ型と違うデータ型でもエラーが起きないことがあります。独自のルールのため説明は省略させていただきます。

また、差分関数の戻り値のデータ型と、変数intRetのデータ型が同じことも注目点です。

ユーザー関数2

関数の使い方、ユーザー関数の作り方をポイントを絞って紹介してきました。次はもう少し実用的な関数を作ってみたいと思います。BMIという言葉を聞いたことがあるでしょうか?メタボを判断するために使われるもので、次の計算式で表されます。

BMI=体重÷身長の2乗

今回は上記の計算結果を返すBMI計算関数を作りたいと思います。引数と戻り値は次の通りです。

  • 引数1:体重・Double型
  • 引数2:身長・Double型(身長はセンチメートルではなくメートルです)
  • 戻り値はDouble型
  • 仮に体重は57.5、身長は1.58を使います。

まずはご自身で考えて作ってみましょう。

BMI関数 回答例

Sub test10()
Dim dbl体重 As Double
Dim dbl身長 As Double
Dim dblRet As Double

  dbl体重 = 57.5
  dbl身長 = 1.58
  dblRet = BMI計算(dbl体重, dbl身長)

  MsgBox dblRet

End Sub


Function BMI計算(dbl体重 As Double, dbl身長 As Double) As Double
Dim dblRet As Double

  dblRet = dbl体重 / (dbl身長 * dbl身長)
  BMI計算= dblRet

End Function

プログラムを実行して「23.0331677615767」が表示されるのを確認してください。

2回目問題の解答

問題1(基本)の回答例

Sub Test3()
Dim a As Integer
Dim b As Integer
Dim intC As Integer

  a = 1
  b = 4

  intC = a * b

  MsgBox intC

End Sub

問題2(難問)の回答例

Sub Test5()
Dim intA As Integer
Dim strA As String

  intA = 100
  strA = “intAの中身は”

  MsgBox strA & intA  ‘文字列と数値をつなげるときは&演算子を使う
End Sub

まだ、紹介していない事柄だったので、一番最後の命令が難関だったと思います。文字列と文字列、文字列と数値など、文字列をつなげるときは演算子の&(アンパサンド)を使用します。これはVB固有です。JAVAは+を文字列の連結として使ってます。PHPでは、. が使われます。

MsgBox strA + intA

と記述するとプログラムの実行時に「型が違います」というエラーが発生したと思います。 どのように記述するのかネットで検索するなら

「文字列 連結 VB」で回答が得られたかと思います。