类属性为ByRef参数不起作用

时间:2019-07-02 17:09:55

标签: 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

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

Public Function GetTestFileNames(ByRef hdrFile As String, _
                                 ByRef calFile As String, _
                                 ByRef dataFile As String, _
                                 ByRef testRef As String _
                                 ) As Boolean

对GetTestFilenames的调用如下:

If GetTestFileNames(HEADERpath, CALpath, RAWDATApath, _
                    ref) = False Then

所有字符串参数都声明为全局字符串,并且在调用之前为空(“”)。通话结束后,他们通常会看到类似“ 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)

但是该语句无法为目标字符串分配任何内容

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

Debug.Print语句打印预期的字符串,但外部引用不受影响。这与成为财产有关吗? 目标字符串是Class.TestRefID代替testRef参数。 如果我用标准的字符串变量替换参数列表中的class属性,然后将其分配给class属性,那么它将得到预期的结果,这似乎是不必要的工作。 我缺少什么吗?在VBA中这是不可能的吗?

1 个答案:

答案 0 :(得分:4)

成员访问表达式是表达式,必须首先由VBA对其进行评估,然后才能传递其结果。

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

Option Explicit
Public Foo As String

然后是快速调用程序:

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

Sub bla(ByRef bar As String)
    bar = "huh"
End Sub

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

这样做的原因是因为当您将成员传递给VBA中过程的ByRef参数时,您没有将引用传递给成员-您正在传递对该成员拥有的值的引用。

因此对成员访问表达式进行求值,其结果为"",因此将""传递给过程ByRef,该过程将其分配给{{1 }},但是调用方没有持有对"huh"值的引用,因此它永远看不到已分配的""字符串。

  

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

这不是不必要的工作,它是必需的,否则,没有任何内容可以保存对成员表达式结果的引用。

那么, real 问题又是一个设计问题,pointed out by Warcupine:该函数不想byref返回4个值,它想引用该对象,并且分配其属性。

相关问题