- - PR -
Purocedureの名前を変数にしたいのですが
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 とすれば良いのはわかるのですが、変数の種類が膨大にあり、出来れば変数そのものを使ってコントロールしたいのですが。 どなたか、良い方法があれば教えてください。 | ||||||||||||||||
|
投稿日時: 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-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型の変数を使うことは可能でしょうか。 | ||||||||||||||||
|
投稿日時: 2003-12-19 11:16
こんにちは
以下の行が間違っているので関連して5.10でエラーが出ているのでしょう。 #コンパイラがA1,A2クラスがIDoProcを実装するのがわからない
":"か改行をImplements前に入れましょう
リフレクションでしょうか?
| ||||||||||||||||
|
投稿日時: 2003-12-19 11:56
すみません。家でテキトーに直打ちしたので、「後で直さないとなぁ」と思いながら、すっかり忘れていました。。。
FOXさん、ありがとうございます。そういうこと(リフレクション)ができるのか。仮想クラス作ってそこでSelectしてインスタンス作っていたのだが・・・書き直そう。 | ||||||||||||||||
|
投稿日時: 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 にすることはできません。 -------------------------------------------------------------------------------- が発生します。どうしてでしょうか? | ||||||||||||||||
|
投稿日時: 2003-12-19 13:54
こんにちは。
多分型が見つからないのでしょう。 #Type.GetType("***")が失敗しているからCreateInstanceの引数がNothingだとしかられる。 まず確認すべきはType.GetTypeに渡した文字列がどうなっているかです。 先ほどの例では"A1"と書いてしまいましたがそのクラスはある名前空間に属しているはずです。 VS.NETを使用しているようなのでクラスビューでタイプを取得したい型を探してみてください。 たとえば"MyApp.A1"のような名前です。 これを渡して実行してみてください。 なおType.GetTypeで型を取得できるのは実行中のアセンブリとmscorlibだけです。 その点を注意してください。 #詳しくはType.GetTypeのヘルプを見てください。 | ||||||||||||||||
|
投稿日時: 2003-12-19 14:27
クラスの名前空間を入れたら、解決しました!!! Foxさん、Jittaさん、本当にありがとうございました。 |