VBA 関数の作成と呼び出し

はじめに

Excel VBA マクロで関数の作成と呼び出し方法を紹介します。

Sub 関数 は戻り値を返さない関数です。Call 関数名 のようにして呼び出します。マクロを実行すると、その Sub 関数が実行されます。

Function 関数 は戻り値を返す関数です。変数 = 関数名 のようにして呼び出します。計算結果を取得するときなどに使用します。

関数は処理を 1 つにまとめ、再利用できます。コードの可読性にもつながります。

関数に引数を渡す方法については「関数に引数を渡す」をご覧ください。
  • 目次
    • 関数を作成する
    • 関数の呼び出し
    • 標準モジュールの関数の呼び出し
    • 関数を抜ける
    • なぜ関数を作成するのか

関数を作成する

VBA の実行方法がわからない方は、先に「マクロを作成して実行する」をご覧ください。

VBA のプロジェクトウィンドウから関数を作成したい [シート] または [標準モジュール] をダブルクリックします。

3

関数には戻り値を返さない 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 つも機能を詰め込むと、処理が複雑になります。