|
▼★珍念★ さん:
>皆様、初めまして。珍念と申します。
>
>タイトルにもありますが、クラスモジュール内での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と順番に表示されました。
|
|