vba-training-06-アイキャッチ

VBAトレーニング-06 [関数操作について-①]-[FunctionとSubの違い]

このページで学習出来る事

 前回まではブックやシートオブジェクトの操作に関して解説をしてきましたが、6回目となる今回は、VBAの関数操作に関して説明をしていきます。

 一般的にコードは書けば書くほど行数が長くなっていきますが、プログラミングの作法としては長すぎる行数は好まれません。
 そこで関数を利用し「重複したり似ているコードをまとめる」「機能を一つの塊として集約する」「書いているコードを見やすくする」という事を助け、これら関数の機能はコードをシンプル化するために役立ちます。

 今回はこの関数の基本的な動きに関して説明をしたいと思います。

学習内容

  • 関数の作り方

  • [Function]関数と[Sub]関数の違い

この学習で使用するエクセルファイルはここからダウンロードできます。

  


サンプルコード

 [sample-06.xlsm]を開いて、中に書かれているコードを確認しましょう。
 今回のコードでは、二種類の関数[Sub]と[Function]が書かれています。

 このファイルをそのまま使用しても構いませんし、新しくエクセルファイルを作って、自身でコードを記載して動かしても構いません。(直接コードを書いた方が覚えやすいので、時間がある方は書く練習もしてみましょう)

Sub main()
    Dim tempNum As Integer
    
    tempNum = 10
    Call subAction(tempNum)
    Debug.Print (tempNum)

    tempNum = fncAction(tempNum)
    Debug.Print (tempNum)
End Sub


Private Sub subAction(ByVal tempNum As Integer)
    tempNum = tempNum + 1
End Sub


Private Function fncAction(ByVal tempNum As Integer) As Integer
    tempNum = tempNum + 1
    Debug.Print (tempNum)

    fncAction = tempNum
End Function

コードの解説 sub main()部分

‘引数に[tempNum]を設定し[subAction]関数を呼び出しています。(引数とは関数に渡す値の事です)
‘呼び出したい関数の前に[Call]を付けることで、関数が呼び出せます。
Call subAction(tempNum)

‘引数に[tempNum]を設定し[fncAction]関数を呼び出しています。
tempNum = fncAction(tempNum)

  

コードの解説 Sub subAction()部分

‘[Private Sub subAction]で関数[subAction]を定義しています。
‘[ByVal tempNum As Integer]で変数[tempNum]を取得しています。
Private Sub subAction(ByVal tempNum As Integer)
 tempNum = tempNum + 1
End Sub

  

コードの解説 Function fncAction()部分

‘[Private Function fncAction]で関数[fncAction]を定義しています。
‘[ByVal tempNum As Integer]で変数[tempNum]を取得しています。
‘[As Integer]で返す値の型を設定しています。
Private Function fncAction(ByVal tempNum As Integer) As Integer
 tempNum = tempNum + 1

‘[fncAction = tempNum]にて[tempNum]を返しています。
 fncAction = tempNum
End Function

  


Sub関数内での処理確認

 [Debug.Print]の所でブレークポイントを設定して実行してみましょう。
 [subAction]関数の中にあるブレークポイントで止まったところが確認できます。これは[Call subAction()]が実行され、処理が関数[subAction]に移ったことを意味します。

 ローカルウィンドウにある[tempNum]を確認すると「11」という数値が入っている事が確認できます。

  


Sub関数からの値の戻りについて

 変数の確認が終わったら、ブレークポイントで止まっている状態から再度動かしてみましょう。
 次のブレークポイントで止まったら再度[tempNum]を確認すると、先ほど「11」であったら数値が「10」に戻っていると思います。
 これは[subAction]関数の処理結果が[sub main()]に反映されていないために発生する現象です。

 どうして処理した結果が反映されないのかと言うと、「[Sub]で定義される関数は値を返さない」という特徴を持つ関数だからであり、[Sub]で定義される関数を使用する場合は、値を返さなくてもいい処理をまとめる必要があります。

Sub:関数内で処理した結果を返さない場合に使用する。

  


Function関数内での処理

 それでは、ブレークポイントで止まっている状態から再度動かしてみましょう。
 今度は[fncAction]関数の中にあるブレークポイントで止まったところが確認できます。これは処理が関数[fncAction]に移ったことを意味します。

 ローカルウィンドウにある[tempNum]を確認すると「11」という数値が入っている事が確認できます。

  


Function関数からの戻り値について

 再度ブレークポイントで止まっている状態から動かしてみましょう。
 次のブレークポイントで止まった後に[tempNum]を確認すると、実行前同様に「11」の数値になっていると思います。
 これは[fncAction]関数の処理結果が[sub main()]に反映された事になります。

 なぜ[Sub]と異なり[Function]では値が反映されたかというと、「[Function]で定義される関数は値を返す」という特徴を持つ関数だからであり、[Function]で定義される関数を使用する場合は、値を返す処理をまとめる必要があります。

Function:関数内で処理した結果を返す場合に使用する。

  


最後に

 今回は関数で宣言される種類の違いや、関数の作り方を説明しました。
 関数の使い方を覚えるとプログラムをスマートに書く事が出来るようになりますので、これからの内容を通して関数を勉強していきましょう。

   

 次回は、関数に渡す変数の扱いや種類を説明したいと思います。

  

前回-関連記事

このページで学習出来る事  VBAトレーニング5回目となる今回は、前回に引き続きExcelブックとシートの使い方について説明をしていきたいと思います。  ただ単純にシートを切り替えたり、削除したりするコードを覚えるのではなくブック[…]

VBAトレーニング-05
次回-関連記事

このページで学習出来る事  前回は関数の[Sub]と[Function]の違いについて説明しましたが、今回は関数への値の渡し方について説明をします。  値の渡し方には[ByVal(値渡し)]と[ByRef(参照渡し)]の二種類が存在し、それ[…]

vba-training-07-アイキャッチ