はじめまして。
最近、クラスモジュールを使い始めたのですが、
別のクラスに、プロパティを使わずに、
データを受け渡すには、どうすればいいのでしょうか?
たとえば、次の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でない
と無理そうなことが書かれていました。
仕事場では、他の言語は使用できないので、困ってます。
何か良い方法がありましたら、よろしくおねがいします。
No.3ベストアンサー
- 回答日時:
こんばんは。
Wendy02です。>実は,クラスAの下にクラスBを置きたいと考えてます。
それは、サブクラスかな?サブクラスは、VBAではないと思いますね。というか、あまりそういうケースにめぐり合いませんね。
>クラスBのプロパティの値の変更を不可にしたいのです。
発想を変えたほうがよいのではありませんか?具体的に、どういうものに使うか分れば、まったく話が変わるかもしれませんが。
Excelの中には、読み取り専用のプロパティに近いものがありますね。例えば、Now関数が、似ています。Dateは、値の代入が入れられるのに、Nowは、出来ません。あたりまえのようでいて、へんです。では、Now関数もDate関数も、値を入れていないか、というかというと、そうではありません。両方とも既に入っていて、そのような違いが起こります。
では、クラスでそれができるかというと、それはVBAでは無理ですね。VBAのクラスは、あくまでも、インスタンスを作るための雛型のようなもので、出口だけあって、入り口のないものは、定数以外は、空のままです。
VBAで、一旦、代入された値を変更されないようにするためには、クラスでは扱いません。代入値を、一度入れたきりにするには(Excelの起動から終了までの期間の間)、やはり、変数で、新たな代入を阻止するように、一般プロシージャやユーザー定義関数で作るしかないかと思うのです。
やはりVBAでは,不可能そうですね。
それがわかっただけでも,とても助かりました。
ご提案とおり,発想を変えてやってみます。
これまで親切に答えていただき,本当にありがとうございました。
また何かありましたら,よろしくお願いします。
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
すません、お礼がおくれました。
1度だけ設定可能にする方法でいけそうです。
たびたび、回答いただき、ありがとうございました。
またなにかありましたら、よろしくお願いします。
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 キーワードで、内包してあるので、その値自体の変更は不可能だと思います。
この回答への補足
回答していただき,ありとうございます。
>カプセル化をしようとしているのでしょうか?
>変数のそのものは、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宣言が使用できない)
質問した次第です。
やはり,同じクラスにするしかないのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) エラー処理 3 2022/04/11 14:58
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java eclipse 型に解決できません
-
グローバルIPとプライベートIP...
-
言語[C#、Java]..クラスの扱い...
-
同一パッケージにあるクラスが...
-
1 つのヘッダファイルに複数の...
-
SQLです教えてくださいお願いし...
-
packageとimport の違いって?
-
オブジェクト指向プログラミン...
-
Sub-LVDS規格とは
-
自作のクラスファイルがインポ...
-
VB.NETでCreateProcess
-
UMLのクラス図はmain()も含むん...
-
標準モジュールとクラスモジュ...
-
IPアドレスのクラスAを取得して...
-
クラスのプロパティに構造体を...
-
配列の重複する値とその個数を...
-
main()を持つクラスが2つ以上...
-
SWING で Button? JButton?
-
プライベートIPの数
-
"secret" "classified" "confid...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
河合塾のクラス分けについて
-
同じクラスにならない確率を教...
-
3年間同じクラスになる確率
-
「天声人語」をインターネット...
-
グローバルIPとプライベートIP...
-
配列の重複する値とその個数を...
-
java eclipse 型に解決できません
-
同一パッケージにあるクラスが...
-
私はクラスLINEにまだ入れてな...
-
老い先短い ジジィ が ふと 思う...
-
自作のクラスファイルがインポ...
-
どこからも呼ばれていない無意...
-
main()を持つクラスが2つ以上...
-
数学の計算問題。 3年間同じク...
-
クラス見てから 女の子5人 ネタ...
-
javaのコンパイルができません...
-
1 つのヘッダファイルに複数の...
-
重複エラーを解決するには
-
IPアドレスの3バイト目の呼び方
-
packageとimport の違いって?
おすすめ情報