访问类模块中的私有字段

我有这个简化的类模块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 

我只想通过只读属性TemplateBk使用代码(如me.TemplateBk. ...访问专用字段me.TemplateBk. ... me.TemplateBk. ... 我如何修改上述所以这是可能的?

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

检查下面的代码,并确认它是否工作:

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

你的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 

在这里输入图像说明