【问题标题】:VBA: How to run another application from MS AccessVBA:如何从 MS Access 运行另一个应用程序
【发布时间】:2012-05-17 18:07:30
【问题描述】:

我一直在努力解决这个问题,但似乎我无法在任何地方找到问题的解决方案。这是第一部分: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 代码,但在这种情况下都不起作用。

【问题讨论】:

    标签: shell ms-access vba


    【解决方案1】:

    当我需要在 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 不会暂停 MS Access 线程。它只是调用shell,由于它不跟踪shell的进程是否完成,所以即使被shell的程序仍在运行,它也会继续执行
    【解决方案2】:

    点击此链接

    MS ACCESS: LAUNCH AN APPLICATION FROM ACCESS 2003/XP/2000/97

    这是一个在 ms 访问中运行应用程序的示例

    Private Sub Command1_Click()
    Dim myPath As String
    myPath = "C:\Program Files\mytool\mytool.exe"
    Call Shell(myPath , 1)
    End Sub
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      只是在搞砸http://www.mombu.com/microsoft/scripting-wsh/t-vista-uac-problem-with-wscriptshell-run-method-1508617.html。我在 Windows 7 家用电脑上试过这个。

      Set objShell = CreateObject("Shell.Application")
      myPath = Environ("ProgramFiles(x86)") & "\mytool"
      Set objFolder = objShell.Namespace(myPath)
      Set objFolderItem = objFolder.ParseName("mytool.exe")
      objFolderItem.InvokeVerb "runas"
      

      它可能会给你一些想法。

      【讨论】:

      • 这适用于 VBA 吗?我知道集合中的很多 VB 指令在 VBA 中没有对应的指令。
      • 我在 VBA 中尝试过,但我不知道它是否适用于您的情况。我只能说它在我家用 PC 上以 VBA 运行。
      • 我在 objShell.Namespace() 方法上收到“找不到方法或数据成员”的错误。此外,我不知道将 objFolder 和 objFolderItem 标注为什么。目前,它们被标注为 Variant。
      • 我无法重现您的错误,但我会再看一会儿。大多数情况下,您可以标注以 obj 开头的事物作为对象。但是,由于这是一项测试,您现在可以跳过尺寸标注。
      • 您能否按照msdn.microsoft.com/en-us/library/windows/desktop/… 设置对Microsoft Shell Controls and Automation (Shell32) 的引用?然后您可以拥有Dim objshell As Shell 并查看命名空间是否在智能感知中可用。您还可以检查使用objShell.Namespace("c:\some\folder") 是否有效。
      【解决方案4】:

      检查

      Shell szFileName, vbNormalFocus
      

      与其他一些可执行文件。你的工具可能有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多