shell - VBA:如何从 MS Access 运行另一个应用程序

标签 shell ms-access vba

我一直在试图解决这个问题,但似乎我无法在任何地方找到问题的解决方案。这是第一部分:VBA Shell command always returns "File Not Found"在这个问题中,由于某种奇怪的原因(可能是安全设置),它没有在 %APPDATA% 文件夹中找到该应用程序。

此后,我已将导入工具移至存储数据库的同一目录中,希望能够使其正常工作。

我的目标是单击 MS Access 中的按钮并让它直接运行我的导入工具。现在,我让它打开保存该工具的文件夹。这适用于我的具有管理员权限的开发计算机,但不适用于没有管理员权限的其他计算机。现在的代码如下所示:

Dim hProcess as Long
Dim myPath as String
Dim ex as String

ex = "C:\WINDOWS\explorer.exe "
myPath = Environ("ProgramFiles(x86)") & "\mytool\"

hProcess = Shell(ex & myPath, vbNormalFocus)

这允许打开保存文件的文件夹,但仅限于具有完全管理员权限的计算机帐户。当在没有完全权限的计算机帐户上运行它时,它什么也不做。

我还尝试了以下方法:

Dim hProcess As Long
Dim myPath as String

myPath = Environ("ProgramFiles(x86)") & "\mytool\mytool.exe"
hProcess = Shell(myPath, vbNormalFocus)

此部分“似乎”起作用,因为当我查看进程管理器时,它会加载应用程序“mytool.exe”。然而,几秒钟(可能是 20 秒)后,会弹出一个对话框,指出应用程序“mytool.exe”已停止工作。

这里需要注意的一件事是,我在我的开发计算机上拥有管理员权限,但我在我的家用计算机上拥有所有权限。在我的家用机器上,第二个代码可以正常工作。在我的开发机器上,它崩溃了,而在受限用户机器上,它根本不执行任何操作。

对于如何在使用低于管理员权限的情况下从 MS Access 打开此应用程序有什么建议吗?直接运行应用程序或至少打开所述应用程序所在的文件夹。

谢谢!

附注我已经尝试了 stackoverflow 上找到的 ShellAndWait 和 RunApplication 代码,但在这种情况下都不起作用。

最佳答案

当我需要在 VBA 中执行某些操作时,我总是使用 Windows API 中的 ShellExecute
据我所知,它也可以在没有完全权限的机器上运行。

示例:

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
    ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
    ByVal lpDirectory As String, ByVal lpnShowCmd As Long) As Long


Public Sub ShellEx(ByVal Path As String, Optional ByVal Parameters As String, Optional ByVal HideWindow As Boolean)

    If Dir(Path) > "" Then
        ShellExecute 0, "open", Path, Parameters, "", IIf(HideWindow, 0, 1)
    End If

End Sub

现在您可以调用 ShellEx 来运行几乎任何内容:

'run executable
ShellEx "c:\mytool.exe"

'open file with default app
ShellEx "c:\someimage.jpg"

'open explorer window
ShellEx "c:\"

请注意,ShellEx 还有两个可选参数。
我没有在上面的示例中展示这一点,但您可以:

  • 将参数传递给可执行文件
  • 隐藏被调用可执行文件的窗口

关于shell - VBA:如何从 MS Access 运行另一个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10641147/

相关文章:

shell - 如何将 shell 脚本变量传递给 Expect 脚本?

ms-access - 在组合框中输入时不需要前面的零

xml - 将多个 Access 表导出到单个 XML

integer - 为什么使用整数而不是长整型?

excel - Excel VLookup 公式中的分隔查找字符串

vba - 如何在每半小时后获得最近的日期

c++ - C 程序 : Get inode header fields and information by inode number

linux - 如何根据日期和时间删除目录

git - 如何完全抑制 Git 克隆输出?

sql - 来自两个连接表的不同记录,一个 "distinct"字段,控制日期