【问题标题】:Looping through all sheets, getting error at end遍历所有工作表,最后出错
【发布时间】:2016-11-16 15:51:35
【问题描述】:

所以我有一个带有主工作表和从属工作表的工作簿,除此之外(因此选择 = 7 件事)它计算工作表数据部分的每一行和每一列的总数以及所有数据。我有这部分工作,但是当我继续下一步/选项时,将主表的总和与从属表的总和进行比较(加上在发生变化时重新计算每张表的总和或未填写等)我遇到了错误。

它在每张纸上都很好地执行了总计功能,然后在循环结束时似乎遇到了问题。并非本工作簿中的每张表都是数据表,因此不遵循其他表的特定布局。由于这些没有任何特定的顺序,我在我的代码中只是跳过它们。它通过故意捕获因使用不符合其他布局的东西而产生的错误,然后跳到循环的底部来做到这一点。

目前我只有这些额外的一张,我尝试将其取出,但在循环结束时仍然出现错误。奇怪的是,即使我有错误处理,它似乎也没有被它捕获。 k 这里是从属总数的总和,Position 只是一个最大值(我想利用我的所有变量,即使它们在其他功能中并不重要),任何奇数,如 MastLastRow - 6 是为了说明标签和工作表的其他部分不是数据部分,标志部分是确保有人没有意外删除数据。虽然我有多行 GoTo ErrCatch7: 这些只是帮助我跳到底部,并且代码中任何地方应该出现的唯一错误是在点击额外的工作表时。如果您需要进一步说明代码中的内容在做什么,或者需要我发布显示电子表格的图片,请告诉我

ElseIf Fchoice = "7" Then
                k = 0
                Application.Calculation = xlCalculationManual
                Application.ScreenUpdating = False
                Application.DisplayStatusBar = False
                On Error GoTo ErrCatch7:
                MastLastRow = Sheets("Master").Range("A7").CurrentRegion.Rows.Count
                For Each WSCount In Worksheets
                    If WSCount.Name = "Master" Then
                        MastLastCol = Sheets("Master").Range("A5").CurrentRegion.Columns.Count
                        If Sheets("Master").Range("C7").Offset(MastLastRow - 7, 0) = "" Then
                            Sheets("Master").Range("C7").Offset(MastLastRow - 7, 0).EntireRow.ClearContents
                        End If
                        MastLastRow = Sheets("Master").Range("A7").CurrentRegion.Rows.Count
                        j = -1
                        i = 0
                        Set TempM = Range("H7")
                        Do While i < MastLastRow - 6
                            Set TempP = Range(TempM.Offset(0, 1), TempM.Offset(0, MastLastCol))
                            TempM.Value = Application.Sum(TempP)
                            Set TempM = TempM.Offset(1, 0)
                            i = i + 1
                        Loop

                        Do While j < MastLastCol - 8
                            Set TempP = Sheets("Master").Range(TempM.Offset(-1, 0), Sheets("Master").Range("I7").Offset(0, j))
                            TempM.Value = Application.Sum(TempP)
                            Set TempM = TempM.Offset(0, 1)
                            j = j + 1
                        Loop

                        Sheets("Master").Range("H7").Offset(MastLastRow - 6, 0).Font.ColorIndex = 6
                        Sheets("Master").Range("H7").Offset(MastLastRow - 6, 0).Interior.Color = RGB(0, 0, 255)
                        Sheets("Master").Range("H7").Offset(MastLastRow - 6, -1).Value = "Sheet Total"
                        GoTo ErrCatch7:
                    Else
                        Set MastData = Sheets("Master").Range("A7")
                        Set SubordData = WSCount.Range("A7")
                        SubordLastRow = WSCount.Range("A7").CurrentRegion.Rows.Count
                        SubordLastCol = WSCount.Range("A5").CurrentRegion.Columns.Count
                        If WSCount.Range("C7").Offset(SubordLastRow - 7, 0) = "" Then
                            WSCount.Range("C7").Offset(SubordLastRow - 7, 0).EntireRow.ClearContents
                        End If
                        SubordLastRow = WSCount.Range("A7").CurrentRegion.Rows.Count
                        Flag = True
                        If MastLastRow > SubordLastRow Then
                            Position = MastLastRow
                        Else
                            Position = SubordLastRow
                        End If

                        'Check if tasks in subordinate sheet have been mistakenly erased or misformated
                        Do While i < Position And j < Position
                            If MastData.Offset(i, 0).Value = SubordData.Offset(j, 0).Value Then
                                i = i + 1
                                j = j + 1
                            ElseIf MastData.Offset(i, 0).Value = SubordData.Offset(j, 0).Value And MastData.Offset(i, 0).Value = vbNullString Then
                                i = i + 1
                                j = j + 1
                            ElseIf MastData.Offset(i, 0).Value = vbNullString And SubordData.Offset(j, 0).Value <> vbNullString Then
                                i = i + 1
                            ElseIf SubordData.Offset(j, 0).Value = vbNullString And MastData.Offset(i, 0).Value <> vbNullString Then
                                j = j + 1
                            Else
                                Flag = False
                                Exit Do
                            End If
                        Loop
                        If Flag = False Then
                            MsgBox (OrgName + " appears to be missing tasks. This sheet will be ignored. Check for mistakes and compare totals later")
                            GoTo ErrCatch7:
                        End If
                        j = -1
                        i = 0
                        Set TempM = WSCount.Range("H7")
                        Do While i < SubordLastRow - 6
                            Set TempP = WSCount.Range(TempM.Offset(0, 1), TempM.Offset(0, SubordLastCol))
                            TempM.Value = Application.Sum(TempP)
                            Set TempM = TempM.Offset(1, 0)
                            i = i + 1
                        Loop

                        Do While j < SubordLastCol - 8
                            Set TempP = WSCount.Range(TempM.Offset(-1, 0), WSCount.Range("I7").Offset(0, j))
                            TempM.Value = Application.Sum(TempP)
                            Set TempM = TempM.Offset(0, 1)
                            j = j + 1
                        Loop

                        WSCount.Range("H7").Offset(SubordLastRow - 6, 0).Font.ColorIndex = 6
                        WSCount.Range("H7").Offset(SubordLastRow - 6, 0).Interior.Color = RGB(0, 0, 255)
                        WSCount.Range("H7").Offset(SubordLastRow - 6, -1).Value = "Sheet Total"
                    End If
                    k = k + WSCount.Range("H7").Offset(SubordLastRow - 6, 0).Value
    ErrCatch7:
                Next
                Application.Calculation = xlCalculationAutomatic
                Application.ScreenUpdating = True
                Application.DisplayStatusBar = True
                MsgBox ("Master sheet hourly total = " + Sheets("Master").Range("H7").Offset(SubordLastRow - 6, 0).Value + ": Sum of subordinate sheets = " + k)

