我有这个简化的类模块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. ...
。如何修改以上内容以便可以实现?
答案 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
答案 1 :(得分:1)
您需要公开该属性,并且必须使用Set关键字。
检查以下代码并确认其是否有效:
Private fTemplateBk As Excel.Workbook
Public Property Get TemplateBk() As Excel.Workbook
Set TemplateBk = fTemplateBk
End Property