- - PR -
VBAのクラスの参照渡しについて
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-03-17 21:44
VBA初心者なのですが、クラスからクラスのメソッドを実行する際に引数としてクラスを参照渡しにすることは出来ませんか?
以下にサンプルとしてエクセルで実行したソースを記載します。 エクセル上のボタンを押下した際にクラスBの「C.Execute (value)」 で実行時エラー(オブジェクトは、このプロパティまたはメソッドを サポートしていません。(Error 438))が発生します。 エクセルオブジェクトのコード Private Sub btn_Click() Set A = New B Set B = New B A.SetID ("お願い") A.SetName ("助けて") B.Execute (A) End Sub クラスAのコード Private Serif1 As String Private Serif2 As String Public Function GetSerif1() GetSerif1 = Serif1 End Function Public Function GetSerif2() GetSerif2 = Serif2 End Function Public Sub SetSerif1(ByVal value As String) Serif1 = value End Sub Public Sub SetSerif2(ByVal value As String) Serif2= value End Sub クラスBのコード Public Sub Execute(ByRef value As A) MsgBox value.GetSerif1 MsgBox value.GetSerif2 Set C = New C C.Execute (value) End Sub クラスCのコード Public Sub Execute(ByRef value As A) MsgBox value.GetSerif1 MsgBox value.GetSerif2 End Sub 初めての書き込みで、ここで本来書くべきことで無いなどの ご指摘あればそちらも宜しくお願い致します。 [ メッセージ編集済み 編集者: 未記入 編集日時 2009-03-17 21:45 ] | ||||||||||||||||
|
投稿日時: 2009-03-17 22:01
今回の問題に参照渡しは関係ないと思います。
C が Execute メソッドをサポートしていない、と言われているのだから。 > Set C = New C > C.Execute (value) ここでいう「C」はクラス名の C なのか C を New したインスタンスなのか はっきりさせる為に別名を付けるべきではないでしょうか。 > Set A = New B > Set B = New B こういうのも。 | ||||||||||||||||
|
投稿日時: 2009-03-17 22:42
返答有難うございます。
>今回の問題に参照渡しは関係ないと思います。 申し訳ありません、質問の意図が全く伝わらない記述になっていました。 値渡しでも同様のエラーが出ることは確認していました。 >ここでいう「C」はクラス名の C なのか C を New したインスタンスなのか はっきりさせる為に別名を付けるべきではないでしょうか。 ご指摘有難うございます。 ここに投稿するために書いたコードで通常はフレームワーク推奨や独自に 作成した命名規則などに則った記載をしています。 また今回の投稿は「C が Execute メソッドをサポートしていない」の 本質的な意味(なぜこんなエラーが出るのか)が理解できないでいるので 質問した次第です。 VBAがオブジェクト指向言語じゃないことは承知しているのですが、 周りの人間のスキルセットを考慮して、自分以外の人間がソースコードを 参照した際に、判りやすいよう極力デザインパターンに準拠した設計に したいので少し色々とテストをしている際に上記エラーが出ている状態です。 [ メッセージ編集済み 編集者: へたれ 編集日時 2009-03-17 22:45 ] | ||||||||||||||||
|
投稿日時: 2009-03-17 23:27
> ここに投稿するために書いたコードで通常はフレームワーク推奨や独自に
> 作成した命名規則などに則った記載をしています。 その通りに書いて貰う事は出来ませんか? 実際もクラス名と変数名が同じだと誤解してしまいますので。 今回の様に。 > また今回の投稿は「C が Execute メソッドをサポートしていない」の 本質的な意味(なぜこんなエラーが出るのか)が理解できないでいるので 質問した次第です。 本質的な意味、というか その箇所の C に Execute が無い、の一言に尽きると思いますが。 > Set C = New C この左の C と右の C は別物なのはわかりますよね? > C.Execute (value) この C は上記の左か右、どちらの C だと認識してらっしゃいますか? あ、実際は違う変数名なんでしたね・・・。 まあエラーメッセージは嘘を言ってないだろうから C クラスの Execute メソッドが正常に実行できるミニマムコードを作成して そこから糸口を掴むしかないんじゃないでしょうか。 | ||||||||||||||||
|
投稿日時: 2009-03-17 23:57
それはすでに説明されているかと思いますが...
この程度のレベルであれば、VBA は十分にオブジェクト指向のレベルに達していると思いますが... VBA のせいでエラーになっているわけではありません。
それにしても King さんが指摘された箇所以外にもおかしいところがあります。 たとえば VBA の場合、
上記のように引数を括弧内で括ると演算結果が渡されます。 引数を括弧で括るには "Call" を頭につけるべきです。上記は参考スレッドです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2009-03-18 00:36
>Kingさん、じゃんぬねっとさん
全くVBわからない人間の低レベルの質問に色々とレス有難うございました。 判る人間が来たので自分で解決するのは諦めました。 ちょっとこの後ここ覗いてる時間が無いのでレス出来ませんが、 時間出来たらVBの勉強したいと思います。 色々とご足労お掛けしました。 |
1