[[20200707103823]] 『クラスモジュールの配列変数からGetプロパティで秩x(やまと) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『クラスモジュールの配列変数から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


できました!
ありがとうございます。
(やまと) 2020/07/07(火) 11:45

コード書いているうちに解決してしまいましたが、クラスの設計がまずいかなと思います。

現状の 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


アドバイスありがとうございます!
最初の考え方が違っていたのですね。
よく読んで試行して勉強したいと思います。
(やまと) 2020/07/07(火) 12:58

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.