【问题标题】:How can Excel VBA open file using default applicationExcel VBA如何使用默认应用程序打开文件
【发布时间】:2013-09-26 02:26:05
【问题描述】:

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

提前谢谢你!

【问题讨论】:

标签: vba excel


【解决方案1】:

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

【讨论】:

  • 这在 Access 中也适用于我作为打开附件的一种方式!
  • 或单行:CreateObject("Shell.Application").Open("C:\Nax\dud.txt")
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    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
    

    【讨论】:

    • 这不就是@TimWilliams 在上面的 cmets 中建议的吗? :)
    • @SiddharthRout 哦,我并不总是关注 cmets。我错过了那个。我不明白为什么人们把答案放在那里,这似乎破坏了堆栈溢出模型并弄乱了搜索。
    • 不用担心 :) 我有时也会错过评论。关于你的问题。在我个人看来,由于几个原因,我们中的一些人在 cmets 中回答。我的是(不一定是其他人)...1 通过发布答案并没有太多的附加值,因为链接说明了一切,例如:MSDN 链接2 没有意义重新发明轮子。我们不是来收集Upvotes,而是帮助人们3这个问题已经被问过很多次了。 4 OP 学习的好机会。希望能回答你的问题:)
    • BTW + 1 帮助 OP 举个例子:)
    • @SiddharthRout 我宁愿在问题中添加一些有用的东西作为答案并将其关闭,因此这不是死胡同,也不会在未回答的问题列表中四处游荡。那里有一些值得回答的老问题,但它们在混乱中迷失了。
    【解决方案4】:

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

    从 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 适当地进行转换!

    【讨论】:

    • 我发现括号的解释很有帮助——我也试过不使用它们,这是唯一解释它们不是可选的答案。
    【解决方案5】:

    Shell32.Shell COM object aka Shell.Application 可用于包装ShellExecute Win32 API 函数:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多