更新日:、 作成日:
VBA 関数の作成と呼び出し
はじめに
Excel VBA マクロで関数の作成と呼び出し方法を紹介します。
Sub 関数 は戻り値を返さない関数です。Call 関数名 のようにして呼び出します。マクロを実行すると、その Sub 関数が実行されます。
Function 関数 は戻り値を返す関数です。変数 = 関数名 のようにして呼び出します。計算結果を取得するときなどに使用します。
関数は処理を 1 つにまとめ、再利用できます。コードの可読性にもつながります。
関数を作成する
VBA のプロジェクトウィンドウから関数を作成したい [シート] または [標準モジュール] をダブルクリックします。
関数には戻り値を返さない Sub 関数と、結果を戻り値として返す Function 関数の 2 種類があります。
Sub 関数:戻り値を返さない
Sub 関数名() のように入力します。最後に Enter キーを入力すると、自動で End Sub が追加されます。
Sub サブ()
' ここに処理を記載
End Sub
マクロを実行すると、その Sub 関数が実行されます。Sub 関数名がマクロ名です。そこから別の関数を呼び出して、コードを作成していきます。
Function 関数:戻り値を返す
Function 関数名() As 型名 のように入力します。最後に Enter キーを入力すると、自動で End Function が追加されます。
型名がこの関数の戻り値の型です。関数名に値を代入すると、それが戻り値になります。
Function ファンクション() As String
' ここに処理を記載
ファンクション = "戻り値"
End Function
複数の値を返すには構造体やクラスなどを返します。
シートと標準モジュールの違い
シートと標準モジュールのどちらに関数を作成したらいいのか迷ったら、次の方法で分けられます。
- シート:そのシートに対して操作をするとき
- 標準モジュール:すべてのシートに対して操作をするとき
Sheet1 を操作したいなら Sheet1 に、すべてのシートに対して操作したいなら標準モジュールに関数を作成します。
スポンサーリンク
関数の呼び出し
Sub 関数の呼び出し
Sub 関数を呼び出すには 関数名 または Call 関数名 のように入力します。
' 最初に実行される
Sub 実行()
' Sub 関数を呼び出す
サブ
Call サブ
End Sub
' この関数が実行される
Sub サブ()
Debug.Print("サブ関数を呼び出しました")
End Sub
Function 関数の呼び出し
Function 関数を呼び出すには 関数名 のようにします。Function 関数には戻り値があるので、それを変数などに代入するときは 変数 = 関数名 のようにします。
' 最初に実行される
Sub 実行()
' Function 関数を呼び出す
Dim s As String
s = ファンクション ' s に "戻り値" が設定される
Debug.Print(s) ' 戻り値
End Sub
' この関数が実行される
Function ファンクション() As String
ファンクション = "戻り値"
End Function
関数に引数を渡す
関数は呼び出すだけでなく、渡した値を使って処理できます。その値のことを「引数」と言います。引数があるときは Call を付けて Sub 関数を呼び出します。
標準モジュールの関数の呼び出し
Sheet1 から標準モジュールや、標準モジュールから Sheet1 など、別ファイルの関数を呼び出す方法を紹介します。
関数を呼び出すときに ファイル名.関数名 のように、関数名の前にそのファイル名を入力します。標準モジュールの関数は、ファイル名を付けなくても呼び出せます。
Sheet1 のコード
Sub 実行シート()
' 標準モジュール1 の関数を呼び出す
Call Module1.標準サブ
Call 標準サブ ' 標準モジュールの関数は、関数名だけでも呼び出せる
Dim s As String
s = Module1.標準ファンクション
s = 標準ファンクション ' 標準モジュールの関数は、関数名だけでも呼び出せる
End Sub
Sub サブ()
Debug.Print("Sheet1 の関数を呼び出しました")
End Sub
Function ファンクション() As String
Debug.Print("Sheet1 の関数を呼び出しました")
End Function
標準モジュール1 のコード
Sub 実行モジュール()
' Sheet1 の関数を呼び出す
Call Sheet1.サブ
Dim s As String
s = Sheet1.ファンクション
End Sub
Sub 標準サブ()
Debug.Print("標準モジュール1 の関数を呼び出しました")
End Sub
Function 標準ファンクション()
Debug.Print("標準モジュール1 の関数を呼び出しました")
End Function
別ファイルの関数を呼び出すには、Public で関数を定義している必要があります。
関数を抜ける
引数が不正な値のときや、ループを途中で終了するなど、これ以上処理する必要がなくなったときに関数を抜けられます。
Sub 関数を抜ける
Exit Sub を入力して、そこで Sub 関数を抜けられます。
Sub サブ(i As Integer)
If i = 0 Then
Exit Sub ' ここで関数を抜ける
End If
Debug.Print(i) ' i が 0 のとき、この処理は行われない
End Sub
Function 関数を抜ける
Exit Function を入力して、そこで Function 関数を抜けられます。
Function ファンクション(i As Integer) As Integer
If i = 0 Then
ファンクション = 100
Exit Function ' ここで関数を抜ける
End If
Debug.Print(i) ' i が 0 のとき、この処理は行われない
End Function
なぜ関数を作成するのか
1 つはマクロを実行するためです。Sub 関数がマクロになるので、Sub 関数がなければマクロを実行できません。
もう 1 つは同じ処理をまとめるためです。次のように「実行1」関数と「実行2」関数で、同じようにセル「A1」に設定するコードがあります。
Sub 実行1()
Range("A1").Value = "Tipsfound"
Range("A1").Font.Color = RGB(255, 0, 0)
Range("A1").Interior.Color = RGB(255, 255, 0)
' 他の処理
End Sub
Sub 実行2()
Range("A1").Value = "Tipsfound"
Range("A1").Font.Color = RGB(255, 0, 0)
Range("A1").Interior.Color = RGB(255, 255, 0)
' 他の処理
End Sub
これを関数にまとめると次のように入力できます。
Sub 実行1()
セルの設定
' 他の処理
End Sub
Sub 実行2()
セルの設定
' 他の処理
End Sub
Sub セルの設定()
Range("A1").Value = "Tipsfound"
Range("A1").Font.Color = RGB(255, 0, 0)
Range("A1").Interior.Color = RGB(255, 255, 0)
End Sub
「セルの設定」という名前の関数にセル「A1」に設定する処理をまとめます。あとはこの関数を呼び出すだけです。このように処理をまとめると次のいいことがあります。
- 処理を再利用できる:同じ関数を呼び出すことで、必ず同じ処理になります。片方だけ入力ミスしてバグが発生することもありません。
- 処理に名前が付けられる:関数にまとめることで関数名から何の処理なのかがわかりやすくなります。可読性が良くなると保守しやすくなります。
- 修正が簡単になる:機能の変更や追加をするときに、1 つの関数だけを変更して対応できます。
一般的には 1 つの関数には 1 つの機能を与えます。2 つも 3 つも機能を詰め込むと、処理が複雑になります。
スポンサーリンク