2016-07-22 32 views
-2

如何在MS Access的shell语句中运行以下代码?在VBA中运行批处理代码以在运行模式下打开特定的Access数据库文件

"C:\Program Files (x86)\Microsoft Office\Office14\msaccess.exe" "http://stoneplastics/Departments/Quality/Databases/LabelsNewRelease.accdb" /runtime 

它正常工作,在一个批处理文件。 我试了3个小时才得到这个工作,我有麻烦

+0

看看这个VBA过程:http://stackoverflow.com/questions/37822050/cant-run-dir-from-wscript-shell-in-vba – Tim

+0

我想通了。我确实检查了它,但没有奏效。 –

回答

2

因为要根据接入会话中运行VBA代码,你可以使用SysCmd(acSysCmdAccessDir)来确定MSACCESS.EXE所在的文件夹。这意味着您不必为多个Access版本和32位与64位路径硬编码文件路径,然后使用Dir()来检查MSACCESS.EXE是否存在那里。

这里是从即时窗口会工作的例子在Access 2010:

strExe = SysCmd(acSysCmdAccessDir) & "MSACCESS.EXE" 
strDb = "C:\share\Access\Database2.accdb" 

strCommandLine = """" & strExe & """ """ & strDb & """ /runtime" 
Debug.Print strCommandLine 
"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "C:\share\Access\Database2.accdb" /runtime 

Shell strCommandLine, vbMaximizedFocus 

当你适应,作为一个VBA程序,它会比你现在有什么简单。而且它更灵活,因为您无需指定在哪里可以找到MSACCESS.EXE;这是在运行时自动发现的。

+1

我用你的代码,它像一个时钟。这不仅对新版本的访问打击市场变化的目录时有好处,而且还改善了性能。非常感谢你 :) –

0

我想通了。这是我使用的代码。 (请注意,我改变了Access数据库文件。

If Not Len(Dir("C:\Program Files\Microsoft Office\Office12\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files\Microsoft Office\Office12\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files\Microsoft Office\Office14\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files\Microsoft Office\Office14\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files\Microsoft Office\Office11\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files\Microsoft Office\Office11\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files\Microsoft Office\Office15\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files\Microsoft Office\Office15\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files (x86)\Microsoft Office\Office14\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files (x86)\Microsoft Office\Office14\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files (x86)\Microsoft Office\Office12\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files (x86)\Microsoft Office\Office12\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files (x86)\Microsoft Office\Office15\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files (x86)\Microsoft Office\Office15\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files (x86)\Microsoft Office\Office11\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files (x86)\Microsoft Office\Office11\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
If Not Len(Dir("C:\Program Files\Microsoft Office 15\root\office15\msaccess.exe", vbDirectory)) = 0 Then 
Call Shell(Chr$(34) & "C:\Program Files\Microsoft Office 15\root\office15\msaccess.exe" & Chr$(34) & " " & Chr$(34) & "http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb" & Chr$(34) & " /runtime", vbMaximizedFocus) 
End If 
+0

VBA代码是否会在Access会话中运行? – HansUp

+0

是的。它将运行在一个私人分 –

0

不知道你是如何计算“它不工作”当你将命令传递到外壳像dbmitch的回答后,并像dbmitch在演示用引号括起来这个帖子,但很高兴你得到它的工作。:)

另外,因为定位每一个可能的路径访问显然是一个要求,为什么不直接使用迪尔找到它呢?由于Office16(32位)路径为“\ Program Files(x86)\ Microsoft Office \ root \ Office16 \ MSACCESS.EXE”,Office 17可能会有所不同,这将有助于防止错误并验证您的代码。如果你创建一个Shell对象并调用.Exec方法,你可以得到Command的DIR函数的输出(不是VBA的DIR函数...... 2个非常不同的野兽!)。这将是访问的路径。这还可以防止用户将Access/Office安装在默认位置以外的任何错误。

Dim oShell As Object 'New WshShell 
Dim cmd As Object 'WshExec 
Dim strPath as String 'Path to Access 
Const WshRunning = 0 

On Error GoTo wshError 

Set oShell = CreateObject("Wscript.Shell") 
'Note the two double quotes "". This causes VBA to insert one double quote. 
'Its a little cleaner than " & Chr$(34) & " 
'http://stackoverflow.com/questions/9024724/how-do-i-put-double-quotes-in-a-string-in-vba/38456820 
Set cmd = oShell.Exec("cmd /c ""dir c:\*MSACCESS.EXE /a:-d /b /d /s""") 
Do While cmd.Status = WshRunning 
    'Do nothing 
    DoEvents 
Loop 

strPath = cmd.StdOut.ReadAll 
If strPath="" Then 
    MsgBox "Access was not found." 
    Exit Sub 
End If 

'We now have the path to Access so pass it to shell like you've done 
Call Shell("""" & strPath & """" & _ 
    " ""http://stoneplastics/Departments/Quality/Databases/ItemInspectionInstructionPrintOutRev3.accdb"" /runtime" _ 
    , vbMaximizedFocus) 

Set oShell = Nothing 
Set cmd = Nothing 
Exit sub 

wshError: 
On Error Resume Next 
Msgbox cmd.StdErr.ReadAll 
Resume Next 
+0

我更喜欢你的答案。我认为,当涉及到dbmitch的解决方案时,我无法获得适当的语法。当我们升级时,我会给解决方案一个:) –