【问题标题】:VBA Error Handling Not workingVBA 错误处理不工作
【发布时间】:2017-12-07 18:08:22
【问题描述】:

我正在编写一个 vba 程序,以根据用户说要通过带有复选框的表单刷新哪些报告来刷新许多报告的电源查询。

这部分代码刷新电源查询,如果刷新不成功,我希望它捕获错误。如果它没有更新,它将更新控制表“未更新”,然后我希望它接下来恢复。

由于某种原因,“On Error Goto Error”没有触发错误行。它仍然抛出错误并停止代码运行。

任何帮助将不胜感激!

For Each cell In 
wsConfig.ListObjects("tblReportstoRun").ListColumns(2).DataBodyRange
    If cell.Value = True Then
        cell.Offset(, 1).Value = Now()
        cell.Offset(, 2).Value = frmSetting.tbStartDate
        cell.Offset(, 3).Value = frmSetting.tbEnddate

        strCurrWS = cell.Offset(0, -1)
        ThisWorkbook.Sheets(strCurrWS).Activate
        Application.StatusBar = "Updating tab " & strCurrWS

            For Each qt In ThisWorkbook.Sheets(strCurrWS).QueryTables
                qt.Refresh BackgroundQuery:=False
            Next qt

            For Each lo In ThisWorkbook.Sheets(strCurrWS).ListObjects
                On Error GoTo Error
                lo.QueryTable.Refresh BackgroundQuery:=False
            Next lo
    Else
 Error:
    cell.Offset(, 4).Value = "Not Updated"
    If InStr(Err.Description, "Permission Error") Then
    cell.Offset(, 6).Value = "Permission Error. Check Credentials"
    Err.Clear
    End If


    End If
Next cell

Set qt = Nothing
Set wks = Nothing

【问题讨论】:

  • Error: 放在子句的末尾,并确保在该语句之前使用Exit Sub。你不应该把它放在IFTHEN 声明中
  • 另外,Error 变量已被使用,我建议将其重命名为 Errhandle

标签: vba excel error-handling powerquery


【解决方案1】:

我认为您希望避免将错误处理作为正常流程的一部分。我不确定您想要的逻辑,但如果您想在 For Each lo... 循环中恢复,请将 Resume Top 替换为 Resume Next

Sub a()

    For Each cell In wsConfig.ListObjects("tblReportstoRun").ListColumns(2).DataBodyRange
Top:

        If cell.Value = True Then
            cell.Offset(, 1).Value = Now()
            cell.Offset(, 2).Value = frmSetting.tbStartDate
            cell.Offset(, 3).Value = frmSetting.tbEnddate

            strCurrWS = cell.Offset(0, -1)
            ThisWorkbook.Sheets(strCurrWS).Activate
            Application.StatusBar = "Updating tab " & strCurrWS

                For Each qt In ThisWorkbook.Sheets(strCurrWS).QueryTables
                    qt.Refresh BackgroundQuery:=False
                Next qt

                For Each lo In ThisWorkbook.Sheets(strCurrWS).ListObjects
                    On Error GoTo ErrorCatch
                    lo.QueryTable.Refresh BackgroundQuery:=False
                Next lo
        Else
            cell.Offset(, 4).Value = "Not Updated"
        End If
    Next cell

    Set qt = Nothing
    Set wks = Nothing
    Exit Sub
ErrorCatch:
    cell.Offset(, 4).Value = "Not Updated"
    If InStr(Err.Description, "Permission Error") Then
        cell.Offset(, 6).Value = "Permission Error. Check Credentials"
    End If
    Resume Top
End Sub

【讨论】:

  • 不能在错误句柄后使用Resume Next返回其余代码吗?
  • @Maldred 是的,我为此在顶部放了一张便条。我不确定 SanomaJean 到底想要什么逻辑。如果您想在For Each lo ... 循环中恢复,Resume Next 将是您的最佳选择。
【解决方案2】:

您应该将Errorhandler 作为代码的结尾,并且永远不要将处理程序命名为“Error

试试……

For Each cell In 
wsConfig.ListObjects("tblReportstoRun").ListColumns(2).DataBodyRange
    If cell.Value = True Then
        cell.Offset(, 1).Value = Now()
        cell.Offset(, 2).Value = frmSetting.tbStartDate
        cell.Offset(, 3).Value = frmSetting.tbEnddate

        strCurrWS = cell.Offset(0, -1)
        ThisWorkbook.Sheets(strCurrWS).Activate
        Application.StatusBar = "Updating tab " & strCurrWS

            For Each qt In ThisWorkbook.Sheets(strCurrWS).QueryTables
                qt.Refresh BackgroundQuery:=False
            Next qt

            For Each lo In ThisWorkbook.Sheets(strCurrWS).ListObjects
                On Error GoTo Errorhandle
                lo.QueryTable.Refresh BackgroundQuery:=False
            Next lo
Next cell

Set qt = Nothing
Set wks = Nothing

Exit Sub

Errorhandle:
    cell.Offset(, 4).Value = "Not Updated"
    If InStr(Err.Description, "Permission Error") Then
        cell.Offset(, 6).Value = "Permission Error. Check Credentials"
        Err.Clear
    End If

【讨论】:

  • 关于这个的问题,如果没有错误,这段代码在代码末尾是否仍然没有运行?
  • @SanomaJean 我的道歉!错过了Exit Sub的添加,请参考编辑
  • 哦,刚刚看到您对另一篇文章的评论!谢谢你的工作!
  • @SanomaJean 很高兴我能帮上忙! :) 如果这回答了您的问题,请标记为已回答
  • @SanomaJean Sobigen,证明了一个有效的观点。如果你想在错误后继续你的代码,我建议使用他的方法;因为我的一旦收到错误就会简单地退出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多