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