使用工作排程重新整理Excel查询

eulz3vhy  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(111)

我正在尝试在MS Office Professional Plus 2016中自动刷新查询。
我有一个运行vbs脚本的cmd脚本,而vbs脚本又运行Excel宏。如果我手动运行它,一切都正常。当我设置Windows任务计划程序并选择选项**“无论用户是否登录都运行”**时,出现问题。
我的宏正在将查询结果日志保存到文本文件中,以便我可以确定代码中断的位置。在我看来,Excel在与任务计划程序一起运行时显示了一个警告框(或类似的内容)。我无法确定希望用户执行什么操作,因为计划程序隐藏了所有警告。如果手动运行cmd脚本,或通过任务计划程序使用“仅当用户登录时运行”选项运行,则没有警告/提示。
这是我的RefreshQueries()子函数。我试着注解代码,并确认中断整个自动化的那一行是With iTable.QueryTable中的.Refresh

Private Sub RefreshQueries()
    AddToLogFile ("Hello from subroutine RefreshQueries().")

    Dim iWorksheet As Excel.Worksheet
    Dim iTable As Excel.ListObject

    'Check each worksheet.
    For Each iWorksheet In Excel.ActiveWorkbook.Worksheets
        AddToLogFile ("For-loop for iWorksheet " & iWorksheet.Name)

        'Check all Objects if it is a query object.
        For Each iTable In iWorksheet.ListObjects
            If iTable.SourceType = Excel.XlListObjectSourceType.xlSrcQuery Then
                AddToLogFile ("Trying to refresh iTable: " & iTable.Name)
                QueryTimeStart = Timer

                On Error Resume Next
                With iTable.QueryTable 'Refresh the query data.
                    .BackgroundQuery = False 
                    .EnableRefresh = True
                    .Refresh
                End With

                If Err.Number <> 0 Then
                    QueryRunTime = CalculateRunTime("QueryRunTime") 'Stop timer and get the duration.
                    Call AddToHtmlErrorTable(iTable.Name, Err.Number, Err.Description, QueryRunTime) 'Add entry to error table.
                    AddToLogFile ("Query in iTable " & iTable.Name & " failed. Description: " & Err.Description)
                    NumberOfFailedQueries = NumberOfFailedQueries + 1 'IMPORTANT: increment must be after updating html error table!
                    Err.Clear 'Clear errors between for loops.
                Else
                    NumberOfSuccessfulQueries = NumberOfSuccessfulQueries + 1
                    AddToLogFile ("Query in iTable " & iTable.Name & " successfully refreshed.")
                End If

            End If
        Next iTable
    Next iWorksheet

    AddToLogFile ("Exiting subroutine RefreshQueries().")
End Sub

我猜我的问题如下:
1.我们是否能够以某种方式捕获Excel在后台显示的提示符(如果手动运行,则不会弹出任何提示符),或者
1.我们是否可以自动确认Excel中显示的任何消息(不知道它是什么),或者
1.是否有任何已知的设置会在没有任何确认的情况下执行连接。
有人对此问题有什么想法、经验或建议吗?

hc2pp10m

hc2pp10m1#

您需要像here所描述的那样将错误捕获器添加到VBA例程中

Private Sub RefreshQueries()
On Error Goto MyError

' .... All your code

Exit sub
MyError: 
'Do your magic here with Err.object to log the event or whatever
AddToLogFile ("#Error in RefreshQueries().:" & Err.Discription)
Resume Next
End Sub

相关问题