Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 访问:Shell cmd Open MDB_Ms Access_Vba_Ms Access 2003 - Fatal编程技术网

Ms access 访问:Shell cmd Open MDB

Ms access 访问:Shell cmd Open MDB,ms-access,vba,ms-access-2003,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 2003 up和Access运行时?尝试使用Windows脚

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

Shell "cmd /c " & Chr(34) & strNewFullPath & Chr(34), vbHide
strNewFullPath是MDB文件的完整路径。 在使用Access 2010时工作正常,但在Access 2003上不运行。 如果我在XP DOS终端上运行该命令,它就会运行


我可以使用什么其他命令来处理Access 2003 up和Access运行时?

尝试使用Windows脚本主机对象模型():

Windows文件关联应允许这两种类型的文件在其本机应用程序中打开

示例用法: 可选参数: Run方法有两个可选参数。请注意,其中大部分内容是从MSDN复制的:

  • IntWindowsStyle(整数) 从0到10的数字:

    0-隐藏窗口并激活另一个窗口。
    1-激活并显示一个窗口。如果窗口最小化或最大化,则系统 将其恢复为原始大小和位置。申请应 第一次显示窗口时指定此标志。
    2-激活窗口并将其显示为最小化窗口。
    3-激活窗口并将其显示为最大化窗口。
    4-显示窗口的最新大小和位置。主动的 窗口保持活动状态。
    5-激活窗口并以其当前大小和位置显示它。
    6-最小化指定窗口并按Z顺序激活下一个顶级窗口。
    7-将窗口显示为最小化窗口。活动窗口保持活动状态。
    8-显示窗口的当前状态。活动窗口保持活动状态。
    9-激活并显示窗口。如果窗口最小化或最大化,系统会将其恢复到其原始大小和位置。应用程序在还原最小化窗口时应指定此标志。
    10-根据启动应用程序的程序的状态设置显示状态

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

  • bWaitOnReturn(布尔值)

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


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

    您可以使用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
    
      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
    

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

    开始“指向某个扩展名为

    上面的操作与单击完全相同

    但是,您真正想要做的是启动msacces.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
    
      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路径,而不是基于文件扩展名的路径。

    在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
    

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

    这里有一个我用来使它与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
     Else
        ' code here for shell not ok
        MsgBox "Unable to run upgrade", vbCritical, AppName
        DoCmd.Hourglass False
        Application.Quit
     End If
    

    MDB是Access 2003的文件扩展名,那么它是如何工作的呢?你提到它运行在XP DOS终端上,那么当它不工作时你使用的是什么操作系统呢?我很好奇你为什么要在一个隐藏的窗口中打开MDB。它是否运行autoexec宏,然后关闭自身?还是别的?@JP。我有一台装有Office 2010的Windows 7电脑和一台装有Office 2003的Windows XP电脑。在XP和Win7中工作的DOS命令是
    cmd/c“\\10.1.1.44\Share\myApp.mdb”
    。使用VBA中的shell命令,它只会打开DOS propmt命令,因为Access有时会损坏多用户访问中的文件;我设计了一种加载器应用程序,它会检查自身及其位置,如果一切正常,它会创建主MDB的副本(针对特定用户),然后运行该副本并关闭加载器。我有链接到SQL Server的表。我最初有这段代码,但意识到“Access.Application”对象与Access运行时不兼容。我编辑了我的原始帖子,将其包括在内。谢谢,在2003年和2010年都进行了测试。工作很好,但必须将vbHide更改为vbNormalFocus,否则Access窗口将不会显示,除非在任务管理器中显示。这是否也适用于Access运行时?它的行为应与运行时中相应版本的Access中的行为完全相同。我之所以使用vbHide,是因为您在问题中使用了vbHide。如果他没有使用Access用户级安全性,他仍然需要提供/user的工作组信息文件和管理员的路径。这还需要在用户的PATH环境变量中包含exe文件夹。@HansUp这只是我用来创建Ms Access命令行的工具,如果删除对工作组的引用,并且最终删除