22

我想要一个 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

先感谢您!

4

5 回答 5

37

这适用于 Excel 和 Word

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")

于 2013-09-20T17:11:22.520 回答
11

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

Shell "explorer.exe C:\myfile.txt"
于 2016-10-06T18:46:30.590 回答
7

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

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
于 2013-09-20T16:53:32.213 回答
4

我无法对现有答案发表评论(分数不够),所以我正在回答以添加信息。

从 Access 2010 开始,我遇到了以下语法的静默失败:

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

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

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

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

教训是,在进行 OLE 自动化调用时,要明确让 Access VBA 适当地转换内容!

于 2019-05-16T17:39:25.887 回答
2

Shell32.ShellCOM 对象akaShell.Application可用于包装ShellExecuteWin32 API 函数:

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

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

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

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

于 2017-09-02T03:29:09.627 回答