|
■No99810 (魔界の仮面弁士) に追記 > もしも > nd.Data = Array(1.2, 3.4) > と > nd.Data(0) = 1.2 > nd.Data(1) = 3.4 > の両方を可能にしたいのであれば、 > Data プロパティの定義をそのように書き換えるか、
上記の両方を可能にしたサンプル。 手抜き実装ですけど。
Option Explicit Private m_data As Variant Private Sub Class_Initialize() ReDim m_data(0 To 10) As Double End Sub Public Property Get Data(Optional ByVal index As Variant) As Variant If IsMissing(index) Then Data = m_data Else Data = m_data(index) End If End Property Public Property Let Data(Optional ByVal index As Variant, ByVal newValue As Variant) If IsMissing(index) Then If IsArray(newValue) Then m_data = newValue Else m_data(index) = newValue End If End Property
-----
Dim nd As clsNameData Set nd = New clsNameData
'検証のため、現在のデータ型と要素数を確認しておきます。 ' この段階では「Double()」「0」「10」と表示されます。 Debug.Print TypeName(nd.Data), LBound(nd.Data), UBound(nd.Data)
'★1:添字を指定して、メンバーを個別に代入できます。 ' この時、配列のデータ型に合わせて暗黙の型変換が発生します。 nd.Data(0) = 123.456! 'Single 型の 123.456 ではなく、Double 型の 123.456001281738 が代入される nd.Data(1) = "125D-1" 'String 型の 125D-1 ではなく、Double 型の 12.5 が代入される
Stop
'★2:添字を指定していない場合は、配列全体を一括代入できます。 ' 場合によっては、データ型やメンバー数のチェックも行った方が良いでしょう。 nd.Data = Array(1, 2, 3, , 5)
'現在はデータ型やメンバー数をノーチェックで差し替えているため、 ' 「Variant()」「0」「4」に変化してしまいました。 Debug.Print TypeName(nd.Data), LBound(nd.Data), UBound(nd.Data)
Stop
'★3:添字を指定して、メンバーを個別に代入できます。 ' 先の1と同じ処理ですが、配列のデータ型が変化したため、先ほどと異なる結果になります。 nd.Data(0) = 123.456! 'Single 型の 123.456 がそのまま代入される nd.Data(1) = "125D-1" 'String 型の 125D-1 がそのまま代入される
あくまでも「data(0 To 10) As Double」な形を維持したいのであれば、 Property Let の段階で「If IsArray(newValue) Then m_data = newValue」という 『配列全体の差替え行為』ではなく、個々の「配列の要素を差し替え」るようにします。
|