在恢复之前需要访问VBA等待Excel进程完成

时间:2014-05-06 13:22:25

标签: excel vba ms-access ms-office

我有一个Access DB,它具有触发Excel工作簿中刷新的VBA功能。 Excel工作簿由一个正在访问Oracle OBIEE的.iqy文件提供。

根据网络流量,刷新Excel工作簿所需的时间会有所不同。

我在我的VBA模块中的其他位置包含了pause(seconds)函数,这延迟了VBA函数内的执行,但问题是:当网络流量很快时,我无法延迟执行VBA,因为Excel刷新相对较快。当网络流量较慢时,指定的pause()秒数是不够的,程序崩溃。

有没有办法让VBA跟踪Excel中的刷新过程,并在流程结束后继续执行?

到目前为止我的代码如下:

Function import_tblFromIQY()

    Dim Path As String
    Path = CurrentProject.Path & "\"

    Dim rbFileName As String
    rbFileName = "dataPipeline.xls"

    ' If table tblFromIQY exists, then delete.
        If TableExists("tblFromIQY") = True Then
            DoCmd.DeleteObject acTable, "tblFromIQY"
            Debug.Print ">>> Deleted table tblFromIQY"
        End If

    ' Refresh linked table
        Dim appexcel As Excel.Application
        Dim wr As Excel.Workbook
        Dim wrksheet As Excel.Worksheet

        Set appexcel = CreateObject("Excel.Application")
        Set wr = appexcel.workbooks.Open(Path & rbFileName)
        Set wrksheet = appexcel.worksheets("Main Worksheet")

        wr.RefreshAll

        Pause (420) ' pause for 7 mins. this is approx how long it takes for the file to refresh.

        wrksheet.Rows("1:1").Select
        wrksheet.Rows("1:1").Delete Shift:=xlUp
        wr.CheckCompatibility = False
        wr.Save
        wr.CheckCompatibility = True

        appexcel.Visible = False

        wr.Close

        Set wr = Nothing
        Set appexcel = Nothing


    ' Import Data into tblFromIQY

        DoCmd.TransferSpreadsheet TransferType:=acImport, SpreadsheetType:=acSpreadsheetTypeExcel8, tableName:="tblFromIQY", fileName:=Path & rbFileName, _
            HasFieldNames:=True
        Debug.Print ">>> Imported data to tblFromIQY"

End Function

1 个答案:

答案 0 :(得分:2)

经过一段谷歌搜索后,我找到了这个解决方案:

Set wrksheet = appexcel.worksheets("Main Worksheet")
wrksheet.Range("A:BN").QueryTable.Refresh BackgroundQuery:=False

BackgroundQuery上的文档。