如何在VBA中向过程传递多个参数?

12

我想把两个字符串参数传递给一个子程序,但是它不允许我这样做。我使用的方法如下所示。

Sub callByValue( str1 As String, str2 As String)
MsgBox str1
MsgBox str2

End Sub

调用宏:

 Dim s1, s2 As String
 callByValue(s1,s2)

在调用callByvalue时,它会抛出编译器错误。


我没有点赞,因为你可以很容易地自己解决这个问题。 - jacouh
2个回答

24

你需要移除括号

callByValue s1, s2

在VBA中要记得,当你写Dim s1, s2 As String时,只有s2会被声明为String类型,而第一个则会被声明为Variant类型。

我还注意到的一件事是,在调用子程序之前,您没有给s1s2赋值。这两个变量都会是空白的。

例如,请按照以下方式操作。

Sub Sample()
    Dim s1 As String, s2 As String
    s1 = "Blah": s2 = "Blah Blah"
    callByValue s1, s2
End Sub

1
加一分,因为你做得比预期更好了。 - Pradeep Kumar
1
非常感谢。它对我有效。 - Samraan
1
+1 由于你回答了OP的语法错误,我没有看到它。 - jacouh

5

这是一个更好的 ByVal 调用子程序的定义。

Sub callByValue(ByVal str1 As String, ByVal str2 As String)
  MsgBox str1
  MsgBox str2
End Sub

Sub sof20285505callByVal()
  Dim s1, s2 As String
  callByValue s1, s2
End Sub

1
+1 现在在您的编辑后,我可以点赞了 :P - Siddharth Rout
1
注意,dim s1, s2 as String 只声明了s2为字符串类型,而s1则为变量类型。 - user2140173
@mehow,这只是我的子程序的质量。在传递之前,所有调用参数都会被转换为字符串...你甚至可以使用Date类型调用它而不会出错。 - jacouh
隐式转换。在隐式转换方面,你必须非常小心(在VBA中不需要那么小心,但在.Net语言中完全是另一回事)。通常最好为变量声明正确的类型,这是一个良好的编程实践。 - user2140173
@mehow,我现在支持所有变量类型的变量,因为这对VBScript是兼容的。 - jacouh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接