ラグビーのトスみたい |
今までVBAのコードを書いてきましたが、Functionプロシージャは未経験です。
VBAの関数のように、処理内容を定義して関数を作ることができるという分け。
関数と言えば、自分の印象は数式みたいな感じですが、処理のひとかたまりね。
プロシージャとしては、Subという形態も加えてFunctionも用意されているの。
何が違うかと言えば、大きな特徴は呼び出し元に値を戻す事ができることだな。
だから、あたかも関数みたく動作しますので、ユーザー定義関数とも言えます。
例えば、長いプロシージャのコードの途中で、複雑な計算をする必要が出ます。
しかも、この計算式が、プログラム全体で複数回使う必要があるとしましょう。
こんな時、このFunctionを用意して実行した結果を受け取るように処理します。
今まで自作したことがありませんでしたが、ネットで見つけたコードは使った。
一方、自分の書いてきたコードでは、変数渡しの”Call”をよく使ってきました。
なのに、値を渡して戻り処理結果の値を受け取るプロシージャは、なかったの。
その代わり、パブリック変数を使って、他のSubプロシージャで計算値を取得。
その値をこの変数で使い回して代入すれば、どのモジュールでも使いこなせる。
だから、敢えてFunctionプロシージャを使わなかったのかもしれないと思うな。
一方、引数を設定しなくても、処理の結果による戻り値を取得できたりもする。
というわけで、サンプルコードを列挙しますので、ヒントにしてみて下さいな。
ネットでググっても、このプロシージャを使うことに有用性や意義を見出せるサンプルコードが見つからなかったので、これならどうだろうかと考えてみたのですが、変数を渡して計算して戻り値が得られるというメリットがあれば、使っていただきたという事なのでした。
※引数を与えて、処理の結果で戻り値を取得
(セル値の日付と、今日の日付の日数差を計算)
Sub Sample()
Dim Dte As Variant
Dte = Range("A1").Value
Debug.Print functn(Dte)
End Sub
Function functn(Dte As Variant) As Long
Dim Dte2 As Variant
Dte2 = Format(Now, "yyyy/mm/dd")
functn = DateDiff("d", Dte, Dte2)
End Function
※引数がないが、処理の結果によって戻り値を取得
(フルパスでファイル名を取得する)
Sub Sample() 'ブックの保存先にあるテキストファイルを開く
Dim buf As String
With CreateObject("Scripting.FileSystemObject")
With .GetFile(functn()).OpenAsTextStream
buf = .ReadAll
.Close
End With
End With
Range("A1") = buf
End Sub
Function functn() As String
Dim Str As Variant
Str = ""
Str = Str & ThisWorkbook.Path
Str = Str & "\"
Str = Str & "test.txt"
functn = Str
End Function
0 件のコメント:
コメントを投稿