我听说过将用户定义类型(UDT)更改为常规类的建议,以克服UDT的限制,例如无法使用带有UDT的For Each。
我也听过建议将常规类改为UDT以克服Class限制,你无法传递BYREF,比如......
'Function:
Public Function RemoveArticle (ByRef strMovieTitle As String)
'Expected input is like "Terminator, The"
strMovieTitle = Left(... 'removes the article.
End Function
这适用于此次通话:
Dim strMovieTitle As String
strMovieTitle = "Terminator, The"
RemoveArticle strMovieTitle
但不是这个电话:
Dim objMovie As MovieClass
objMovie.strMovieTitle = "Terminator, The"
objMovie.strMovieGenre = "Sci-Fi"
InvertArticle objMovie.strMovieTitle
即使MovieClass定义了
strMovieTitle As String
我不能更改RemoveArticle(以及类似它的每个简单的小函数)来获取MovieClass参数而不是String参数,因为还有其他UDT或类和字符串变量也需要使用RemoveArticle。
如果我需要使用For Each并且还需要传递ByRef,我该怎么办? 有没有一种方法可以解决参数问题?
(使用Excel 2010。)
答案 0 :(得分:1)
现在我明白了你的担忧。
你根本无法采用这种方法来实现目标。正如蒂姆·威廉姆斯在你的问题中所评论的那样,你最好的选择就是这样:
Dim objMovie As MovieClass
Dim strMovieTitle As String
strMovieTitle = "Terminator, The"
objMovie.strMovieTitle = InvertArticle(strMovieTitle)
但是,我发现这仍然无法满足您的需求。
我的建议如下:
Private
,并使用Property Let
和Property Get
公开它们。通过这种方式,您可以在 set 或 get 上进行属性修改(来自类内...而不是从类外部修复)。 除了注意之外,关于创建helper class
(正如有人向您推荐的那样):您可以将所有广泛使用的功能加入到一个类中,例如{{1 }或RemoveArticle
。但是,它需要在每次要使用它们时创建一个实例对象,因此,它与我给你的建议不能很好地结合(如果你只想简化代码)。所以现在把它们放在InvertArticle
就好了。只是为了澄清:他们给你的那些建议与你的问题无关。
示例A:在Module
在您的课程set
中,首先将MovieClass
的所有实例重命名为strMovieTitle
并将其添加到您的代码中:
pStrMovieTitle
用法如下:
Private pStrMovieTitle As String
Public Property Let strMovieTitle (strIn As String)
pStrMovieTitle = InvertArticle(strIn)
End Property
Public Property Get strMovieTitle As String
strMovieTitle = pStrMovieTitle
End Property
示例B:在Dim objMovie As MovieClass
objMovie.strMovieTitle = "Terminator, The" ' the article position gets rectified on assignation
objMovie.strMovieGenre = "Sci-Fi"
'InvertArticle objMovie.strMovieTitle ' => you don't need to do this call
要保留原始字符串,并在获得属性值时应用get
。这样你总是保留原始字符串。但是,这种方法需要更多的返工,只有在你有很多方法可以在代码的不同部分使用helpers
时,它才有用。
String
希望有所帮助