2022年4月10日日曜日

簡単に言えば、SubとFunctionの違いは、値を持てるか持てないかということなんだな ー Functionモジュール(VBA)

ラグビーのトスみたい
      
今まで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 件のコメント:

コメントを投稿