【问题讨论】:

  • 这是一篇不错的文章,也很长。 :) 但是实际的错误信息是什么,哪一行?
  • “运行时错误 '92' For Loop 未初始化”在下一行

标签: vba excel macros excel-2010


【解决方案1】:

我相信您的问题可能是因为您尝试使用 ErrCatch7 作为错误处理程序。

我建议您将“On Error GoTo ErrCatch7”替换为“On Error GoTo ErrCatch7Err”,然后在程序的最后(在 Exit Sub 或 Exit Function 之后)包含一个部分:

ErrCatch7Err:
    Resume ErrCatch7

编辑:根据 Maciej Los 刚才所说的,您的错误处理程序在 For Next 循环之外以及在其中启用也是一个问题。我建议你使用

    ...
    For Each WSCount In Worksheets
        On Error GoTo ErrCatch7Err
        ...
        ... (other code, including "GoTo ErrCatch7" statements if needed)
        ...
ErrCatch7:
    Next
    On Error GoTo 0
    ...
    Exit Sub
ErrCatch7Err:
    Resume ErrCatch7

如果你想要一个错误处理程序来覆盖

MastLastRow = Sheets("Master").Range("A7").CurrentRegion.Rows.Count

在循环开始之前发生的语句,请使用不同的处理程序。 (在这种情况下,无论如何您都希望执行不同的操作,因此使用相同的处理程序没有实际意义。)

作为使用 ErrCatch7 作为 On Error 条件的目标与使用单独的标签作为目标之间的区别的示例,请考虑以下两个代码示例:

样本 1:

Sub TestMe()
    On Error GoTo ErrCatch7
    For i = 1 To 10
        MsgBox i
        j = i / 0
        MsgBox j
ErrCatch7:
    Next i
End Sub

示例 2:

Sub TestMe()
    On Error GoTo ErrCatch7
    For i = 1 To 10
        MsgBox i
        j = i / 0
        MsgBox j
ErrCatch7:
    Next i
    Exit Sub
ErrCatch7Err:
    Resume ErrCatch7
End Sub

样本 1 将显示数字 1,然后(在处理“1 / 0”错误时)2,然后(在尝试“2 / 0”时)给出除以零错误。

示例 2 将显示从 1 到 10 的所有数字。

【讨论】:

  • 当我这样做时,看起来我进入了一个无限循环。或者让它崩溃的东西
  • 我会试试的。由于我还是 vba 的新手,你能解释一下 GoTo 0 的作用吗?我认为这意味着像转到某事的开头
  • 这似乎解决了我的问题。我还清理了我的代码,所以现在它只是一个错误句柄,而不是跳过其他代码的方法。当它在主表上时,我只是收到一个随机类型不匹配错误,但我很确定我可以解决这个问题,因为这似乎与我的循环无关。感谢您的帮助和建议
【解决方案2】:

MSDN documentation 状态:

你跳到了 For...Next 循环的中间。删除跳转到循环中。 不建议在 For...Next 循环中放置标签。

问题在这里:

           'before loop
            On Error GoTo ErrCatch7:
            MastLastRow = Sheets("Master").Range("A7").CurrentRegion.Rows.Count
            For Each WSCount In Worksheets
            ....
            'jump into the loop is here
       ErrCatch7:
            Next

解决问题的最简单方法是使用F8 键调试程序。

【讨论】:

  • 我将如何忽略我预计会出错的工作表并继续处理其他工作表,而不是在出现错误时停止进程?
  • 如果您预计会出现错误,请使用 if 语句和/或子例程在它捕捉到您之前捕捉它。
【解决方案3】:

正如herehere 的回答:

使用如图所示的代码,您实际上仍然被认为是在 执行下一条语句时的错误处理例程。

这意味着在您之前不允许后续的错误处理程序 从当前恢复。

在您的情况下,更好的架构类似于:

        'before loop
        On Error GoTo ErrCatch7
        MastLastRow = Sheets("Master").Range("A7").CurrentRegion.Rows.Count
        For Each WSCount In Worksheets
        ....
   NextWorksheet:
        Next
        ' the rest of your code

   ErrCatch7:
        Resume NextWorksheet

正如上面的答案中已经提到的,你可以在this site中找到关于这个问题的很好的解释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2011-01-28
    • 2022-01-19
    相关资源
    最近更新 更多