我正在开发一个将Excel spreadsheet
连接到Access后端的系统。由于网络中存在符号链接问题,如果用户不首先进入资源管理器并通过单击连接到驱动器,则直接链接到Access后端的电子表格中的查询将失败。
我发现启动文件夹打开对话框的实例,设置为后端数据库的地址有助于建立所需的连接,但是文件夹浏览器窗口打开,然后用户必须关闭,以及也会暂停其后的所有其他流程。
如何使用VBA
关闭文件夹浏览器?我现在搜索了几天,找到了zilch
。
修改:来自评论的代码。
Dim NConnect as FileDialog
Dim NPath as String
Set NConnect = Application.FileDialog(msoFileDialogFolderPicker)
If Len(Dir(NPath)) = 0 Then
With NConnect
.InitialFileName = NPath
.AllowMultiSelect = False
.Show
End With
DoEvents
Application.Wait (Now + Timevalue("00:00:10"))
SendKeys "{ESC}", True
End If
答案 0 :(得分:0)
所以 - 玩过它......
在类似情况下,您通常要做的是在执行第一个函数之前安排第二个函数。使用OnTime
方法,它看起来像这样:
Public Sub OpenFileDialog()
Dim NConnect As FileDialog
Const NPath = "X:\your\path"
Application.OnTime Now + TimeValue("00:00:05"), "SendEscape"
Set NConnect = Application.FileDialog(msoFileDialogFolderPicker)
With NConnect
.InitialFileName = NPath
.AllowMultiSelect = False
.Show
End With
End Sub
Public Sub SendEscape()
Debug.Print "SendEscape"
SendKeys "{ESC}", True
End Sub
但是,这不起作用,because:
当您调用Show方法时,在用户关闭文件对话框之前不再执行任何代码。
因此,使用纯VBA解决方案执行此操作只是不可能 - 打开FileDialog后,没有执行直到关闭为止。
立即窗口显示SendEscape
何时运行。
但是你可以将SendKeys
委托给一个简单的VBScript:
' save as C:\SendEscape.vbs
WScript.Sleep 5000
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "{ESCAPE}"
并且(再次)在打开FileDialog 之前调用此脚本:
Dim NConnect As FileDialog
Const NPath = "X:\your\path"
Shell "wscript C:\SendEscape.vbs"
Set NConnect = Application.FileDialog(msoFileDialogFolderPicker)
With NConnect
.InitialFileName = NPath
.AllowMultiSelect = False
.Show
End With
现在可以使用,因为两个线程(Excel和WScript)并行运行。
请注意,SendKeys
是一种众所周知的不可靠的“远程控制”方法。如果用户在FileDialog打开时点击其他任何地方,ESC将被发送到那里
在生产环境中,我会使用AutoIt。
答案 1 :(得分:0)
好了,经过一天的测试,似乎离开OpenDialog的.Show
建立了与数据库的连接,并且不会中断任何其他程序。
我希望这有助于其他任何人寻找这个问题的解决方案。