[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『クラスモジュールの配列変数からGetプロパティで値を取得したい』(やまと)
こんにちは。よろしくお願いします。
現在動的に要素数が変わるデータを集めるクラスを作ろうとしています。
Letプロパティで要素の取得はできるようになったのですが、Getプロパティの方がうまくいきません。
「同じプロパティに対するプロパティ プロシージャの定義が一致していません。
または、プロパティ プロシージャに省略可能な引数またはParamArrayが含まれているか、
Propetry Setの最後の引数が不正です。」
というエラーが出てきてしまうので、現在Property Get Subjectを使うのをやめて
Function Sbjという形で個々のSubjectの値を取得するようにしましたが、腑に落ちないと感じています。
もし可能ならProperty Getで個々のSubjectを取得したいのですが、なにか良い方法はありませんか?
アドバイスお願いします。
サンプルとしてつくったコードは以下の通りです。
クラスモジュール「Class1」
Dim s_Data() As String
Property Let Subject(ByVal Str As String) Dim Ub As Long On Error Resume Next Ub = UBound(s_Data) + 1 On Error GoTo 0 If Ub Then ReDim Preserve s_Data(Ub) s_Data(Ub) = Str Else ReDim s_Data(0) s_Data(0) = Str End If End Property
Function Sbj(i As Long) As String Sbj = s_Data(i) End Function
Function Subjects() As String() Subjects = s_Data End Function
標準モジュール「Module1」
Dim x() As Class1
Sub Sample00() Dim LastRow As Long Dim i As Long Dim j As Long ReDim x(2) For i = LBound(x) To UBound(x) Set x(i) = New Class1 LastRow = Cells(Rows.Count, i + 1).End(xlUp).Row For j = 2 To LastRow x(i).Subject = Cells(j, i + 1).Value Next j Next i End Sub
Sub Sample01() Dim z() As String z = x(0).Subjects End Sub
Sub Sample02() Dim y As String Dim i As Long i = InputBox("Sample") y = x(0).Sbj(i) End Sub
< 使用 Excel:Excel2016、使用 OS:Windows10 >
引数の型がミスマッチってことなんじゃないですかね。
レットする時が、単数のString型 ゲットする時が、配列のSting型
なので、両方とも単数のVariantにして置けば、 単数Variantは配列を持てるので、トラブらないと思います。
(半平太) 2020/07/07(火) 11:35
現状の Subject でやっていることは、要素の追加です。
これは処理ですので、プロパティではなくメソッドにすべきです。
名前は適切ではないので、AddData とか AddSubject にした方が分かり安いでしょう。
各要素の取得と設定をプロパティにします。
クラスモジュール「Class1」
Option Explicit
Dim s_Data() As String
Function AddSubject(ByVal Str As String) Dim Ub As Long On Error Resume Next Ub = UBound(s_Data) + 1 On Error GoTo 0 If Ub Then ReDim Preserve s_Data(Ub) s_Data(Ub) = Str Else ReDim s_Data(0) s_Data(0) = Str End If End Function
Public Property Get Subjects(i As Long) As String Subjects = s_Data(i) End Property
Public Property Let Subjects(i As Long, ByVal NewDate As String) s_Data(i) = NewDate End Property
標準モジュール「Module1」
Dim x() As Class1
Sub Sample00() Dim LastRow As Long Dim i As Long Dim j As Long ReDim x(2) For i = LBound(x) To UBound(x) Set x(i) = New Class1 LastRow = Cells(Rows.Count, i + 1).End(xlUp).Row For j = 2 To LastRow x(i).AddSubject Cells(j, i + 1).Value Next j Next i End Sub
Sub Sample01() Dim y As String Dim i As Long i = InputBox("何番目の要素?") y = x(0).Subjects(i) '要素の取得 Property Get Subjects MsgBox y
x(0).Subjects(i) = "書き換えました" MsgBox x(0).Subjects(i)
End Sub
(hatena) 2020/07/07(火) 12:14
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.