プロが教えるわが家の防犯対策術!

はじめまして。

最近、クラスモジュールを使い始めたのですが、
別のクラスに、プロパティを使わずに、
データを受け渡すには、どうすればいいのでしょうか?

たとえば、次の2つのクラスがあったとします。
(両方ともString型の読み取り専用のプロパティがある)

'クラスA
Private m_Str_A as string
Public Property Get Str_A() as String
Str_A = m_Str_A
End Property

'クラスB
Private m_Str_B as string
Public Property Get Str_B() as String
Str_B = m_Str_B
End Property

ここで、クラスAで使用したm_Str_Aのデータを
クラスBのm_Str_Bへ渡したいのですが、、、、。
別のプロパティを作ればいいだろうと考えたのですが、
それでは、値の変更が可能になってしまいます。

使用環境は、Excel2000 VBA、Windows2000です。
いろいろ調べてみたところ、他の言語か、VB.NETでない
と無理そうなことが書かれていました。
仕事場では、他の言語は使用できないので、困ってます。
何か良い方法がありましたら、よろしくおねがいします。

A 回答 (4件)

こんばんは。

Wendy02です。

>実は,クラスAの下にクラスBを置きたいと考えてます。

それは、サブクラスかな?サブクラスは、VBAではないと思いますね。というか、あまりそういうケースにめぐり合いませんね。

>クラスBのプロパティの値の変更を不可にしたいのです。

発想を変えたほうがよいのではありませんか?具体的に、どういうものに使うか分れば、まったく話が変わるかもしれませんが。

Excelの中には、読み取り専用のプロパティに近いものがありますね。例えば、Now関数が、似ています。Dateは、値の代入が入れられるのに、Nowは、出来ません。あたりまえのようでいて、へんです。では、Now関数もDate関数も、値を入れていないか、というかというと、そうではありません。両方とも既に入っていて、そのような違いが起こります。

では、クラスでそれができるかというと、それはVBAでは無理ですね。VBAのクラスは、あくまでも、インスタンスを作るための雛型のようなもので、出口だけあって、入り口のないものは、定数以外は、空のままです。

VBAで、一旦、代入された値を変更されないようにするためには、クラスでは扱いません。代入値を、一度入れたきりにするには(Excelの起動から終了までの期間の間)、やはり、変数で、新たな代入を阻止するように、一般プロシージャやユーザー定義関数で作るしかないかと思うのです。
    • good
    • 0
この回答へのお礼

やはりVBAでは,不可能そうですね。
それがわかっただけでも,とても助かりました。
ご提案とおり,発想を変えてやってみます。

これまで親切に答えていただき,本当にありがとうございました。
また何かありましたら,よろしくお願いします。

お礼日時:2005/11/02 13:12

>>クラスAの値で、クラスBをNewするしかないような


>上記はどのように,コードを記述するのでしょうか。
クラスの中に
Private Sub Class_Initialize()
m_Str_B = "const"
End Sub
のようにすることで、Newされる時上記の関数が呼び出されるので、初期化することができます。
つまり、この時、Str_A()でGetしてくればいいですね。
まあ、この時、呼び出すクラスAのオブジェクト(値)が決まってないとかだったら無意味ですがね。
でも、要は、リードオンリーにしたいだけなら#1でも書きましたが
1度だけ外から値を設定できるようにすればいいと思います。
Public Property Let constData(iniStr As String)
If m_Str_B = "" Then
m_Str_B = iniStr
End If
End Property
    • good
    • 0
この回答へのお礼

すません、お礼がおくれました。
1度だけ設定可能にする方法でいけそうです。
たびたび、回答いただき、ありがとうございました。
またなにかありましたら、よろしくお願いします。

お礼日時:2005/11/04 07:01

こんにちは。



>値の変更が可能になってしまいます。

カプセル化をしようとしているのでしょうか?それなら、同じクラスにするしかないと思いますがどうでしょう。クラスAとクラスBの間の値の橋渡しは、クラス間だけというわけにはいかないと思います。わざわざ、Private キーワードをつけて、変数をモジュールレベルにしている意味がなくなってしまいますね。

>Private m_Str_A as string
>Public Property Get Str_A() as String
>Str_A = m_Str_A
>End Property

それと、もう1つは、Property Let ステートメントがなくて、Private m_Str_A は、どうやって代入するわけですか?

変数のそのものは、Private キーワードで、内包してあるので、その値自体の変更は不可能だと思います。

この回答への補足

回答していただき,ありとうございます。

>カプセル化をしようとしているのでしょうか?
>変数のそのものは、Private キーワードで、内包してあるので、その値自体の変更は不可能だと思います

実は,クラスAの下にクラスBを置きたいと考えてます。
その際,変数ではなく,クラスBのプロパティの値の変更を
不可にしたいのです。

>それと、もう1つは、Property Let ステートメントがなくて、Private m_Str_A は、どうやって代入するわけですか?

すいません。
プロパティStr_Aは読み取り専用ではありませんでした。
ご指摘とおり,Letが抜けておりました。

上記を含め,私の説明不足でしたので,
クラスAのソースを補足します。

'クラスA
Private m_Str_A as string
Public Property Get Str_A() as String
Str_A = m_Str_A
End Property

public Property Let Str_A(byVal NewString as String)
m_Str_A = NewString '←m_Str_Aを代入
End Property

Public Propety Get ClassB() as ClassB '下位にクラスBを作る
Dim myClassB as New ClassB 
Set ClassB = myClassB '←★
End Sub

クラスAのプロパティStr_Aの値を,
クラスBのプロパティStr_Bへ渡すには,
通常なら,Letステートメントを作って,
★の後に代入すればいいのですが,

このプロパティStr_Bを
読み取り専用にしたいので,
(つまり,Let,Set,代入用変数のPublic宣言が使用できない)
質問した次第です。

やはり,同じクラスにするしかないのでしょうか。

補足日時:2005/11/01 14:27
    • good
    • 0

読み出し専用なんだから、


クラスAの値で、クラスBをNewするしかないような
それか、Letを使って値が""の時だけ設定できるようにするとか
(一度だけ設定できる)
勘違いコメントだったらすみません。

この回答への補足

回答いただき,ありがとうございます。

>クラスAの値で、クラスBをNewするしかないような
重ねて質問してすいませんが,上記はどのように,
コードを記述するのでしょうか。
お手数かけますが,よろしくお願いします。

補足日時:2005/11/01 14:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!