以下代码打开文件名的默认应用程序:
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
这个微妙的不同之处是为什么括号在函数内变得必要?
答案 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