代码之家  ›  专栏  ›  技术社区  ›  HumanlyRespectable

不需要的插入行无限循环

  •  1
  • HumanlyRespectable  · 技术社区  · 11 年前

    由于某种原因,当我使用插入行代码时,它会永远插入一个新行!我编写的代码在开始时有一个do while循环,它遍历C列中的所有单元格,当它命中C列中为空的单元格时,一个变量保持单元格编号。

    然后我编写了另一个子程序(当电子表格中的某些内容发生变化时调用),如果在C列的空单元格中写入了某些内容,则插入新行。但它会一直持续下去!

    以下代码位于模块下

    Dim a, count As Integer
    Sub check()
    a = 0
    count = 3
    
    Do While a = 0
        count = count + 1
    
        If Range("C" & count).Value = "" Then
            a = 1
        End If
    Loop
    End Sub
    
    
    Sub addrow()
    
        If Range("C" & count).Value <> "" Then
    
            Range("C" & count).Offset(1).EntireRow.Insert
            count = count + 1
    
             With Range("B" & count, "AL" & count)
                .Borders(xlEdgeLeft).LineStyle = xlContinuous
                .Borders(xlEdgeRight).LineStyle = xlContinuous
                .Borders(xlEdgeBottom).LineStyle = xlContinuous
                .Borders(xlEdgeTop).LineStyle = xlContinuous
                .Borders(xlInsideVertical).LineStyle = xlContinuous
            End With
    
        End If
    
    End Sub
    

    这段代码在工作表下面

    Private Sub Worksheet_Change(ByVal Target As Range)
        addrow
    End Sub
    

    打开工作簿时调用子程序“CHECK”。

    我不知道为什么有无限循环!请帮忙。

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dmitry Pavliv    10 年前

    把你的三明治夹起来 Worksheet_Change 具有的事件 Application.EnableEvents=False/True :

    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        addrow
        Application.EnableEvents = True
    End Sub
    

    原因很简单——当 工作表_更改 事件插入新行,它将更改工作表的内容,触发 工作表_更改 事件再次发生。 工作表_更改 事件再次插入新行,依此类推。无限循环:)

    顺便说一句,最好的做法是使用错误处理(它会返回 Application.EnableEvents = True 即使发生错误 addrow 子程序):

    Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo ErrorHandler
    
        Application.EnableEvents = False
        addrow
    
    ExitHere:
        Application.EnableEvents = True
        Exit Sub
    ErrorHandler:
        Resume ExitHere
    End Sub