Functionは、ユーザー定義関数等でよく、紹介されます。
戻り値が、あるとかないとか、クラスモジュールほどではないですが、難しいですよね。
今回は、Functionであそんでみましょう。
目次
Functionを勉強するとどうなる?
こんにちは。伊川(@naonaoke)です。
Functionを覚えるよりも、Callステートメントを知っているから大丈夫なんてことを、初心者の頃は思っていました。
VBAの醍醐味は、いかに、少ないコードで、大量の処理をするか?
このことを意識して、コードを書いています。
いい曲は、ギター1本でできるのさ
これは、桑田佳祐さんの言葉ですが、いいコードは、8行以上、15行未満で記載できます。
つまり、このスキルを取得するには、Functionを勉強するのが一番いいでしょう。
適当なコードが見つからなかったので、NETで探しました。
https://www.sejuku.net/blog/28904
このページのコードを参考にしています。
このブログはこんな人にお勧め
- Excelで、VBAを勉強している人
- ExcelVBAで、Functionを勉強している人
- VBAのコードをできるだけ短くしたい人
このブログを、読み終わるころには・・・・
NETでFunctionを検索しても、結構、難しく、わかりにくいと思います。
そんな時は、できるだけ、カンタンなコードを、少しアレンジしてみましょう。
その繰り返しは、結構、勉強になります。
Function
消費税でもなく、合否判定でもなく、NETでは、紹介していないような内容を紹介します。
と言っても、すでにパクリなんですけどね
今回は、完成形というよりは、勉強方法も含めて紹介します。
F(x)=2x+1、このような数式を、だれもが勉強したと思います。
F(X)は、関数のニックネームですね。
Functionは、関数という意味で、何かの値が決まれば、何かの値が決まるということです。
この考え方は、VBAにも同じことが言えます。
そのように考えながら進めていきます。
Functionを勉強する 作業手順 その1 引数無、戻り値ありの場合
Function funca() As String
funca = “Hello VBA!”
End Function
funcaの、戻り値のデータ型は、String型です。
戻り値は、Hello VBA!”です。
Sub macro1_2() Dim str As String str = funca() Range("B1") = str End Sub Function func1() As String func1 = "Hello VBA!" End Function
これだけでは面白くないでの、ループを合わせます。
Sub macro1_3() Dim str As String Dim i As Long maxrow = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To maxrow str = funcb() Cells(i, 2) = str Next i End Sub Function funcb() As String funcb = "Hello VBA!" End Function
ここまで大丈夫ですね。
Functionを勉強する 作業手順 その2 引数が1つの場合
引数が1つの場合はプロシージャ名の後の「()」の中にByVal句を使って引数名とそのデータ型を指定します。
Function func2_1(ByVal num As Integer) As Integer
Dim square As Integer
square = num ^ 2
func2_1 = square
End Function
呼び出す場合は、下記のようになります。
参照渡し、値渡しは、下記の記事を参照してください。
Sub macro2_1() Dim str As Long Dim num As Integer num = 3 str = func2_1(num) Range("A1") = str End Sub Function func2_1(ByVal num As Integer) As Integer Dim square As Integer square = num ^ 2 func2_1 = square End Function
ここで、私が勉強していた時なんですが、Functionを先に書くのか、Subを先に書くのか、迷ったことがあります。
正解はどっちでもいいですね。
やりたいことをFunction無で記載してみます。
Sub test() Dim str As Long Dim num As Integer Dim square As Integer num = 3 square = num ^ 2 str = square Range("B1") = str End Sub
同じ結果になります。
勉強していた時は、このコードについて、Functionを使って変形します。
Functionから、普通のコードへ変形します。
何度か繰り返すと、普通にできるようになります。
Functionを勉強する 作業手順 その3 引数が複数の場合
Sub macro4() Dim sum As Integer Dim mul As Integer Dim num1 As Integer Dim num2 As Integer num1 = 2 num2 = 3 sum = 0 mul = func4(num1, num2, sum) Dim str As String str = CStr(num1) & " + " & CStr(num2) & " = " & CStr(sum) & ", " & CStr(num1) & " * " & CStr(num2) & " = " & CStr(mul) MsgBox str, vbInformation End Sub Function func4(ByVal num1 As Integer, ByVal num2 As Integer, ByRef sum As Integer) As Integer sum = num1 + num2 func4 = num1 * num2 End Function
MsgBoxで表示しても面白くないので、一部変更します。
Sub macro4() Dim sum As Integer Dim mul As Integer Dim num1 As Integer Dim num2 As Integer num1 = 2 num2 = 3 sum = 0 mul = func4(num1, num2, sum) Dim str As Long Dim str2 As Long str = sum str2 = mul Range("A1") = str Range("B1") = str2 End Sub Function func4(ByVal num1 As Integer, ByVal num2 As Integer, ByRef sum As Integer) As Integer sum = num1 + num2 func4 = num1 * num2 End Function
ここのコードは、ByValと、ByRef の使い方がポイントです。
変数sumは、足し算の合計を計算していますので、参照渡しなら、答えは0になります。
ここは、変数の値を書き換える必要があります。
このコードの素晴らしいところは、この点です。
参照渡しか、値渡しなのは、初心者には、なかなか理解できません。
言葉は、2つしかないのに、イメージがつきませんよね?
足し算の合計は、変わらないから、Functionの計算結果を、変えずに親プロシージャへ渡します。
ここがポイント
コードを短くするには、Functionと、クラスモジュールは必須でしょう。
ご視聴者様から、クラスモジュールは面白いというコメントもいただきました。
すごく小さな喜びかもしれませんが、この喜びが重要なのです。
最初からはできません。
でも、脳裏で、Functionを考えることが重要なのです。
まとめ
先は、まだあるのですが、結構長くなりましたので、一旦ここで終わります。
この続きは次回にします。
Functionをマスターしましょう。
今回も最後まで読んでいただきありがとうございました。
今回のサンプルファイルは、No260です。
わからない事を延々と考えるのは、無駄です。
- なんで作動かないの?
- もうやだ!VBAなんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。