2

基本的なテキスト解析のニーズに合わせて、VBA で非常に単純なツリー構造を実装しようとしています。関連するコードは次のとおりです。

Private pLeaves() As CTree
Private numLeaves As Integer
Private leavesLen As Integer
Private iterate As Integer
Private pParent As CTree
Public pValue As Object

Public Sub class_initialize()
    ReDim pLeaves(10)
    leavesLen = 10
    numLeaves = 0
    Set pParent = Nothing
    iterate = 0
    Set pValue = Nothing

End Sub
Public Sub Class_terminate()
    'We'll leave it empty for now
    'if it looks like it's not working right we might change it
End Sub

Public Property Get Parent() As CTree
    Parent = pParent
End Property

Public Property Get Leaves() As CTree
    Leaves = pLeaves
End Property
Private Property Set Parent(ByRef p As CTree)
    Set pParent = p
End Property

Private Property Set value(ByRef value As Object)
    Set pValue = value
End Property


Public Sub Add_Leaf(ByRef value As Object)
    Dim n As Integer
    n = numLeaves
    If numLeaves >= leavesLen Then
       ReDim Preserve pLeaves(leavesLen + 10)
       leavesLen = leavesLen + 10
    End If
   Set pLeaves(n) = New CTree
   Set pLeaves(n).Parent = Me
   Set pLeaves(n).value = value
End Sub

Public Function DFFind_Leaf(value As Object) As CTree
    Dim i As Integer

    If pValue = value Then
        Set DFFind_Leaf = Me
        Return
    End If

    If numLeaves = 0 Then
        Set DFFind_Leaf = Nothing
        Return
    End If


    For i = 0 To numLeaves
        Set DFFind_Leaf = pLeaves(i).DFFind_Leaf(value)
        If DFFind_Leaf <> Nothing Then
            Return
        End If
    Next i

    Set DFFind_Leaf = Nothing
    Return
End Function

オブジェクトを使用して Add_Leaf 関数を呼び出そうとすると 、行にある行で VBA からメソッドまたはデータ メンバーが見つからないというエラーが発生します。

set pLeaves(n).Parent= me

その理由は何でしょうか?

編集:わかりました、これを修正する方法を見つけました。set プロパティ Parent(...) を private から public に変更すると、問題が修正されました。したがって、vbaでプライベートが正確に何をするのかはよくわかりません。誰かが変数を本質的に公開せずにこれを行う方法を説明したい場合、私は感謝します。

4

1 に答える 1

2

Private変数のスコープがクラス/モジュールのみに制限されていることを VBA インタープリターに伝えます。したがって、元のクラスの内部からのみアクセスでき、外部からはアクセスできません。Public一方、外部から変数にアクセスできます。

ただし、クラスを操作する場合は、変数を公開しないことを強くお勧めします。SET PROPERTY代わりに、およびGET PROPERTYキーワードを使用して、いわゆるプロパティを公開することをお勧めします。

つまり、代わりに

Public Amount as Double

多くの場合、次のアプローチを使用することをお勧めします。

Private mAmount as Double
Property Set Amount(amt as Double) 'Note that by default, properties are public
    If amt > 0 Then
        mAmount = amt
    Else
        mAmount = 0
    End If
End Property

Property Get Amount as Double
    Amount = mAmount
End Property

この例からわかるように、利点は、実際に追加の検証/変更を追加できるため、一貫性を確保できることです。

あなたの例では、休暇を追加してすべての設定を処理するメソッド、つまりパブリックサブを単純に提供することを検討できます。

Public Sub AddLeave(strName as String)
    Dim objLeave as New CTree
    objLeave.Init strName, Me
    mLeaves.Add objLeave, strName
End Sub

Public Sub Init(strName as String, objParent as CTree)
    Me.Name = strName
    Set Me.Parent = objParent
End Sub
于 2013-03-05T11:12:23.687 に答える