Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13118 / 13646 ツリー ←次へ | 前へ→

【6912】クラスモジュール内でのvariant型配列変数の使い方について ★珍念★ 03/8/11(月) 14:10 質問
【6913】Re:クラスモジュール内でのvariant型配列変数の使い... ichinose 03/8/11(月) 15:04 回答
【6914】Re:クラスモジュール内でのvariant型配列変数の使い... ichinose 03/8/11(月) 15:32 発言
【6915】Re:クラスモジュール内でのvariant型配列変数の使い... ★珍念★ 03/8/11(月) 16:01 発言
【6950】Re:クラスモジュール内でのvariant型配列変数の使い... ★珍念★ 03/8/13(水) 21:11 お礼

【6912】クラスモジュール内でのvariant型配列変数の使い...
質問  ★珍念★ E-MAIL  - 03/8/11(月) 14:10 -

引用なし
パスワード
   皆様、初めまして。珍念と申します。

タイトルにもありますが、クラスモジュール内でのvariant型配列変数の使い方について、分からない点があります。以下に書き出します。

--------------------------------------------------------------------------

・クラスモジュール内で配列変数(variant型)を使用するには、Private Type内で記述する必要がある?
⇒現在は他に使い方が分からない為、この方法を用いて記述しています。

以下コーディング
 ↓↓↓↓

Private Type テーブル

  サブ名 As String
  データ() As Variant   ←問題となっている配列変数
  開始行 As Integer
  終了行 As Integer
  開始列 As Integer
  終了列 As Integer
  行数 As Integer
  列数 As Integer
  
End Type

--------------------------------------------------------------------------

・この配列変数(variant型)を使用して、EXCELシートにあるデータを格納するメソッドを作成します。
⇒ここから先、このメソッドで作成した配列変数(variant型)を使いまわす事がうまくいきません。以下に問題事項をあげます。

--------------------------------------------------------------------------

【問題1】
この配列変数をプロパティとして扱いたいが、このプロパティ内で再度ユーザ定義型変数を宣言する必要があり、宣言すると配列変数(variant)の値がクリアされてしまう。
以下コーディングです。

Public Property Get テーブルデータ()
  Dim tbl As テーブル     ←ここで再度ユーザ定義型宣言しないと使えない
  テーブルデータ = tbl.データ  でも宣言すると値がクリアされてしまう。
End Property            結局なにもデータが格納されない。
                  エラーは出ない。

【問題2】
そこで、クラスモジュール内で使いまわせる方法があればと思い、Private TypeをPublic Typeに変更して記述してみましたが、「オブジェクトモジュール内ではパブリックユーザー定義型は定義できません」のエラーがでてしまう為、これもうまくいきません。

---------------------------------------------------------------------------

どなたか、【問題1】【問題2】どちらでも良いので分かる方はご教授願います。

【6913】Re:クラスモジュール内でのvariant型配列変数の使...
回答  ichinose  - 03/8/11(月) 15:04 -

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

【6914】Re:クラスモジュール内でのvariant型配列変数の使...
発言  ichinose  - 03/8/11(月) 15:32 -

引用なし
パスワード
   ▼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
  カプセルデータ.myarray() = dat
>End Property
'↑Property Let もこれだけでOKでした

>
>標準モジュールに
>'=======================================================
>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と順番に表示されました。

【6915】Re:クラスモジュール内でのvariant型配列変数の使...
発言  ★珍念★ E-MAIL  - 03/8/11(月) 16:01 -

引用なし
パスワード
   ▼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と順番に表示されました。

即レスありがとう御座います。
これから試して見ます。

【6950】Re:クラスモジュール内でのvariant型配列変数の使...
お礼  ★珍念★ E-MAIL  - 03/8/13(水) 21:11 -

引用なし
パスワード
   ▼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と順番に表示されました。

遅くなりまして申し訳ありませんでした。
ご指摘の通り、プロシージャ外にて宣言したところ、うまくできました。
ありがとう御座いました。

13118 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free