[英]What does this subtle VBA code change with brackets mean?
以下代码打开文件名的默认应用程序:
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
这有什么细微的区别?为什么在函数中必须使用括号?
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)中查看结果。
好吧,那很有趣。
您已经遇到了Shell.Open方法的非常奇怪的行为。
Shell.Open(ByVal vDir As Variant) As Integer
请注意,该参数定义为Variant,而不是String。
那是因为你也可以做
sh.Open 36
打开Windows文件夹。
显然是因为这个原因, sh.Open filename
不起作用(尽管它是正确的语法),因为文件名作为引用传递。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.