2014-10-31 64 views
0

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

缺少'Set'你的财产得到.... – 2014-10-31 15:05:01

+0

另外,为什么在类中使用属​​性?您已经有权访问成员字段。 – citizenkong 2014-10-31 15:05:38

+1

@citizenkong - 这是一个很好的做法,使用财产vs支持领域。例如见http://stackoverflow.com/questions/271318/should-you-access-a-variable-within-the-same-class-via-a-property – 2014-10-31 16:01:19

回答

1

你需要作出规定:财产公开,并且必须使用Set关键字。

检查下面的代码并确认它的工作原理:

Private fTemplateBk As Excel.Workbook 

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

如何添加一个Let/Set过程以使用此Getter运行? – whytheq 2014-10-31 16:41:45

+1

检查此URL:http://stackoverflow.com/questions/5092662/set-property-of-vba-class-with-object-reference – 2014-11-01 06:02:20

+0

感谢您的链接。昨天晚上我通过这本书做了一些研究,现在感觉更有信心:http://www.amazon.com/Rob-Bovey-Professional-Excel-Development/dp/B00JHX5GVE – whytheq 2014-11-01 08:10:53

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

+0

正如问题所述 - 我想通过属性TemplateBk访问'fTemplateBk' _even当inside_时 - 这是很好的做法。我相信一般的“OO”经验法则是在构建时只能访问专用的后台字段。 – whytheq 2014-10-31 16:33:52

+0

正如其他人所说,你错过了Set TemplateBk = fTemplateBk,之后它将工作。我已经测试过,没有错误。 – 2014-10-31 17:02:35

+0

谢谢米格尔。您的代码不会出错,但您应该在'someMethod'中使用'Me.TemplateBk.Sheets(1).Activate',以便该类遵循最佳实践。 – whytheq 2014-10-31 17:07:02