select一个范围的单元格会导致运行时错误“1004”

我写了一个VBA问题,find被认为是无效的行,将行号保存在一个名为invalidRowsToDelete的数组中,并通过构build无效行的string(例如1:1, 4:4, 7:7 invalidRowsToDelete 1:1, 4:4, 7:7 )。

但是,它有时可以起作用,有时不起作用,但是与大量无效行失败的情况更为一致。

它返回的错误是: “运行时错误'1004':对象'_global'失败的方法范围在线Set rng = Range(invalidRowsToDelete)

 Public rng As Range __________________________ Dim invalidRowsToDelete As String Dim i As Long For i = LBound(InvalidFilesArr) To UBound(InvalidFilesArr) If InvalidFilesArr(i) <> "" Then invalidRowsToDelete = invalidRowsToDelete & InvalidFilesArr(i) & ":" & InvalidFilesArr(i) & "," Else Exit For End If Next i 'Build range statement and delete trailing comma from rowsToDeleteStatement invalidRowsToDelete = "" & Left(invalidRowsToDelete, Len(invalidRowsToDelete) - 1) & "" Debug.Print invalidRowsToDelete Worksheets("Sheet1").Activate Set rng = Range(invalidRowsToDelete) #### Problem line rng.Select rng.Delete 

这已经让我有一段时间了,我不能找出造成这个错误的原因。

谢谢

使用一个string来build立一个复杂的范围参考通常是一个坏主意。 我将使用循环来build立范围,而不是描述范围的string。

 Public rng As Range __________________________ Dim invalidRowsToDelete As String Dim i As Long i = LBound(InvalidFilesArr) Set rng = Worksheets("Sheet1").Rows(InvalidFilesArr(i)) For i = LBound(InvalidFilesArr) + 1 To UBound(InvalidFilesArr) If InvalidFilesArr(i) = "" Then Exit For End If Set rng = Union(rng, Worksheets("Sheet1").Rows(InvalidFilesArr(i))) Next i rng.Delete 

为什么不只是删除那里的行,然后当你find它们?

 Public rng As Range Dim invalidRowsToDelete As String Dim i As Long Worksheets("Sheet1").Activate For i = LBound(InvalidFilesArr) To UBound(InvalidFilesArr) If InvalidFilesArr(i) <> "" Then Set rng = Range(InvalidFilesArr(i) & ":" & InvalidFilesArr(i)) rng.Select rng.Delete Else Exit For End If Next i 

你的string是“坏”; 找出为什么要取代:

 Set rng = Range(invalidRowsToDelete) 

有:

 On Error GoTo GhostBusters Set Rng = Range(invalidRowsToDelete) 

并在底部的包括:

 GhostBusters: MsgBox Len(invalidRowsToDelete) MsgBox invalidRowsToDelete On Error GoTo 0 

使用Union来获取要删除的范围,然后在此范围内调用Delete 。 HTH

 Dim rngToDelete As Range Dim rngRow As Range Dim rowsToDelete(0 To 5) As Long Dim i As Long rowsToDelete(0) = 2 rowsToDelete(1) = 5 rowsToDelete(2) = 7 rowsToDelete(3) = 9 rowsToDelete(4) = 10 rowsToDelete(5) = 12 For i = LBound(rowsToDelete) To UBound(rowsToDelete) Set rngRow = ActiveSheet.Rows(rowsToDelete(i)) If rngToDelete Is Nothing Then Set rngToDelete = rngRow Else Set rngToDelete = Application.Union(rngToDelete, rngRow) End If Next i if Not rngToDelete Is Nothing Then rngToDelete.Delete