• ベストアンサー

VBAクラスで、プロパティを使わずに、データを受け渡すには?

はじめまして。 最近、クラスモジュールを使い始めたのですが、 別のクラスに、プロパティを使わずに、 データを受け渡すには、どうすればいいのでしょうか? たとえば、次の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でない と無理そうなことが書かれていました。 仕事場では、他の言語は使用できないので、困ってます。 何か良い方法がありましたら、よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。Wendy02です。 >実は,クラスAの下にクラスBを置きたいと考えてます。 それは、サブクラスかな?サブクラスは、VBAではないと思いますね。というか、あまりそういうケースにめぐり合いませんね。 >クラスBのプロパティの値の変更を不可にしたいのです。 発想を変えたほうがよいのではありませんか?具体的に、どういうものに使うか分れば、まったく話が変わるかもしれませんが。 Excelの中には、読み取り専用のプロパティに近いものがありますね。例えば、Now関数が、似ています。Dateは、値の代入が入れられるのに、Nowは、出来ません。あたりまえのようでいて、へんです。では、Now関数もDate関数も、値を入れていないか、というかというと、そうではありません。両方とも既に入っていて、そのような違いが起こります。 では、クラスでそれができるかというと、それはVBAでは無理ですね。VBAのクラスは、あくまでも、インスタンスを作るための雛型のようなもので、出口だけあって、入り口のないものは、定数以外は、空のままです。 VBAで、一旦、代入された値を変更されないようにするためには、クラスでは扱いません。代入値を、一度入れたきりにするには(Excelの起動から終了までの期間の間)、やはり、変数で、新たな代入を阻止するように、一般プロシージャやユーザー定義関数で作るしかないかと思うのです。

Tell_Mimy
質問者

お礼

やはりVBAでは,不可能そうですね。 それがわかっただけでも,とても助かりました。 ご提案とおり,発想を変えてやってみます。 これまで親切に答えていただき,本当にありがとうございました。 また何かありましたら,よろしくお願いします。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>>クラス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

Tell_Mimy
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >値の変更が可能になってしまいます。 カプセル化をしようとしているのでしょうか?それなら、同じクラスにするしかないと思いますがどうでしょう。クラス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 キーワードで、内包してあるので、その値自体の変更は不可能だと思います。

Tell_Mimy
質問者

補足

回答していただき,ありとうございます。 >カプセル化をしようとしているのでしょうか? >変数のそのものは、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宣言が使用できない) 質問した次第です。 やはり,同じクラスにするしかないのでしょうか。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

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

Tell_Mimy
質問者

補足

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