|
▼ichinose さん:
>▼★珍念★ さん:
>>皆様、初めまして。珍念と申します。
>>
>>タイトルにもありますが、クラスモジュール内でのvariant型配列変数の使い方について、分からない点があります。以下に書き出します。
>>
>>--------------------------------------------------------------------------
>>
>>・クラスモジュール内で配列変数(variant型)を使用するには、Private Type内で記述する必要がある?
>
>中で宣言するならそうですね
>
>>⇒現在は他に使い方が分からない為、この方法を用いて記述しています。
>>
>>以下コーディング
>> ↓↓↓↓
>>
>>Private Type テーブル
>>
>> サブ名 As String
>> データ() As Variant ←問題となっている配列変数
>> 開始行 As Integer
>> 終了行 As Integer
>> 開始列 As Integer
>> 終了列 As Integer
>> 行数 As Integer
>> 列数 As Integer
>>
>>End Type
>private class_tbl as テーブル
>'のようにプロシジャーの外で宣言しないとデータが保持されませんよ
>
>
>>【問題1】
>>この配列変数をプロパティとして扱いたいが、このプロパティ内で再度ユーザ定義型変数を宣言する必要があり、宣言すると配列変数(variant)の値がクリアされてしまう。
>>以下コーディングです。
>>
>>Public Property Get テーブルデータ()
>> Dim tbl As テーブル ←ここで再度ユーザ定義型宣言しないと使えない
>' ↑削除する
> テーブルデータ = class_tbl.データ() ' でも宣言すると値がクリアされてしまう。
>>End Property 結局なにもデータが格納されない。
>> エラーは出ない。
>>
>>【問題2】
>>そこで、クラスモジュール内で使いまわせる方法があればと思い、Private TypeをPublic Typeに変更して記述してみましたが、「オブジェクトモジュール内ではパブリックユーザー定義型は定義できません」のエラーがでてしまう為、これもうまくいきません。
>public type は、クラスでは使えませんね。
>私が作ったサンプルです。
>クラスモジュール(class1)に
>'=========================================================
>Private Type テーブル
> aaa As Long
> bbb As String
> myarray() As Variant
> End Type
>Private カプセルデータ As テーブル
>'==============================================
>Property Get get_tbl() As Variant
> get_tbl = カプセルデータ.myarray
>End Property
>'====================================================
>Property Let get_tbl(dat As Variant)
> Erase カプセルデータ.myarray
> For idx = LBound(dat) To UBound(dat)
> With カプセルデータ
> ReDim Preserve .myarray(LBound(dat) To idx)
> カプセルデータ.myarray(idx) = dat(idx)
> End With
> Next idx
>End Property
>
>標準モジュールに
>'=======================================================
>Sub main()
> Dim ans
> Dim test As New Class1
> Dim sample(1 To 5)
> Dim samp
> For idx = 1 To 5
> sample(idx) = idx
> Next
> samp = sample()
> test.get_tbl = samp
> ans = test.get_tbl
> For idx = LBound(ans) To UBound(ans)
> MsgBox ans(idx)
> Next
>End Sub
>
>で、1,2,3,4,5と順番に表示されました。
遅くなりまして申し訳ありませんでした。
ご指摘の通り、プロシージャ外にて宣言したところ、うまくできました。
ありがとう御座いました。
|
|