サイトについて      連絡先   検索

VBA 関数の作成と呼び出し

はじめに

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

Sub 関数と Function 関数の 2 種類があります。作成した関数は VBA やマクロとして実行することも、他の関数から呼び出すこともできます。

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

  • 目次
    • 関数を作成する
    • 関数の呼び出し
    • 関数のスコープ
    • 関数を抜ける
    • なぜ関数を作成するのか

関数を作成する

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

2

関数には実行だけする Sub 関数と、その結果を戻り値として返す Function 関数の 2 種類があります。

Sub 関数:戻り値を返さない

Sub 関数名()のように入力します。最後に Enter キーを入力すると、自動で End Sub が追加されます。


Sub サブ()
    ' ここに処理を記載
End Sub

Function 関数:戻り値を返す

Function 関数名() As 型名のように入力します。最後に Enter キーを入力すると、自動で End Function が追加されます。

型名がこの関数の戻り値の型です。関数名に値を代入すると、それが戻り値になります。


Function ファンクション() As String
    ' ここに処理を記載
    ファンクション = "戻り値"
End Function

VBA で最初に実行されるコードが Sub 関数です。そこから別の関数を呼び出して、コードを作成していきます。

ワークシートと標準モジュールの違い

ワークシートと標準モジュールのどちらに関数を作成したらいいのか迷ったら、次の方法で分けられます。

Sheet1 を操作したいなら Sheet1 に、すべてのワークシートに対して操作したいなら標準モジュールに関数を作成します。

関数の呼び出し

Sub 関数を呼び出すには関数名またはCall 関数名のように入力します。


' 最初に実行される
Sub 実行()
    ' Sub 関数を呼び出す
    サブ
    Call サブ
End Sub

' この関数が実行される
Sub サブ()
    Debug.Print ("サブ関数を呼び出しました")
End Sub

Function 関数を呼び出すには関数名のようにします。Function 関数には戻り値があるので、それを変数などに代入するときは変数 = 関数名のようにします。


' 最初に実行される
Sub 実行()
    ' Function 関数を呼び出す
    Dim s As String
    s = ファンクション ' s に "戻り値" が設定される
End Sub

' この関数が実行される
Function ファンクション() As String
    ファンクション = "戻り値"
End Function

関数に引数を渡す

関数は呼び出すだけでなく、渡した値によって処理を変えることができます。その値のことを「引数」と言います。引数があるときは Sub 関数に Call を付けるのをオススメします。

関数のスコープ

Sheet1 から標準モジュールや、標準モジュールから Sheet1 など、別ファイルの関数を呼び出す方法を紹介します。

Sub や Function の呼び出し方にファイル名.関数名のように、関数名の前にそのファイル名を入力します。標準モジュールの関数は、ファイル名を付けなくても呼び出せます。

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 になっている必要があります。

関数を抜ける

Exit Subを入力して、そこで Sub 関数を抜けられます。


Sub Tips(i As Integer)
    If i = 0 Then
        Exit Sub ' ここで関数を抜ける
    End If
    
    Debug.Print (i) ' i が 0 のとき、この処理は行われない
End Sub

Exit Functionを入力して、そこで Function 関数を抜けられます。


Function Found(i As Integer) As Integer
    If i = 0 Then
        Found = 100
        Exit Function ' ここで関数を抜ける
    End If
    
    Debug.Print (i) ' i が 0 のとき、この処理は行われない
End Function

引数が不正な値のときや、エラーの発生などでこれ以上関数を実行できなくなったときなどに処理を抜けます。

なぜ関数を作成するのか

1 つは VBA を実行するためです。Sub 関数がなければ VBA を実行できません。

もう 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 つの機能を与えます。2 つも 3 つもできるようにすると、処理が複雑になります。

  • 目次
    • 関数を作成する
    • 関数の呼び出し
    • 関数のスコープ
    • 関数を抜ける
    • なぜ関数を作成するのか