以编程方式关闭FileDialog

时间:2015-12-05 05:32:21

标签: excel vba excel-vba access-vba

我正在开发一个将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

2 个答案:

答案 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建立了与数据库的连接,并且不会中断任何其他程序。

我希望这有助于其他任何人寻找这个问题的解决方案。