About
このページで学習出来る事
前回まではブックやシートオブジェクトの操作に関して解説をしてきましたが、6回目となる今回は、VBAの関数操作に関して説明をしていきます。
一般的にコードは書けば書くほど行数が長くなっていきますが、プログラミングの作法としては長すぎる行数は好まれません。
そこで関数を利用し「重複したり似ているコードをまとめる」「機能を一つの塊として集約する」「書いているコードを見やすくする」という事を助け、これら関数の機能はコードをシンプル化するために役立ちます。
今回はこの関数の基本的な動きに関して説明をしたいと思います。
サンプルコード
[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ブックとシートの使い方について説明をしていきたいと思います。 ただ単純にシートを切り替えたり、削除したりするコードを覚えるのではなくブック[…]
このページで学習出来る事 前回は関数の[Sub]と[Function]の違いについて説明しましたが、今回は関数への値の渡し方について説明をします。 値の渡し方には[ByVal(値渡し)]と[ByRef(参照渡し)]の二種類が存在し、それ[…]