这个微妙的VBA代码用括号改变是什么意思?

时间:2015-10-08 06:25:32

标签: vba ms-access access-vba

以下代码打开文件名的默认应用程序:

Public Function OpenDefaultApplication(filename As String)
    Dim sh As Object
    Set sh = CreateObject("Shell.Application")
    sh.Open (filename)
    Set sh = Nothing
End Function

但是,从打开文件的行中删除括号表示文件未打开:

    sh.Open filename    ' does not work!

但是,如果我从函数中删除代码,则代码可以在没有括号的情况下成功运行。

Dim sh As Object
Set sh = CreateObject("Shell.Application")
sh.Open filename ' works if not inside a function
Set sh = Nothing

这个微妙的不同之处是为什么括号在函数内变得必要?

2 个答案:

答案 0 :(得分:2)

sh.Open filename

实际上是正确的语法 或者

Call sh.Open(filename)

原始陈述

sh.Open (filename)

评估 filename,然后将其传递给sh.Open 如果您使用具有两个参数的方法尝试此语法:

sh.SomeMethod (filename, parameter2)

您会收到语法错误。

所以问题是:
您将filename传递给第一个函数,第二个代码示例中的filename是什么?

修改
有关详细说明,请将其添加到OpenDefaultApplication的开头:

Debug.Print filename
Debug.Print (filename)

并在立即窗口中看到结果(Ctrl + G)。

答案 1 :(得分:2)

嗯,这很有趣。

你遇到了Shell.Open方法的非常奇怪的行为。

Shell.Open(ByVal vDir As Variant) As Integer

请注意,参数定义为Variant,而不是String 那是因为你也可以这样做。

sh.Open 36

打开Windows文件夹。

显然正因为如此,sh.Open filename不起作用(尽管它是正确的语法),因为filename是作为Reference传递的。

sh.Open (filename)有效,但是相当难看。

更好的解决方案:

1)如果你坚持使用Shell.Open,则将filename声明为Variant:

Public Sub OpenDefaultApplication(filename As Variant)
    Dim sh As Object
    Set sh = CreateObject("Shell.Application")
    sh.Open filename
End Sub

2)使用正确的方法打开文件Shell.ShellExecute

Public Sub OpenDefaultApplication(filename As String)
    Dim sh As Object
    Set sh = CreateObject("Shell.Application")
    sh.ShellExecute filename
End Sub