プロが教えるわが家の防犯対策術!

一つの関数の一つのパラメータが異なるユーザ定義型を受けられるようにしたいのですが、どのようにすればいいのでしょうか?

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)
と呼び出そうとすると、次のようなエラーメッセージが表示されて進みません。

コンパイルエラー:
パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。

A 回答 (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

のようにすればいいでしょう。
    • good
    • 0
この回答へのお礼

 迅速且つ的確な御回答、ありがとうございました。
 クラスモジュールはあまり使ったことがなかったのですが、おかげで視野が少し広がったような気がします。

お礼日時:2006/05/18 23:07

バリアントは、何でもOKみたいなイメージがありますが、


固定長の文字列とユーザー定義型は格納できません。
    • good
    • 0
この回答へのお礼

 そのようですね。
 Cのvoid型ポインタのように使おうとしてみたのですが、考えが甘かったようです。

お礼日時:2006/05/18 23:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!