

Excel2002Sp3を使用しています。
(WindowsはXpSp3です)
ユーザー定義型の各メンバーに対して、property get/let/set
を使用してデーターの受け渡しを行いたいのですが、うまくいきません。
以下に作成したプログラムを載せてみます。
main1()とmain2()がありますが、
main2()だとうまくいきます。
しかし、メンバー個別のやりとりにはなっていません。
main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。
property get/let/setの書き方でできるようになるのでしょうか。
それとも、メンバー個別でのやり取りは仕様上できないのでしょうか。
もしできるのであれば、サンプルコードを教えていただけると助かります。
よろしくお願いします。
-------------------
Class1
-------------------
Option Explicit
Private m_xx As X
Public Property Get xx() As X
xx = m_xx
End Property
Public Property Let xx(p As X)
m_xx = p
End Property
-------------------
Module1
-------------------
Option Explicit
Type X
a As Long
b As Long
End Type
Sub main1()
'個別にやり取り
Dim cc As New Class1
Dim p As Long
Dim q As Long
cc.xx.a = 5
cc.xx.b = 2
p = cc.xx.a
q = cc.xx.b
MsgBox p & "," & q
End Sub
Sub main2()
'yyを用意してまとめてやり取り
Dim cc As New Class1
Dim p As Long
Dim q As Long
Dim yy As X
yy.a = 5
yy.b = 2
cc.xx = yy
p = cc.xx.a
q = cc.xx.b
MsgBox p & "," & q
End Sub
----------------------------------------
No.3ベストアンサー
- 回答日時:
#1 Wizard_Zeroです。
> これはVS2005等でもできないのでしょうか。
できません。そのようなコードを書いた時点でエラーが提示され、コンパイルできなくなります。
> Type XX・・・
> ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。
そうなりますね。
(クラス定義部分だけActiveX DLL化するという手もありますが・・・)
> 仮にそうした時、property get等の書き方はどのようになるでしょうか。
PropertyのLetとSetの違いは、扱う型が値型か参照型かです。クラスのような参照型を扱う際には、LetではなくSetを使います。
[ Class1 ]
Option Explicit
Private m_xx As New X '←クラスなのでNewでインスタンスを作成しておく
Public Property Get xx() As X
Set xx = m_xx '←戻り値の設定もSetで
End Property
Public Property Set xx(p As X)
Set m_xx = p '←ここも
End Property
No.2
- 回答日時:
class1のモジュールを個々のメンバでもlet,getできるようにしては?
[class1]
Option Explicit
Private m_xx As X
Public Property Get xx() As X
xx = m_xx
End Property
Public Property Let xx(p As X)
m_xx = p
End Property
Public Property Get a() As Long
a = m_xx.a
End Property
Public Property Let a(p As Long)
m_xx.a = p
End Property
Public Property Get b() As Long
b = m_xx.b
End Property
Public Property Let b(p As Long)
m_xx.b = p
End Property
[module1]
Option Explicit
Type X
a As Long
b As Long
End Type
Sub main1()
'個別にやり取り
Dim cc As New Class1
Dim p As Long
Dim q As Long
cc.a = 5
cc.b = 2
p = cc.a
q = cc.b
MsgBox p & "," & q
End Sub
Sub main2()
'yyを用意してまとめてやり取り
Dim cc As New Class1
Dim p As Long
Dim q As Long
Dim yy As X
yy.a = 5
yy.b = 2
cc.xx = yy
p = cc.xx.a
q = cc.xx.b
MsgBox p & "," & q
End Sub
個々のメンバーに対してget/letを定義するということですね。
それも考えたのですが、メンバー変数が多い時のことを考えると・・・
何か、まとめてget/letが定義できないものかと考えていました。
ありがとうございました。
No.1
- 回答日時:
> それとも、メンバー個別でのやり取りは仕様上できないのでしょうか。
この場合は「仕様上できない」となります。
構造体をプロパティの型に利用する場合、取得する構造体の内部は暗黙的に読み取り専用と同義になります。
Sub main1()内で実行している
cc.xx.a = 5
を例に説明しますと・・・
cc.xx
の時点で、ccのxxプロパティ(Property Get)が実行されます。
Property Getの中身は
xx = m_xx
となっており、クラス内部のm_xxを戻り値として渡しているように見えますが、実際には値のみが渡されていて構造体の本体(つまりm_xx自体)が返されているわけではありません。つまり、
cc.xx
はm_xxの値をコピーしただけの「別物」ということになります。そこに値を設定してもm_xxには反映されません。
main2のほうが正しく動作するのは
cc.xx = yy
で、Property Setが呼び出されており、その中身は
m_xx = p
です。pには設定値が入りますから実質的には
m_xx = yy
となり、m_xxへyyの値をコピーしていることになります。
独自のデータ型の内部をプロパティの型として使い、さらにその内部も個別に変更できるようにするには、構造体ではなくクラスを使います。
この回答への補足
>この場合は「仕様上できない」となります。
やっぱりそうなのですか・・・
詳細な説明ありがとうございます。
これはVS2005等でもできないのでしょうか。
>独自のデータ型の内部をプロパティの型として使い、さらにその内部も個別に変更できるようにするには、構造体ではなくクラスを使います。
Type XX・・・
ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。
仮にそうした時、property get等の書き方はどのようになるでしょうか。
追加質問が多くてすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Array関数について教えてく...
-
vbsでのwebフォームへの入力制限?
-
エクセルのマクロについて教え...
-
【ExcelVBA】5万行以上のデー...
-
VBA 入力箇所指定方法
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
【マクロ】開いているブックの...
-
Vba セルの4辺について罫線が有...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
エクセルの改行について
-
エクセルのVBAコードと数式につ...
-
算術演算子「¥」の意味について
-
vbaにてseleniumを使用したedge...
-
vb.net(vs2022)のtextboxのデザ...
-
【マクロ】モジュール変数の記...
-
Excelのマクロについて教えてく...
-
VBAでFOR NEXT分を Application...
-
Vba FileSystemObject オブジェ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体のメンバをfor文で回したい
-
batファイルでtelnetを起動⇒文...
-
mailto:の本文に文字数制限はあ...
-
動的にプロパティ名を変えたい
-
mailto:の中に&を入れる
-
エラーログの意味
-
「HSP」で左クリック判定がうま...
-
R8Cマイコンの乗算
-
IplImageをHSの閾値から2値...
-
ACCESS97のモジュールにSPL...
-
アクセスを拒否の仕方について
-
EXCEL VBA でユーザー定義型デ...
-
またまたわかりません><;
-
メールの送信者名を自動でサイ...
-
時間の平均値を計算する方法を...
-
mailtoで宛先を日本語で指定す...
-
UWSCで出目画像カウントしたい
-
Bresenhamのアルゴリズムを用い...
-
PythonでのSQL文の書き方を教え...
-
Wi-Fiが繋がらなくなりました N...
おすすめ情報