- ベストアンサー
関数の引数に複数のユーザ定義型変数を使いたい
一つの関数の一つのパラメータが異なるユーザ定義型を受けられるようにしたいのですが、どのようにすればいいのでしょうか? Public Type TypeA strCodeA As String intNumA As Integer End Type Public Type TypeB strCodeB As String intNumB As Integer End Type Public Function funcTest(arg1 As Variant) As Integer (略) End Function と記述して関数を Dim datA As TypeA iResult = funcTest(datA) と呼び出そうとすると、次のようなエラーメッセージが表示されて進みません。 コンパイルエラー: パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ユーザ定義型ではなく、クラスを使いましょう。 インスタンスの生成(New)と破棄に気をつければ、ユーザー定義型と殆ど同じ使い勝手です。 例えば ---------------------- Class1'TypeAの代わり Option Explicit Public strCodeA As String Public intNumA As Integer ---------------------- Class2'TypeBの代わり Option Explicit Public strCodeB As String Public intNumB As Integer としておいて Dim TypeA1 As New Class1 Dim TypeB1 As New Class2 TypeA1.strCodeA = "Code1" TypeB1.strCodeB = "Code2" Call funcTest(TypeA1) 'call funcTest(TypeA)もどき Call funcTest(TypeB1) 'call funcTest(TypeB)もどき という風に出来ます。 funcTestでは Public Function funcTest(arg1 As Variant) As Integer Dim c1 As Class1 Dim c2 As Class2 If TypeOf arg1 Is Class1 Then '引数がClass1 Set c1 = arg1 Debug.Print c1.strCodeA Else If TypeOf arg1 Is Class2 Then '引数がClass2 Set c2 = arg1 Debug.Print c2.strCodeB End If End If End Function のようにすればいいでしょう。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
バリアントは、何でもOKみたいなイメージがありますが、 固定長の文字列とユーザー定義型は格納できません。
お礼
そのようですね。 Cのvoid型ポインタのように使おうとしてみたのですが、考えが甘かったようです。
お礼
迅速且つ的確な御回答、ありがとうございました。 クラスモジュールはあまり使ったことがなかったのですが、おかげで視野が少し広がったような気がします。