おしゃれにいけてる?

散歩やお買い物のことなどを書いています・・・

Entries

 EXCEL VBA マクロ TIPs. [ Function (関数)プロシジャーで、配列とか構造体とか、複数の値を渡す・返す方法。 ]

 Function Procedure に、配列を引数として渡す方法。この場合、参照渡ししか許されない。

   Function func1(ByRef a() As Integer)
     
   End Function

また、配列は、静的配列か動的配列かで、Variant 配列は渡せない。

func1( ) を呼び出すときは、こんな感じ。

   Dim h() As Integer
   h = Array(1, 2, 3)
   ans = func1(h)

 Function プロシジャーから、配列を返すこともできる。

   Function func1(ByRef a() As Integer) As Integer()
     func1 = a
   End Function

これを、

   Dim h() As Integer
   Dim ans() As Integer
   h = Array(1, 2, 3)
   ans = func1(h)

こんな感じで受け取る。戻り値データは、値渡しで返される。

ただし、受け取る側の配列 ans は、動的配列または Variant 型じゃないといけない。

EXCEL'97では、この記述はできなかった。その場合は、戻り値の型を Variant 型に明示すれば OK。

   Function func1(ByRef a() As Integer) As Variant
     func1 = a
   End Function

 配列を使わずに、複数のデータを渡す場合は、ユーザー定義型の変数を使う。C言語で言う、構造体のようなもの。ユーザー定義型の変数名を TypeTest とすると、

   Type TypeTest
     a As Integer
     b As String
     h() As Integer
   End Type

のような形で定義できる。使い方は、

   Dim tmp As TypeTest
   ans = TypeTest.a

という感じで、構造体の様にメンバを参照できる。

ユーザ定義型変数 TypeTest を戻り値として返す関数は次のように定義する。

   Function Tfunc(in As Integer) As TypeTest
     Tfunc.a = in
   End Function

こんな感じ。これを、

   Dim ans As TypeTest
   ans = Tfunc(10)

の様にして、受け取る。

 ユーザー定義型は、配列としても使える。

   Dim t() As TypeTest

ここで、注意。先の例では、メンバ変数として動的配列 h() を定義したけど、これを使うためには、たとえば、

   ReDim t(1)
   ReDim t(0).h(1)
   ReDim t(1).h(1)

の様に、各インスタンスごとに、動的配列の領域を再確保しなくてはいけない。これ、けっこう面倒。このパターンは、できれば使いたくない。

ユーザ定義型変数の配列を、引数・戻り値に持つ関数の定義方法。(引数をそのまま返す例。)

   Function Tfunc(t() As TypeTest) As TypeTest()
     Tfunc = t
   End Function

この関数の値は、

   Dim ans() As TypeTest
   ans = Tfunc(t)

と、TypeTest 型の[動的]配列で受け取らないといけない。(静的配列や、Variant 型では受けられないので、注意が必要。)

ま、EXCEL VBA でここまで使うかは疑問だけど、いつか、使うときのために、メモ、メモ。

PS. もし、この記事が役に立ったら、「拍手」で知らせて下さい。

スポンサードリンク

Comment

Comment_form

管理者のみ表示。

左サイドメニュー

プロフィール

Author:ジョニー

ゆるゆると日々を過ごしてしまう、ダメダメ野郎の航海日記。



クリック (・。・)yoro

このブログ内を検索

最近の記事

カテゴリー

最近のコメント

QRコード

QRコード

月別アーカイブ

右サイドメニュー

カレンダー

02 | 2020/03 | 04
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

スポンサードリンク

FC2カウンター

#1471