我一直在使用以下命令通过VBA打开另一个MDB Access文件:
Shell "cmd /c " & Chr(34) & strNewFullPath & Chr(34), vbHide
strNewFullPath是MDB文件的完整路径。 使用Access 2010时工作正常,但不能在Access 2003上运行。 如果我在XP DOS终端中运行命令,它就会运行。
我可以使用哪些其他命令可以使用Access Runtime在Access 2003上运行和?
答案 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复制的:
intWindowStyle(整数) 从0到10的数字:
0 - 隐藏窗口并激活另一个窗口 1 - 激活并显示一个窗口。如果窗口最小化或最大化,则系统 将其恢复到原始大小和位置。申请应该 第一次显示窗口时指定此标志 2 - 激活窗口并将其显示为最小化窗口 3 - 激活窗口并将其显示为最大化窗口 4 - 以最近的大小和位置显示窗口。活跃的 窗口仍然有效。
5 - 激活窗口并以当前大小和位置显示窗口 6 - 最小化指定的窗口并激活Z顺序中的下一个顶级窗口 7 - 将窗口显示为最小化窗口。活动窗口保持活动状态 8 - 以当前状态显示窗口。活动窗口保持活动状态 9 - 激活并显示窗口。如果窗口最小化或最大化,系统会将其恢复到原始大小和位置。应用程序应在还原最小化窗口时指定此标志 10 - 根据启动应用程序的程序状态设置show-state。
我不知道此参数的默认值。请注意,有些程序会忽略您设置的任何值(我无法告诉您哪些值)。
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