【问题标题】:Code execution has been interrupted代码执行被中断
【发布时间】:2016-07-30 04:07:38
【问题描述】:

在 Excel VBA 中,我遇到了一个“错误”,该错误会停止宏,并显示一条消息“代码执行已被中断”。我在引用中写了错误,因为当我选择调试并检查提示错误的代码行时,我发现它在逻辑上是合理的。

我最初在On Error GoTo 0 遇到了错误。当我注释掉错误周围的一个块时,我会得到一个产生相同错误的新行。而且,再次,当我在调试模式下检查它时,新的“错误”在逻辑上是合理的。这是确切的行:

If rRange.Row <> 3 And rRange.Row <> 17 Then

仅供参考,在这种情况下 rRange.Row = 3,所以它不应该产生错误。

为什么会发生这种情况,我该如何解决?

更新代码现在在End Sub 行产生错误。

这是失败的部分:

Sub Review()

Dim WorkRange As Range
Dim FoundCells As Range
Dim Cell As Range
Dim a As String
Dim policy As String
Dim rRange As Range


Set RR = Sheets("Ready for Review")
Set OG = ActiveSheet

OG.Unprotect ("Password")

RR.Activate

On Error Resume Next

Application.DisplayAlerts = False

    Set rRange = Application.InputBox(Prompt:= _
        "Please select POLICY to review.", _
            Title:="SPECIFY POLICY", Type:=8)

On Error GoTo 0
    Application.DisplayAlerts = True
        If rRange.Row <> 3 And rRange.Row <> 17 Then

            MsgBox "Value other than a POLICY was selected. Select the cell that contains the correct policy number."

        Exit Sub

        Else
            policy = rRange.Value
        End If

Application.ScreenUpdating = False

OG.Cells(12, 2).Locked = False

Set WorkRange = OG.UsedRange
For Each Cell In WorkRange
    If Cell.Locked = False Then
        col1 = Cell.Column
        Row = Cell.Row
        a = OG.Cells(Row, 1)

        If Not a = "" Then
            row2 = Application.WorksheetFunction.Match(a, RR.Range("A:A"), 0)

            Cell.Value = RR.Cells(row2, rRange.Column + col1 - 2)
        End If

    End If
Next Cell

OG.Unprotect ("Password")

OG.Cells(33, 3).Locked = False

If (Right(OG.Cells(5, 2), 2) = "UL" Or Right(OG.Cells(5, 2), 2) = "IL" Or Right(OG.Cells(5, 2), 2) = "PL") Then
    With OG.Cells(33, 3)
        .Value = "=IF(INDEX(B:B,MATCH(""Total*"",A:A,0))="""",0,INDEX(B:B,MATCH(""Total*"",A:A,0)))-SUM(C34:C37)"
        .Locked = True
    End With

    ElseIf Right(OG.Cells(5, 2), 2) = "WL" Then
    With OG.Cells(33, 3)
        .Value = "=IF(INDEX(B:B,MATCH(""Total*"",A:A,0))="""",0,INDEX(B:B,MATCH(""*"",A:A,0))) - IFERROR(INDEX(C34:C37,MATCH(""Additional"",B34:B37, 0)),0) - IFERROR(INDEX(C34:C37,MATCH(""Paid"",B34:B37,0)),0) - IFERROR(INDEX(C34:C37,MATCH(""Additional Agreement - SPPUA"",B34:B37, 0)),0) - IFERROR(INDEX(C34:C37,MATCH(""Flexible Agreement - FLXT10/20"",B34:B37, 0)),0)"
        .Locked = True
    End With

    Else
    With OG.Cells(33, 3)
        .Value = "=IF(INDEX(B:B,MATCH(""Total*"",A:A,0))="""",0,INDEX(B:B,MATCH(""*"",A:A,0)))"
        .Locked = True
End With

End If

OG.Activate


Cells(Application.WorksheetFunction.Match("Last Month Paid ($)", Range("A:A"), 0), 2).NumberFormat = "$#,##0.00;[Red]$#,##0.00"

OG.Protect ("Password")

Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 您需要向我们展示更多代码来帮助您。
  • 这是一个很长的程序,我不确定哪些部分会提供信息。如果您能告诉我在哪里查看,例如我使用错误处理或锁定/解锁单元格的块,我很乐意分享。
  • 在不知道您的代码是/做什么的情况下,我不可能知道您应该发布什么。您可以从失败的例程开始。
  • setsrRange 的部分可能有用。
  • 问题已更新。

标签: excel vba


【解决方案1】:

哦,这让我想起了。我想我在大约 10 年前的 Excel 2003 中曾经遇到过这个错误?可能是?。 Excel 会让自己陷入某种状态。代码没有任何问题,只是它会不断返回该错误。

如果您关闭 Excel 保存您的工作,然后重新打开,错误会消失吗? 如果我没记错的话,这是我调用一些外部 API 时引起的。也许您的其他 API 调用会导致此错误,但此时会出现......也许。

抱歉,那是 10 多年前的事了 :)

【讨论】:

  • 仍然不确定为什么,但这确实有效。如果有人能找到正确的解释,请分享。谢谢!
【解决方案2】:

即使您经历过,您也可能需要考虑对您发布的代码进行以下“重新设计”

Option Explicit

Sub Review()

Dim Cell As Range, rRange As Range
Dim a As String
Dim RR As Worksheet, OG As Worksheet

    Set RR = Sheets("Ready for Review")
    Set OG = ActiveSheet

    OG.Unprotect ("Password")

    Set rRange = GetUserInpt(RR)
    If rRange Is Nothing Then
        MsgBox "You aborted the POLICY selection" _
                & vbCrLf & vbCrLf _
                & "the procedure ends" _
                , vbInformation
        Exit Sub
    End If


    Application.ScreenUpdating = False

    OG.Cells(12, 2).Locked = False

    For Each Cell In OG.UsedRange
        With Cell
            If Not .Locked Then
                a = OG.Cells(.row, 1)
                If Not a = "" Then .value = RR.Cells(CLng(Application.WorksheetFunction.Match(a, RR.Range("A:A"), 0)), _
                                                     rRange.Column + .Column - 2)
            End If
        End With
    Next Cell


    With OG.Cells(33, 3)
       .Locked = False
        Select Case Right(OG.Cells(5, 2), 2)
            Case "UL", "IL", "PL"
                .Formula = "=IF(INDEX(B:B,MATCH(""Total*"",A:A,0))="""",0,INDEX(B:B,MATCH(""Total*"",A:A,0)))-SUM(C34:C37)"            
            Case "WL"
                .Formula = "=IF(INDEX(B:B,MATCH(""Total*"",A:A,0))="""",0,INDEX(B:B,MATCH(""*"",A:A,0))) - IFERROR(INDEX(C34:C37,MATCH(""Additional"",B34:B37, 0)),0) - IFERROR(INDEX(C34:C37,MATCH(""Paid"",B34:B37,0)),0) - IFERROR(INDEX(C34:C37,MATCH(""Additional Agreement - SPPUA"",B34:B37, 0)),0) - IFERROR(INDEX(C34:C37,MATCH(""Flexible Agreement - FLXT10/20"",B34:B37, 0)),0)"            
            Case Else
                .value = "=IF(INDEX(B:B,MATCH(""Total*"",A:A,0))="""",0,INDEX(B:B,MATCH(""*"",A:A,0)))"
        End Select
        .Locked = True
    End With

    OG.Activate

    Cells(Application.WorksheetFunction.Match("Last Month Paid ($)", Range("A:A"), 0), 2).NumberFormat = "$#,##0.00;[Red]$#,##0.00"

    OG.Protect ("Password")

    Application.ScreenUpdating = True

