- PR -

VBAのクラスの参照渡しについて

1
投稿者投稿内容
へたれ
会議室デビュー日: 2009/03/17
投稿数: 3
投稿日時: 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 ]
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 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
投稿数: 3
投稿日時: 2009-03-17 22:42
返答有難うございます。

>今回の問題に参照渡しは関係ないと思います。

申し訳ありません、質問の意図が全く伝わらない記述になっていました。
値渡しでも同様のエラーが出ることは確認していました。

>ここでいう「C」はクラス名の C なのか C を New したインスタンスなのか
 はっきりさせる為に別名を付けるべきではないでしょうか。

ご指摘有難うございます。
ここに投稿するために書いたコードで通常はフレームワーク推奨や独自に
作成した命名規則などに則った記載をしています。

また今回の投稿は「C が Execute メソッドをサポートしていない」の
本質的な意味(なぜこんなエラーが出るのか)が理解できないでいるので
質問した次第です。

VBAがオブジェクト指向言語じゃないことは承知しているのですが、
周りの人間のスキルセットを考慮して、自分以外の人間がソースコードを
参照した際に、判りやすいよう極力デザインパターンに準拠した設計に
したいので少し色々とテストをしている際に上記エラーが出ている状態です。

[ メッセージ編集済み 編集者: へたれ 編集日時 2009-03-17 22:45 ]
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-03-17 23:27
> ここに投稿するために書いたコードで通常はフレームワーク推奨や独自に
> 作成した命名規則などに則った記載をしています。

その通りに書いて貰う事は出来ませんか?
実際もクラス名と変数名が同じだと誤解してしまいますので。
今回の様に。

> また今回の投稿は「C が Execute メソッドをサポートしていない」の
本質的な意味(なぜこんなエラーが出るのか)が理解できないでいるので
質問した次第です。

本質的な意味、というか
その箇所の C に Execute が無い、の一言に尽きると思いますが。

> Set C = New C
この左の C と右の C は別物なのはわかりますよね?

> C.Execute (value)
この C は上記の左か右、どちらの C だと認識してらっしゃいますか?

あ、実際は違う変数名なんでしたね・・・。

まあエラーメッセージは嘘を言ってないだろうから
C クラスの Execute メソッドが正常に実行できるミニマムコードを作成して
そこから糸口を掴むしかないんじゃないでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-03-17 23:57
引用:

へたれさんの書き込み (2009-03-17 22:42) より:

また今回の投稿は「C が Execute メソッドをサポートしていない」の
本質的な意味(なぜこんなエラーが出るのか)が理解できないでいるので
質問した次第です。


それはすでに説明されているかと思いますが...

引用:

VBAがオブジェクト指向言語じゃないことは承知しているのですが、


この程度のレベルであれば、VBA は十分にオブジェクト指向のレベルに達していると思いますが... VBA のせいでエラーになっているわけではありません。

引用:

周りの人間のスキルセットを考慮して、自分以外の人間がソースコードを
参照した際に、判りやすいよう極力デザインパターンに準拠した設計に
したいので少し色々とテストをしている際に上記エラーが出ている状態です。


それにしても King さんが指摘された箇所以外にもおかしいところがあります。 たとえば VBA の場合、

コード:

    A.SetID ("お願い") 
    A.SetName ("助けて") 
    B.Execute (A) 
    C.Execute (value)


上記のように引数を括弧内で括ると演算結果が渡されます。 引数を括弧で括るには "Call" を頭につけるべきです。上記は参考スレッドです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
へたれ
会議室デビュー日: 2009/03/17
投稿数: 3
投稿日時: 2009-03-18 00:36
>Kingさん、じゃんぬねっとさん
全くVBわからない人間の低レベルの質問に色々とレス有難うございました。
判る人間が来たので自分で解決するのは諦めました。

ちょっとこの後ここ覗いてる時間が無いのでレス出来ませんが、
時間出来たらVBの勉強したいと思います。

色々とご足労お掛けしました。
1

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