首页 > 解决方案 > VBA 错误 1004 选择工作表范围失败

问题描述

当在“M”列中写入“X”时,我想将我的工作表的一部分复制到另一张工作表:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim triggercells    As Range
Dim lastrow         As Long
    
Set triggercells = Range("M1:M100")

If Not Application.Intersect(triggercells, Range(Target.Address)) Is Nothing Then
           
    If Target.Value = "X" Or Target.Value = "x" Then
        ThisWorkbook.Worksheets("Offen").Range(Cells(Target.Row, 1), Cells(Target.Row, 13)).Select ' select part of changed row
        Selection.Copy
        
        ThisWorkbook.Worksheets("Erledigt").Visible = True 'unhide sheet
        ThisWorkbook.Worksheets("Erledigt").Select

            lastrow = (ThisWorkbook.Sheets("Erledigt").Cells(Rows.Count, 1).End(xlUp).Row) + 1 'get last emty row
            

但把我扔在这里:

            ThisWorkbook.Worksheets("Erledigt").Range(Cells(lastrow, 1), Cells(lastrow, 13)).Select ' select part of row to paste to
                Selection.Paste
                
        ThisWorkbook.Worksheets("Offen").Select 'select sheet
        ThisWorkbook.Worksheets("Erledigt").Visible = False 'hide sheet
        Application.CutCopyMode = False
        
    End If
    
End If

End Sub

与所述运行时错误。

标签: excelvba

解决方案


该错误是因为Cells(lastrow, 1)没有将 ActiveSheet“Erledigt”作为父级,而是将事件代码所在的工作表作为父级。所以 theRange和 theCells有不同的父母......要拥有相同的父母工作表,应该通过重写这部分来明确指出: Range(Cells(lastrow, 1), Cells(lastrow, 13)).Select

对此:

With ThisWorkbook.Worksheets("Erledigt")
    .Range(.Cells(lastrow, 1), .Cells(lastrow, 13)).Select
End With

一般来说,如何避免在 Excel VBA 中使用 Select是一个好主意,但这是下一个级别。


推荐阅读