ACCESS VBA Functionプロシージャとは
ACCESS VBAでプロシージャ(プログラム)を書く際に、一番最初に
Private Sub
もしくは
Private Function
という書き方をします。
この2つ、どんな違いがあるかわかりますか?
私もACCESS VBAを始めた当時はこの違いがわかりませんでした。
そこで、今回はFunctionプロシージャについてご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
目次
SubとFunctionの違い
SubとFunctionの違いは非常に簡単にいうと、ただ実行するだけか、値を返すか、です。
Sub | 実行するだけ |
Function | 値を返す |
通常のプロシージャは処理を実行することを目的としますので、Subで作成すれば問題ないでしょう。
Functionは、それ自体が値を返すので、言い換えれば自分専用の関数を作っているようなものです。
一方で、SubとFunctionをきちんと使い分けなければいけないか言うとそんなことはありません。
Functionを使わなくても、Subだけで解決することはできますので安心してください。
SubとFunctionの記述方法の違い
もう少し違いを分かりやすくするために、SubとFunctionそれぞれの宣言時の記述方法を見てみましょう。
例として指定した日付から「月」を取り出すプロシージャを作成しました。
Subの場合
Public Sub getmonth1(x As Date)
Dim month_number As Long
month_number = Month(x)
End Sub
Functionの場合
Public Function getmonth2(x As Date) As Long
getmonth2 = Month(x)
End Function
それでは以下で説明します。
Functionプロシージャはデータ型を指定する
まずは最初のプロシージャ宣言部分です。
Subの場合は
Public Sub getmonth1(x As Date)
に対して、Functionの場合は
Public Function getmonth2(x As Date) As Long
となります。
最初のPublic SubがPublic Functionになっているのは、Functionを宣言するためなので分かりやすいと思いますが、もう一つ大きな違いはFunctionの場合は最後に As Long がついていることです。
この場合のLongは整数のデータ型を示しています。
この、As データ型という記載方法はどこまで見たことがあると思いませんか。
そうです。変数を Dim 変数 As データ型 と宣言するのと同じです。
この場合はgetmonth2というFunctionプロシージャ自体に整数のデータ型を適用しているのです。
つまり、getmonth2という変数は整数の値が入る、という定義をしています。
Functionプロシージャを実行すると、そこで宣言したプロシージャ名(今回はgetmonth2)に、指定したデータ型の戻り値が入って返されます。
Functionプロシージャは戻り値を変数で指定する必要がない
次にプロシージャの内容です。
Subの場合は
Dim month_number As Long
month_number = Month(x)
と、2行になっているのに対して、Functionの場合は
getmonth2 = Month(x)
の1行で済んでいます。
これは、Subの場合は処理によって得られた「月」の値を戻すために、その値を格納する変数を別途作成する必要があるためです。
今回はmonth_numberという変数を作成して、そこにMonth関数で得られた値を格納して戻す、という処理をしています。
一方でFunctionプロシージャの場合は、getmonth2自体に値を格納できますので、変数を別途宣言する必要がなく、直接代入するために簡素な記述で作成できています。
このように、戻り値が必ず発生するような処理であれば、Functionプロシージャとして作成したほうが記述方法がわかりやすくなります。
SubとFunctionの呼び出し方の違い
次に、SubとFunctionを他のプロシージャから呼び出す場合の違いをご説明します。
例えば売上伝票入力フォームの売上日が更新された際に、入力された売上日をもとに上記の2つのプロシージャで月の値を求め、メッセージボックスで表示する例を以下に記載します。
Subの場合
Private Sub 処理日_AfterUpdate()
Call getmonth1(Date)
MsgBox month_number
End Sub
Functionの場合
Private Sub 処理日_AfterUpdate()
MsgBox getmonth2(Date)
End Sub
Subの場合は単純にプロシージャの処理を呼び出すだけで、その後のメッセージボックスへの表示は2行目で別処理を作成する必要があります。
一方のFunctionの方はFunction自体に戻り値があるため、直接MsgBox関数の引数にして処理を簡略化できるのです。
以上、Functionプロシージャについてご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。