2017-07-19 79 views
0

我創建了一個程序,該程序在列A或列I中查找要更改的項目。如果列I發生更改,則會刪除該行並將其移至新工作表。如果列A發生更改,則應對所有數據進行排序。但是,當調用第二個Application.Intersect(KeyCells2, Range(Target.Address))時,它錯誤地告訴我我有一個運行時錯誤424.爲什麼會發生這種情況?它似乎有一個關鍵單元格範圍和一個target.address。檢查更改事件時的運行時錯誤424

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim KeyCells As Range 
    Dim KeyCells2 As Range 
    Dim LastRowCompleted As Long 
    Dim RowToDelete As Long 
    Dim CurCell As String 
    RowToDelete = 0 
    LastRow = Sheets("Current").Cells(Sheets("Current").Rows.Count, "A").End(xlUp).Row 
    LastRowCompleted = Sheets("completed").Cells(Sheets("completed").Rows.Count, "A").End(xlUp).Row 
    LastRowCompleted = LastRowCompleted + 1 'Next row after last row 
    Set KeyCells = Range("I3:I16384") 
    Set KeyCells2 = Range("A3:A16384") 
    CurCell = ActiveCell.Address 

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

     'Cut and Paste Row 
     Target.EntireRow.Copy Sheets("completed").Range(LastRowCompleted & ":" & LastRowCompleted) 
     'Mark to delete row 
     RowToDelete = Target.EntireRow.Row 

     Call DeleteRow(RowToDelete) 

    Application.EnableEvents = True 

    End If 

    Range(CurCell).Select 

    If Not Application.Intersect(KeyCells2, Range(Target.Address)) Is Nothing Then 
     Application.EnableEvents = False 

       'Sort 
MsgBox "lastrow completed: " & LastRow 
     Range("A3:Z" & LastRow).Select 
    ActiveWorkbook.Worksheets("current").Sort.SortFields.Clear 
    ActiveWorkbook.Worksheets("current").Sort.SortFields.Add Key:=Range("A3:A" & LastRow) _ 
     , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    ActiveWorkbook.Worksheets("current").Sort.SortFields.Add Key:=Range("B3:B" & LastRow) _ 
     , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    ActiveWorkbook.Worksheets("current").Sort.SortFields.Add Key:=Range("E3:E" & LastRow) _ 
     , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
    With ActiveWorkbook.Worksheets("current").Sort 
     .SetRange Range("A3:J" & LastRow) 
     .Header = xlGuess 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

    Range(CurCell).Select 

    Application.EnableEvents = True 

    End If 

End Sub 

Sub DeleteRow(Row As Long) 
    If Row > 0 Then 
     Rows(Row).EntireRow.Delete Shift:=xlUp 
    End If 
End Sub 
+0

嘗試'如果不是相交(KeyCells2,Target)是Nothing Then',此外,您可以將'行(行).EntireRow.Delete Shift:= xlUp'更改爲'行(行)。刪除Shift:= xlUp' –

+0

@ShaiRado似乎沒有幫助。我仍然得到相同的錯誤。我有一種感覺'Range(Target.Address)'沒有得到值是應該如何。 – Brad

+0

您不需要使用'Range(Target.Address)',因爲'Target'已被定義爲'Range' –

回答

1

如果刪除第If塊的行然後Target不再存在,所以你不能在你的第二個If塊使用它。

作爲修復,您可以在刪除該行後退出Sub。

P.S. - 如果你試圖編輯數據,「自動排序」似乎會非常惱人......