複数のクラスモジュールがあるプログラムです。
【例】
クラスモジュールは Class1 Class2 Class3 Class4 ・・・ 複数あります。
クラスを使用するために下記の様にプログラムを作っています。
Dim clsObject1 As Object
Dim clsObject2 As Object
Dim clsObject3 As Object
Dim clsObject4 As Object
Set clsObject1 = New Class1
Set clsObject2 = New Class2
Set clsObject3 = New Class3
Set clsObject4 = New Class4
・・・
'後続の条件処理において、実際に使用するのは1つのクラスしかありません。
Dimの宣言を Dim clsObject As Object ひとつだけにして、
条件処理を最初に行い、Set clsClass = New Class○ ひとつだけに
したいのですが、このような処理はできるのでしょうか?
> Dimの宣言を Dim clsObject As Object ひとつだけにして、
> 条件処理を最初に行い、Set clsClass = New Class○ ひとつだけに
> したいのですが、このような処理はできるのでしょうか?
たとえば、呼び出し側のコードを
Dim clsObject As ISample 'もちろん、As Object でも受け取れます
Set clsObject = Module1.CreateSample(0)
clsObject.Test
のようにしても良いのなら、このように実装できます。
'------ クラス(ISample)
Option Explicit
Public Sub Test()
End Sub
'------ クラス(Class1)
Option Explicit
Implements ISample
Private Sub ISample_Test()
MsgBox "Class1"
End Sub
'------ クラス(Class2)
Option Explicit
Implements ISample
Private Sub ISample_Test()
MsgBox "Class2"
End Sub
'------ クラス(Class3)
Option Explicit
Implements ISample
Private Sub ISample_Test()
MsgBox "Class3"
End Sub
'------ 標準モジュール(Module1)
Option Explicit
Public Function CreateSample(ByVal p As Integer)
If p = 0 Then
Set CreateSample = New Class1
ElseIf p < 0 Then
Set CreateSample = New Class2
ElseIf p > 0 Then
Set CreateSample = New Class3
End If
End Function
魔界の仮面弁士さん、ありがとうございます。
書込みした内容で対応できないか検討しましたが、
【引用】
> '------ 標準モジュール(Module1)
> Option Explicit
> Public Function CreateSample(ByVal p As Integer)
> If p = 0 Then
> Set CreateSample = New Class1
> ElseIf p < 0 Then
> Set CreateSample = New Class2
> ElseIf p > 0 Then
> Set CreateSample = New Class3
> End If
>End Function
上記部分を
Set CreateSample = New Class ' ← ココを1回だけにしたいのです。
If p = 0 Then
CreateSample.Test
ElseIf p < 0 Then
CreateSample.Test
ElseIf p > 0 Then
CreateSample.Test
End If
という感じにしたいのですが、出来ないでしょうか?
> という感じにしたいのですが、出来ないでしょうか?
提示されたコードだけなら、
Set CreateSample = New Class1
CreateSample.Test p
のようにすれば済みそうですが…そういう事では無く?
ActiveX.DLL にして
Set CreateSample = CreateObject("hoge.Class" & CStr(p))
とか?
魔界の仮面弁士さん、再度ありがとうございます。
その感じではないんですよね。
Kozさん、ありがとうございます。
対象になるクラスが、ActiveX.DLL 単位にありますので
可能であるかどうか試してみます。
Kozさん、ありがとうございます。実現できました!
> Dim clsObject1 As Object
> Dim clsObject2 As Object
> Dim clsObject3 As Object
> 'DLLはActiveX.DLL です。
> Set clsObject1 = New Class1 'A010.DLL のクラスモジュール
> Set clsObject2 = New Class2 'A020.DLL のクラスモジュール
> Set clsObject3 = New Class3 'A030.DLL のクラスモジュール
の部分を
Dim strClass AS String
If p = 0 Then
strClass = "A010.Class1"
ElseIf p < 0 Then
strClass = "A020.Class2"
ElseIf p > 0 Then
strClass = "A030.Class3"
End if
Set CreateSample = CreateObject(strClass)
とすることで対応できました。
ありがとうございます。
魔界の仮面弁士さんも書込みありがとうございました。