【发布时间】:2019-07-02 17:09:55
【问题描述】:
我正在使用一个函数来修改一系列字符串,将它们作为参数传递给修改函数。调用者的字符串变量都按预期进行了修改,但是作为类属性的一个参数没有改变,这可能吗? 该课程的要点是:-
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:{path to file{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 参数。
如果我用标准字符串变量替换参数列表中的类属性,然后将其分配给类属性,那么我会得到预期的结果,这似乎是不必要的工作。
是否有我遗漏的东西,或者这在 VBA 中是不可能的?
【问题讨论】:
-
为什么不直接将类作为参数传递?
-
请发布用户文件字符串示例
-
另外,我怀疑 Class.TestRefID 编译为表达式,您不能将表达式传递给 ByRef 参数。
-
老实说,如果您遇到问题,请创建一个执行您想要的替换的函数,然后调用它 4 次。稍微不那么“优雅”,但可以完成工作,而不必担心最终结果是保存到局部变量还是类属性。
-
显示如何调用
GetTestFileNames的代码在哪里?我可以猜可能是GetTestFileNames obj.TestRefID, ...,但我在您的帖子中没有看到。如果这就是你的方式,那么是的,@Freeflow 是对的:你不能在 VBA 中传递函数或成员,所以obj.TestRefID是一个需要在 结果 之前评估的表达式将 (ByVal) 传递给函数 - 通过传入表达式,您将丢弃对该表达式所指值的引用,从而传递字符串ByVal。
标签: vba pass-by-reference