End Sub


Function GetUserInpt(sht As Worksheet) As Range
Dim rRange As Range

    Application.DisplayAlerts = False
    sht.Activate
    On Error GoTo InputBoxCanceled
    Do While rRange Is Nothing
        Set rRange = Application.InputBox(Prompt:="Please select POLICY to review.", _
                                          Title:="SPECIFY POLICY", _
                                          Default:=sht.Cells(3, 1).Address, _
                                          Type:=8)

        If rRange.Parent.Name <> sht.Name Then
            MsgBox "You must select a cell in '" & sht.Name & "' sheet"
            sht.Activate
            Set rRange = Nothing
        Else
            If rRange.row <> 3 And rRange.row <> 17 Then
                MsgBox "Value other than a POLICY was selected" _
                       & vbCrLf & vbCrLf _
                       & "Select the cell that contains the correct policy number" _
                       , vbCritical
                Set rRange = Nothing
            End If
        End If
    Loop
    Set GetUserInpt = rRange

InputBoxCanceled:
    On Error GoTo 0
    Application.DisplayAlerts = True

End Function

主要修订适用于:

  • 添加了GetUserInpt 函数来处理策略选择

    这个函数:

    • 同时检查正确的选择行和工作表(因为用户可能在选择期间切换到另一个工作表!)

    • 循环运行,直到用户选择合适的单元格

    • 在用户取消 InputBox 时退出选择,这是唯一的循环转义可能性

  • 在这里和那里做了一些简化,例如:

    • 除非确实需要,否则删除 Activate 语句

    • 将变量数量减少到仅(几乎)严格需要的变量

    • 添加了一些 With ... End 带有块以增加可读性

    • 使用 Select Case 块而不是 If ... Then ... Else if ... Else ... End if 块,再次提高可读性

    • .Value 更改为 .Formula,以获得正确的语法

以上所有内容都可以帮助您完成这个项目以及未来的项目

【讨论】:

  • 谢谢!这是我第一次尝试宏(大约一年前),从那以后我学到了很多你提到的简化,但我真的很喜欢你分享的 GetUserInpt 函数。我认为这是我可以充分利用的东西。再次感谢您!
  • 不客气。如果您发现我的回答有用,您可能想要投票...干杯
猜你喜欢
  • 1970-01-01
  • 2013-12-09
  • 2015-11-06
  • 1970-01-01
  • 2017-08-20
  • 2018-06-18
  • 2011-11-20
  • 2019-01-21
  • 1970-01-01
相关资源
最近更新 更多