Vba 选择单元格范围会引发运行时错误';1004';

Vba 选择单元格范围会引发运行时错误';1004';,vba,excel,Vba,Excel,我正在编写一个VBA问题,它查找被认为无效的行,将行号保存在名为invalidRowsToDelete的数组中,并通过构建无效行的字符串(例如1:1、4:4、7:7)来删除所选行 但是,它有时工作,有时不工作,但在大量无效行的情况下会更加一致地失败 它返回的错误是:运行时错误“1004”:对象“\u global”的方法范围失败“在Set rng=range(invalidRowsToDelete) 公共rng As范围 __________________________ Dim invali

我正在编写一个VBA问题,它查找被认为无效的行,将行号保存在名为
invalidRowsToDelete
的数组中,并通过构建无效行的字符串(例如
1:1、4:4、7:7
)来删除所选行

但是,它有时工作,有时不工作,但在大量无效行的情况下会更加一致地失败

它返回的错误是:运行时错误“1004”:对象“\u global”的方法范围失败“
Set rng=range(invalidRowsToDelete)

公共rng As范围
__________________________
Dim invalidRowsToDelete作为字符串
我想我会坚持多久
对于i=LBound(InvalidFilesArr)到UBound(InvalidFilesArr)
如果无效文件(i)“,则
invalidRowsToDelete=invalidRowsToDelete和InvalidFilesArr(i)和“&InvalidFilesArr(i)和”
其他的
退出
如果结束
接下来我
'生成范围语句并从RowsToDelete语句中删除尾随逗号
invalidRowsToDelete=”“&左(invalidRowsToDelete,Len(invalidRowsToDelete)-1)和“”
调试。打印invalidRowsToDelete
工作表(“表1”)。激活
设置rng=范围(invalidRowsToDelete)#####问题行
rng.选择
rng.删除
这已经困扰了我很长一段时间了,我无法找出它导致这个错误的原因


谢谢

为什么不先删除那里的行,然后在找到它们时再删除呢

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  
公共rng As范围
Dim invalidRowsToDelete作为字符串
我想我会坚持多久
工作表(“表1”)。激活
对于i=LBound(InvalidFilesArr)到UBound(InvalidFilesArr)
如果无效文件(i)“,则
设置rng=范围(无效文件夹(i)和“&无效文件夹(i))
rng.选择
rng.删除
其他的
退出
如果结束
接下来我

使用字符串构建复杂的范围引用通常是个坏主意。我将使用循环来构建范围,而不是描述范围的字符串

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
你的字符串是“坏的”;要了解更换原因,请执行以下操作:

Set rng = Range(invalidRowsToDelete)
与:

在子部分的底部包括:

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

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

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

我的猜测是,虽然我找不到任何支持它的东西,但您的字符串太长,溢出了
range
方法。限制似乎是255。这样做需要小心。删除第5行后,原来的第10行现在是第9行。如前所述,您将删除错误的行。如果将i=LBound(InvalidFilesArr)的
更改为UBound(InvalidFilesArr)
更改为i=UBound(InvalidFilesArr)的
更改为LBound(InvalidFilesArr)步骤-1
GhostBusters:
MsgBox Len(invalidRowsToDelete)
MsgBox invalidRowsToDelete
On Error GoTo 0
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