VBA: как запустить другое приложение из MS Access

Я пытаюсь понять эту проблему, и кажется, что я не могу найти решение проблемы в любом месте. Здесь была первая часть: Команда VBA Shell всегда возвращает "File Not Found" В этом вопросе он не нашел приложение в папке% APPDATA% для некоторых Нечетная причина, вероятно, настройка безопасности.

С тех пор я переместил инструмент импорта в тот же каталог, в который я хранил базу данных, с небольшой надеждой на то, чтобы заставить ее работать правильно.

Моя цель - нажать кнопку в MS Access и запустить ее непосредственно с помощью инструмента импорта. Прямо сейчас у меня есть открытие папки, в которой хранится инструмент. Это работает на моей машине разработки, которая имеет привилегии администратора, но не работает на других машинах без admin privs. Код прямо сейчас выглядит примерно так:

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 при использовании привилегий меньшего размера? Либо запустить приложение напрямую, либо, по крайней мере, открыть папку, в которой находится указанное приложение.

Спасибо!

P.S. Я попробовал оба кода ShellAndWait и RunApplication, найденные в stackoverflow, ни один из которых не работает в этом экземпляре.

Ответ 1

Я всегда использую ShellExecute из Windows API, когда мне нужно что-то выполнить в VBA.
Насколько я знаю, он работает на машинах без полных привилегий.

Пример:

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 также имеет два необязательных параметра. Я не показал это в приведенных выше примерах, но вы можете:

  • передать параметры исполняемым файлам
  • скрыть окно вызываемого исполняемого файла

Ответ 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"

Это может дать вам некоторые идеи.

Ответ 4

Проверьте

Shell szFileName, vbNormalFocus

с другим исполняемым файлом. Это может быть проблемой с вашим инструментом.

Ответ 5

не работает в Win 7 pro 64b из Office 2016 (32b) ДОСТУП с jpg Shellex "c:\somefolder\somefile.jpg" не возвращает ошибок или диалогов

мысли