访问:Shell cmd打开MDB

时间:2012-01-26 20:25:26

标签: ms-access vba ms-access-2003

我一直在使用以下命令通过VBA打开另一个MDB Access文件:

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

strNewFullPath是MDB文件的完整路径。 使用Access 2010时工作正常,但不能在Access 2003上运行。 如果我在XP DOS终端中运行命令,它就会运行。

我可以使用哪些其他命令可以使用Access Runtime在Access 2003上运行

6 个答案:

答案 0 :(得分:5)

尝试使用Windows Scripting主机对象模型(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 - 根据启动应用程序的程序状态设置show-state。

    我不知道此参数的默认值。请注意,有些程序会忽略您设置的任何值(我无法告诉您哪些值)。

  2. bWaitOnReturn(boolean)

    异步代码设置为 False 。 Run方法在完成之前将控制权返回给调用程序。默认为错误

答案 1 :(得分:4)

如果要使用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对象变量自动化新应用程序实例的方法。但是,如果您对自动化新实例不感兴趣,那么这种方法可能只有在您无法使其他方法有效时才有用。

答案 2 :(得分:3)

您可以使用Win32 API查找与文件类型关联的EXE名称,并将其添加到shell命令中,如下所示:

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

答案 3 :(得分:1)

shell命令的问题是cmd提示符并不总是支持使用文件扩展名来启动程序。事实上,你最好使用

使用.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或使用运行时的情况,您可能不希望使用该扩展来启动该文件。因此,这可确保您使用的是当前正在运行的SAME版本和相同的.exe。因此,上面的代码会提取您正在使用的当前msaccess.exe路径,而不是基于文件扩展名的路径。

答案 4 :(得分:1)

在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

这在运行时模式下有效:)

答案 5 :(得分:0)

这是一个轻微的修订,我曾经使它与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      其他         '这里的shell代码不行         MsgBox“无法运行升级”,vbCritical,AppName          DoCmd.Hourglass False         Application.Quit      结束如果

End Sub

相关问题