Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 带有target.address的无限循环_Excel_Ms Access_Vba - Fatal编程技术网

Excel 带有target.address的无限循环

Excel 带有target.address的无限循环,excel,ms-access,vba,Excel,Ms Access,Vba,我正在创建一个小程序,它将在“当前”页的第I列中查找更改。如果发现更改,它将剪切整个列,并将其粘贴到工作表“已完成”的最后一行。似乎当它进行剪切时,它陷入了一个无限循环,导致它永远不会击中“成功”的消息框。我怎样才能重新证明该地址的合理性,从而避免这个问题 Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Dim LastRowCompleted As Long LastRo

我正在创建一个小程序,它将在“当前”页的第I列中查找更改。如果发现更改,它将剪切整个列,并将其粘贴到工作表“已完成”的最后一行。似乎当它进行剪切时,它陷入了一个无限循环,导致它永远不会击中“成功”的消息框。我怎样才能重新证明该地址的合理性,从而避免这个问题

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Dim LastRowCompleted As Long
    LastRowCompleted = Sheets("completed").Cells(Sheets("completed").Rows.Count, "A").End(xlUp).Row
    LastRowCompleted = LastRowCompleted + 1 'Next row after last row

    Set KeyCells = Range("I:I")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then

        MsgBox "Cell " & Target.Address & " has changed."
        MsgBox Range(Target.Address).Row
        MsgBox Range(Target.Address).Column

        'Cut and Paste Row
        Range(Range(Target.Address).Row & ":" & Range(Target.Address).Row).Cut Sheets("completed").Range(LastRowCompleted & ":" & LastRowCompleted)
        MsgBox "Made it."
    End If
End Sub

如果要更改代码中的单元格内容,则使用“工作表更改事件”始终禁用事件,否则每次更改工作表时都会重复触发更改事件

要禁用事件,请使用代码开头的以下行

Application.EnableEvents = False
最后不要忘记启用事件,否则任何事件代码都不会自动触发

要启用事件,请在End Sub之前使用以下行

Application.EnableEvents = True
所以你的代码应该是这样的

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Dim LastRowCompleted As Long
    LastRowCompleted = Sheets("completed").Cells(Sheets("completed").Rows.Count, "A").End(xlUp).Row
    LastRowCompleted = LastRowCompleted + 1 'Next row after last row

    Set KeyCells = Range("I:I")
    Application.EnableEvents = False
    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then

        MsgBox "Cell " & Target.Address & " has changed."
        MsgBox Range(Target.Address).Row
        MsgBox Range(Target.Address).Column

        'Cut and Paste Row
        Range(Range(Target.Address).Row & ":" & Range(Target.Address).Row).Cut Sheets("completed").Range(LastRowCompleted & ":" & LastRowCompleted)
        MsgBox "Made it."
    End If
    Application.EnableEvents = True
End Sub

如果要更改代码中的单元格内容,则使用“工作表更改事件”始终禁用事件,否则每次更改工作表时都会重复触发更改事件

要禁用事件,请使用代码开头的以下行

Application.EnableEvents = False
最后不要忘记启用事件,否则任何事件代码都不会自动触发

要启用事件,请在End Sub之前使用以下行

Application.EnableEvents = True
所以你的代码应该是这样的

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Dim LastRowCompleted As Long
    LastRowCompleted = Sheets("completed").Cells(Sheets("completed").Rows.Count, "A").End(xlUp).Row
    LastRowCompleted = LastRowCompleted + 1 'Next row after last row

    Set KeyCells = Range("I:I")
    Application.EnableEvents = False
    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then

        MsgBox "Cell " & Target.Address & " has changed."
        MsgBox Range(Target.Address).Row
        MsgBox Range(Target.Address).Column

        'Cut and Paste Row
        Range(Range(Target.Address).Row & ":" & Range(Target.Address).Row).Cut Sheets("completed").Range(LastRowCompleted & ":" & LastRowCompleted)
        MsgBox "Made it."
    End If
    Application.EnableEvents = True
End Sub
旁注:
Range(Range(Target.Address)。Row&“:”&Range(Target.Address)。Row)。Cut
可以简单地编写
Target.EntireRow.Cut
旁注:
Range(Range(Target.Address)。Row&“:”&Range(Target.Address)。Row)。Cut
可以简单地编写
Target.EntireRow.Cut