将类型更改为类会导致ByRef参数执行ByVal

时间:2017-08-04 22:03:28

标签: vba class pass-by-reference user-defined-types

我听说过将用户定义类型(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。)

1 个答案:

答案 0 :(得分:1)

现在我明白了你的担忧。

你根本无法采用这种方法来实现目标。正如蒂姆·威廉姆斯在你的问题中所评论的那样,你最好的选择就是这样:

Dim objMovie As MovieClass
Dim strMovieTitle As String
strMovieTitle = "Terminator, The"
objMovie.strMovieTitle = InvertArticle(strMovieTitle)

但是,我发现这仍然无法满足您的需求。

我的建议如下:

  • 将您的对象设为内部,定位属性Private,并使用Property LetProperty 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

希望有所帮助