- PR -

Purocedureの名前を変数にしたいのですが

投稿者投稿内容
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2003-12-18 23:31
はじめまして。VBA ==> VB.NETに奮闘中の.NET初心者です。

VBAのRunメソッドの移行がうまくいかずに困っています。

Module A1
  public Sub Test()
end sub
end module

Module A2
  public Sub Test
end sub
end module

という構成になっており、変数が"A1"のときは、A1.Testを、変数が"A2"のときは、A2.Testを実行したいのですが、VBAでは

dim proc as string
proc = 変数 & ".Test”
Run proc

というコードでそれぞれのプロシージャを実行してくれたのですが、VB.NETではそのようなことは出来ないのでしょうか。

もちろん

Select 変数
  case ”A1”
    call A1.Test
  case ”A2”
    call A2.Test
end Select

とすれば良いのはわかるのですが、変数の種類が膨大にあり、出来れば変数そのものを使ってコントロールしたいのですが。

どなたか、良い方法があれば教えてください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-18 23:49
 せっかくの(不完全ではあるが)オブジェクト指向なので、オブジェクト指向でいきませんか?

次のように定義します。

Public Interface IDoProc
Public Sub DoTest()
End Interface

Public Class A1 Implements IDoProc
Public Sub DoTest() Implements IDoProc.DoTest
' 実装
End Sub
End Class

Public Class A2 Implements IDoProc
Public Sub DoTest() Implements IDoProc.DoTest
' 実装
End Sub
End Class

使うときは、準備として、
Dim TestProcess As IDoProc
と宣言しておき、これへの参照代入で、
TestProcess = New A1
または、
TestProcess = New A2
とします。
すると、TestProcess.DoTestで、A1.DoTestまたはA2.DoTestが実行されます。

 実際にどのように使用したいのか、全容がわかりませんので適用できるかどうかわかりませんが、詳しくはオブジェクト指向で、「インターフェース」や「仮想関数」をキーに調べてみてください。

#あれ?VBA?VB6じゃなくて?
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2003-12-19 10:43
Jittaさん。.NETを使う以上、オブジェクト指向で行きたいと思っているところでしたので、お教えいただいたコードでぜひ試してみたいのですが、初心者の悲しさで、なかなかうまくいきません。(ちなみに、元のコードはVB6じゃなくて、EXCELのVBAです。)

エラーの状況と、追加の質問なのですが、

1 Public Interface IDoProc
2 Public Sub DoTest()
3 End Interface

4 Public Class A1 Implements IDoProc
5 Public Sub DoTest() Implements IDoProc.DoTest
6 ' 実装
7 End Sub
8 End Class

9 Public Class A2 Implements IDoProc
10 Public Sub DoTest() Implements IDoProc.DoTest
11 ' 実装
12 End Sub
13 End Class

の2行目のPublicと4、5、9、10のInplementsにコンパイルエラーが出てしまいます。
何か参照設定が足りないということでしょうか?

また、

15 Dim TestProcess As IDoProc
16 TestProcess = New A1
17 TestProcess.DoTest

で、16行目のコードを

Dim XXX as string
XXX="A1"
TestProcess = New XXX

というように、String型の変数を使うことは可能でしょうか。


FOX
ベテラン
会議室デビュー日: 2002/04/08
投稿数: 63
お住まい・勤務地: いなか
投稿日時: 2003-12-19 11:16
こんにちは

以下の行が間違っているので関連して5.10でエラーが出ているのでしょう。
#コンパイラがA1,A2クラスがIDoProcを実装するのがわからない

コード:
4 Public Class A1 Implements IDoProc 
9 Public Class A2 Implements IDoProc


":"か改行をImplements前に入れましょう
コード:
4 Public Class A1 : Implements IDoProc 
9 Public Class A2 
       Implements IDoProc



引用:

Dim XXX as string
XXX="A1"
TestProcess = New XXX

というように、String型の変数を使うことは可能でしょうか


リフレクションでしょうか?

コード:
Dim t As Type = Type.GetType("A1")
Dim TestProcess As IDoProc = Activator.CreateInstance(t)
TestProcess.DoTest()



Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-19 11:56
 すみません。家でテキトーに直打ちしたので、「後で直さないとなぁ」と思いながら、すっかり忘れていました。。。

 FOXさん、ありがとうございます。そういうこと(リフレクション)ができるのか。仮想クラス作ってそこでSelectしてインスタンス作っていたのだが・・・書き直そう。
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2003-12-19 13:34
FOXさん、回答ありがとうございました。

早速試してみたのですが、inplementsのエラーは解消されたのですが、リフレクションでエラーが発生してしまいました。

コード:
--------------------------------------------------------------------------------

1 Dim t As Type = Type.GetType("A1")
2 Dim TestProcess As IDoProc = Activator.CreateInstance(t)
3 TestProcess.DoTest()

--------------------------------------------------------------------------------

2行目で
エラーメッセージ:
--------------------------------------------------------------------------------
'System.ArgumentNullException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : 値を Null にすることはできません。
--------------------------------------------------------------------------------

が発生します。どうしてでしょうか?
FOX
ベテラン
会議室デビュー日: 2002/04/08
投稿数: 63
お住まい・勤務地: いなか
投稿日時: 2003-12-19 13:54
こんにちは。

多分型が見つからないのでしょう。

#Type.GetType("***")が失敗しているからCreateInstanceの引数がNothingだとしかられる。

まず確認すべきはType.GetTypeに渡した文字列がどうなっているかです。
先ほどの例では"A1"と書いてしまいましたがそのクラスはある名前空間に属しているはずです。
VS.NETを使用しているようなのでクラスビューでタイプを取得したい型を探してみてください。

たとえば"MyApp.A1"のような名前です。
これを渡して実行してみてください。

なおType.GetTypeで型を取得できるのは実行中のアセンブリとmscorlibだけです。
その点を注意してください。
#詳しくはType.GetTypeのヘルプを見てください。
くまのぷーさん
常連さん
会議室デビュー日: 2003/12/18
投稿数: 34
投稿日時: 2003-12-19 14:27

クラスの名前空間を入れたら、解決しました!!!

Foxさん、Jittaさん、本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)