Excel VBA如何使用默认应用程序打开文件

时间:2013-09-20 16:05:43

标签: vba excel-vba excel

我想要一个Excel电子表格,其中包含A列中的文件路径和名称。运行宏时,请说明在A1中指定的文件应该在用户的计算机上打开。该文件可能是.doc,.xls,.txt等....而不是我的vba需要知道应用程序的完整路径,我怎么能让vba告诉机器"请打开这个文件,使用与扩展程序相关联的应用程序" ?

我已经发现这可以使用完整路径:

dblShellReturned = Shell("C:\Windows\System32\notepad.exe myfile.txt, vbNormalFocus)

我怎么能让它与以下的东西一起工作:

dblShellReturned = Shell("myfile.txt", vbNormalFocus) ' how do I get this to work

提前谢谢!

5 个答案:

答案 0 :(得分:25)

这适用于我在Excel&字

Sub runit()
   Dim Shex As Object
   Set Shex = CreateObject("Shell.Application")
   tgtfile = "C:\Nax\dud.txt"
   Shex.Open (tgtfile)
End Sub

或......根据Expenzor的评论

CreateObject("Shell.Application").Open("C:\Nax\dud.txt")

答案 1 :(得分:6)

以下代码是模板。但是,您可能希望将默认(工作)目录更新为文件的位置。

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
                   (ByVal hwnd As Long, ByVal lpszOp As String, _
                    ByVal lpszFile As String, ByVal lpszParams As String, _
                    ByVal LpszDir As String, ByVal FsShowCmd As Long) _

Function StartDoc(DocName As String) As Long
      Dim Scr_hDC As Long
      Scr_hDC = GetDesktopWindow()
      StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _
      "", "C:\", SW_SHOWNORMAL)
 End Function

答案 2 :(得分:5)

VBA的Shell命令想要一个exe,所以我一直在启动explorer.exe并传入我的文件路径作为参数。它似乎也适用于* .lnk快捷方式和网址。

Shell "explorer.exe C:\myfile.txt"

答案 3 :(得分:1)

可以使用

Shell32.Shell COM object aka Shell.Application来包装ShellExecute Win32 API函数:

  • 通过Microsoft Shell Controls And AutomationTools->References...类型库的引用添加到VBA项目,然后

    Dim a As New Shell32.Shell
    Call a.ShellExecute("desktop.ini")
    
  • 或者,没有任何参考:

    Call CreateObject("Shell.Application").ShellExecute("desktop.ini")
    

有趣的是,在这里(WinXP),当使用类型变量(提供自动完成)时,成员列表中缺少ShellExecute(但仍然有效)。

答案 4 :(得分:0)

我无法评论现有答案(得分不足),因此我在回答以添加信息。

从Access 2010开始,我遇到了以下语法的无提示故障:

Dim URL As String
URL = "http://foo.com/"
CreateObject("Shell.Application").Open URL

如果将URL括在括号中,则可以使它工作,但是对于子例程(而不是函数)调用语法,这似乎是错误的。我尝试吞下返回值,但是除非使用括号将其加倍,否则函数调用语法将失败。我意识到括号不仅是语法糖,它们还必须做一些事情,这使我相信括号可能会促进隐式转换。

我注意到Open期望Variant,而不是String。因此,我尝试了CVar,它确实有效。考虑到这一点,我最好采用以下方法,因为它最大程度地减少了“为什么这里有多余的括号?”。问题。

Dim URL As String
URL = "http://foo.com/"
CreateObject("Shell.Application").Open CVar(URL)

教训是,在进行OLE自动化调用时,请明确说明要使Access VBA正确地进行转换!