类属性作为 ByRef 参数不起作用

Nig*_*elH 1 vba pass-by-reference

我正在使用一个函数来修改一系列字符串,并将它们 ByRef 作为参数传递给修改函数。调用者的字符串变量都按预期进行了修改,但作为类属性的一个参数没有改变,这可能吗?该课程的要点是:-

Private cRptRef As String

Public Property Get TestRefID() As String
    TestRefID = cRptRef
End Property

Public Property Let TestRefID(Test_Ref As String)
    cRptRef = Test_Ref
End Property
Run Code Online (Sandbox Code Playgroud)

修改字符串的函数有以下声明

Public Function GetTestFileNames(ByRef hdrFile As String, _
                                 ByRef calFile As String, _
                                 ByRef dataFile As String, _
                                 ByRef testRef As String _
                                 ) As Boolean
Run Code Online (Sandbox Code Playgroud)

GetTestFilenames 的调用如下:

If GetTestFileNames(HEADERpath, CALpath, RAWDATApath, _
                    ref) = False Then
Run Code Online (Sandbox Code Playgroud)

所有字符串参数都声明为全局字符串,并且在调用之前为空 ("")。调用后,它们通常具有类似“d:{文件路径{filename.csv}”的内容。因此函数中的所有这些语句都可以填充目标字符串。

hdrFile = Replace(userFile, "##", PT_Rpt.Info.FindNode(TEST_REF_HDRsuffix).data, , , vbTextCompare)
dataFile = Replace(userFile, "##", PT_Rpt.Info.FindNode(TEST_REF_DATAsuffix).data, , , vbTextCompare)
calFile = Replace(userFile, "##", PT_Rpt.Info.FindNode(TEST_REF_CALsuffix).data, , , vbTextCompare)
Run Code Online (Sandbox Code Playgroud)

但该语句无法将任何内容分配给其目标字符串

testRef = Mid(userFile, InStrRev(userFile, Application.PathSeparator) + 1)
testRef = Left(testRef, InStrRev(testRef, "_") - 1)
Debug.Print "Class.TestRefID="; testRef
Run Code Online (Sandbox Code Playgroud)

Debug.Print 语句打印预期的字符串,但外部引用不受影响。这和它是财产有关系吗?目标字符串代替Class.TestRefIDtestRef 参数。如果我用标准字符串变量替换参数列表中的类属性,然后将其分配给类属性,那么我会得到预期的结果,这似乎是不必要的工作。我是否遗漏了什么,或者这在 VBA 中是不可能的?

Mat*_*don 5

成员访问表达式是必须首先由 VBA 计算的表达式,然后才能传递其结果。

如果我有一个Class1这样的模块:

Option Explicit
Public Foo As String
Run Code Online (Sandbox Code Playgroud)

然后是快速调用程序:

Sub test()
    With New Class1
        bla .Foo
        Debug.Print .Foo
    End With
End Sub

Sub bla(ByRef bar As String)
    bar = "huh"
End Sub
Run Code Online (Sandbox Code Playgroud)

test过程将输出一个空字符串。

这样做的原因是,当您将成员传递给ByRefVBA 中过程的参数时,您并不是传递对该成员的引用,而是传递对该成员所持有的值的引用

因此,成员访问表达式被求值,求值为"",因此""被传递ByRef给过程,该过程将其分配给"huh",但调用者没有持有对该""值的引用,因此它永远看不到"huh"分配的字符串。

如果我用标准字符串变量替换参数列表中的类属性,然后将其分配给类属性,那么我会得到预期的结果,这似乎是不必要的工作

这不是不必要的工作,而是强制性的否则没有任何东西可以引用成员表达式的结果。

然而,真正的问题是一个设计问题,Warcupine 指出:该函数不想通过引用返回 4 个值,它想要引用该对象,并分配其属性。

  • “这样做的原因是,当您将成员传递给 VBA 中过程的 ByRef 参数时,您并不是传递对该成员的引用,而是传递对该成员所持有的值的引用。” 现在我明白了,谢谢你的帮助。 (2认同)