访问类模块中的私有字段

时间:2014-10-31 14:55:08

标签: excel vba excel-vba

我有这个简化的类模块clXXX ....

':: backing field
Private fTemplateBk As Excel.Workbook

':::::::::::::::::::::::::::
'::
':: constructor
Private Sub Class_Initialize()

End Sub

':::::::::::::::::::::::::::
'::
':: properties
Property Get TemplateBk() 'As Excel.Workbook '<< different error messages depending on if "As Excel.Workbook" is included or not
    TemplateBk = fTemplateBk
End Property

':::::::::::::::::::::::::::
'::
':: methods
Public Sub openTemplate()
    Set fTemplateBk = Excel.Workbooks.Open("\\xxx\yyy\zzz.xlsx")
End Sub

Public Sub someMethod()
    Me.TemplateBk.Sheets(1).Activate
End Sub

正常模块:

Sub control()

Dim x As clXXX
Set x = New clXXX
x.openTemplate
x.someMethod  '<<<<<<errors here

End Sub

我希望仅使用fTemplateBk等代码通过只读属性TemplateBk访问私有字段me.TemplateBk. ...。如何修改以上内容以便可以实现?

2 个答案:

答案 0 :(得分:1)

你的someMethod应该使用私有字段fTemplateBk,因为它是从外部私有的,而不是从内部私有。

Public Sub someMethod()
    Me.fTemplateBk.Sheets(1).Activate
End Sub

如果您需要从外部使用该属性,请在正常模块中使用:

Sub control()
    Dim x As clXXX
    Set x = New clXXX
    x.openTemplate
    x.TemplateBk.Sheets(1).Activate
End Sub

更新1

如果你想保持你的代码不变,只需在你的TemplateBk getter中添加SET,代码就可以了。正如您在图片中看到的,我使用相同的代码进行此更改并且它可以正常工作。

Property Get TemplateBk() 'As Excel.Workbook
    Set TemplateBk = fTemplateBk  'add the SET at the beggining
End Property

enter image description here

答案 1 :(得分:1)

您需要公开该属性,并且必须使用Set关键字。

检查以下代码并确认其是否有效:

Private fTemplateBk As Excel.Workbook

Public Property Get TemplateBk() As Excel.Workbook 
    Set TemplateBk = fTemplateBk
End Property