Доступ: Shell CMD Открыть MDB - PullRequest
       11

Доступ: Shell CMD Открыть MDB

3 голосов
/ 27 января 2012

Я использовал следующую команду, чтобы открыть другой файл MDB Access через VBA:

Shell "cmd /c " & Chr(34) & strNewFullPath & Chr(34), vbHide

strNewFullPath - полный путь к файлу MDB.Работает нормально при использовании Access 2010, но не запускается в Access 2003. Если я запускаю команду в терминале XP DOS, она работает.

Какую другую команду я могу использовать, чтобы она работала в Access 2003 up и с Access Runtime?

Ответы [ 6 ]

5 голосов
/ 27 января 2012

Попробуйте использовать объектную модель хоста сценариев Windows ( WSHOM ):

Sub RunFile(filename As String)
Dim oShell As Object
  Set oShell = GetShell
  If Not oShell Is Nothing Then
    oShell.Run filename
  End If
End Sub
Function GetShell() As Object   
  On Error Resume Next     
  Set GetShell = CreateObject("WScript.Shell")  
End Function 

Ассоциация файлов Windows должна позволять открывать оба типа файлов в их собственном приложении.

Пример использования:

RunFile strNewFullPath

Необязательные аргументы:

Есть два необязательных аргумента для метода Run.Обратите внимание, что большая часть этого скопирована из MSDN:

  1. intWindowStyle (целое число) Число от 0 до 10:

    0 - скрывает окно и активируетдругое окно.
    1 - активирует и отображает окно.Если окно свернуто или развернуто, система восстанавливает его исходный размер и положение.Приложение должно указывать этот флаг при первом отображении окна.
    2 - активирует окно и отображает его как свернутое окно.
    3 - активирует окно и отображает его как развернутое окно.
    4 - Отображает окно в его самом последнем размере и положении.Активное окно остается активным.
    5 - Активирует окно и отображает его в его текущем размере и позиции.
    6 - Минимизирует указанное окно и активирует следующее окно верхнего уровня в порядке Z.
    7- Отображает окно как свернутое окно.Активное окно остается активным.
    8 - Отображает окно в его текущем состоянии.Активное окно остается активным.
    9 - Активирует и отображает окно.Если окно свернуто или развернуто, система восстанавливает его исходный размер и положение.Приложение должно указывать этот флаг при восстановлении свернутого окна.
    10 - Устанавливает состояние показа на основе состояния программы, которая запустила приложение.

    Мне не известно значение по умолчанию для этого параметра.Обратите внимание, что некоторые программы просто игнорируют любое заданное вами значение (я не могу сказать, какое из них).

  2. bWaitOnReturn (логическое значение)

    Установите на False для асинхронного кода.Метод Run возвращает управление вызывающей программе перед завершением.По умолчанию False .

4 голосов
/ 27 января 2012

Если вы хотите использовать Access VBA для открытия базы данных в другом экземпляре приложения Access, вы можете сделать это:

Dim objApp As Access.Application
Set objApp = New Access.Application
objApp.UserControl = True
objApp.OpenCurrentDatabase "C:\Access\sample.mdb"
Set objApp = Nothing

Если для UserControl установлено значение True, новый экземпляр приложения остается открытым после завершения процедуры.

Если вы хотите, чтобы новый экземпляр Access был скрыт, включите:

objApp.Visible = False

Я предлагаю этот подход, поскольку он также дает вам возможность автоматизировать новый экземпляр приложения через переменную объекта objApp,Но, если вы не заинтересованы в автоматизации нового экземпляра, этот подход, вероятно, будет полезен, только если вы не можете заставить работать любой другой метод.

3 голосов
/ 27 января 2012

Вы можете использовать Win32 API, чтобы найти имя EXE, связанное с типом файла, и добавить его к вашей команде оболочки, например:

Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long

Public Function GetExecutableForFile(strFileName As String) As String
   Dim lngRetval As Long
   Dim strExecName As String * 255
   lngRetval = FindExecutable(strFileName, vbNullString, strExecName)
   GetExecutableForFile = Left$(strExecName, InStr(strExecName, Chr$(0)) - 1)
End Function

Sub RunIt(strNewFullPath As String)        
   Dim exeName As String

   exeName = GetExecutableForFile(strNewFullPath)         
   Shell exeName & " " & Chr(34) & strNewFullPath & Chr(34), vbNormalFocus
End Sub
1 голос
/ 27 января 2012

Я использую эту функцию при работе в Access 2003:

Public Function RunExternalMDB(MDBName As String, WG As String, UsrNm As String, Pwd As String)

        Shell "MsAccess.exe " & """" & MDBName & """" & " /wrkgrp " & """" & WG & """" & " /user " & UsrNm & " /pwd " & Pwd

End Function

Это работает в режиме Runtime:)

1 голос
/ 27 января 2012

Проблема с вашей командой оболочки заключается в том, что приглашение cmd не всегда поддерживает использование расширения файла для запуска программы.На самом деле, вам лучше использовать

Start "путь к какому-либо файлу с расширением .extension"

Вышеприведенное во многом похоже на щелчок.

Однако, что вы действительно хотите сделать, это запустить msacces.exe и предоставить имя пути к файлу, чтобы открыть его.Это особенно актуально при установке во время выполнения.

Таким образом, ваш код должен выглядеть следующим образом:

  Sub testjump()

     ' jumps to a mde file called "upgrade.mde"
     ' it exists in the same directly as the currently running program

     Dim strShellProg        As String
     Dim strCurrentDir       As String
     Const q                 As String = """"

     strCurrentDir = CurrentProject.path & "\"

    ' path to msaccess is required here
     strShellProg = q & SysCmd(acSysCmdAccessDir) & "msaccess.exe" & q

     strShellProg = strShellProg & " " & q & strCurrentDir & "RidesUpGrade.mdE" & q

     If Shell(strShellProg, vbNormalFocus) > 0 Then
        ' code here for shell ok
        Application.Quit
     Else
        ' code here for shell not ok
        MsgBox "Un able to run Rides upgrade", vbCritical, AppName
        Application.Quit
     End If

  End Sub

Так что в приведенном выше примере используется полный путь к msaccess.exe.Он был протестирован на XP, Vista, Win7 и т. Д., И он всегда работал для меня.

И в случае более чем одной версии Access или использования среды выполнения, вы можете не захотеть использоватьрасширение для запуска файла.Таким образом, это гарантирует, что вы используете ту же версию и тот же .exe, который вы используете в данный момент.Таким образом, приведенный выше код извлекает текущий путь к msaccess.exe, который вы используете, а не по расширению файла.

0 голосов
/ 11 декабря 2014

Вот небольшая ревизия, которую я использовал, чтобы она работала с accdr, где требуется использование переключателя времени выполнения.

 strShellProg = q & SysCmd(acSysCmdAccessDir) & "msaccess.exe" & q & " /runtime"

 strShellProg = strShellProg & " " & q & strCurrentDir & "spfe.accdr" & q

    If Shell(strShellProg, vbNormalFocus) > 0 Then
     DoCmd.Hourglass False

'DoCmd.Quit Application.Quit еще 'код здесь для оболочки не в порядке MsgBox "Невозможно запустить обновление", vbCritical, AppName DoCmd.Hourglass False Application.Quit Конец, если

End Sub

...