运行时错误'1004' - 删除行时对象'_Global'的方法'范围'失败

时间:2016-10-01 15:38:17

标签: excel vba excel-vba

我试图一次删除工作表中的每一个奇数行,但它返回上面的错误

代码:

For icount = endRow To 3 Step -2
    strDelete = strDelete & "," & icount & ":" & icount
Next icount

strDelete = Right(strDelete, Len(strDelete) - 1)
Range(strDelete).Delete shift:=xlUp        '<-- Error

这是strDelete包含的内容

  

7565:7565,7563:7563,7561:7561,7559:7559,7557:7557,7555:7555,7553:7553,7551:7551,7549:7549,7547:7547,7545:7545,7543:7543 ,

     

     

     

     

,29:29,27:27,25:25,23:23,21:21,19:19,17:17,15:15,13:13,11:11,9:9,7: 7,5:5,3:3

我们可以一次删除的行数有限制吗?

2 个答案:

答案 0 :(得分:2)

对于可以删除的行数没有限制,但.Address的{​​{1}}属性可以返回的字符数有限制(或者这种情况通过其索引器)。不是构建字符串,而是使用Range

构建实际范围
Union

答案 1 :(得分:1)

我认为你一直在避免采用Union()方法,因为它耗费时间

或者你可能不是

无论如何 耗费时间,当您要删除大量行时,必须使用Range方法

正如已经指出的那样,限制是要传递给Range()方法的字符串的长度,看起来必须限制在大约250个字符(可能是256 ...)

因此,让我们使用Range方法提供适当缩短的字符串

For icount = endRow To 3 Step -2
    strDelete = strDelete & "," & icount & ":" & icount
Next icount

DeleteAddress Right(strDelete, Len(strDelete) - 1)

Sub DeleteAddress(ByVal address As String)
    Dim arr As Variant
    Dim iArr As Long
    Dim partialAddress As String

    arr = Split(address, ",")
    iArr = LBound(arr)
    Do While iArr < UBound(arr)
        partialAddress = ""
        Do While Len(partialAddress & arr(iArr)) + 1 <= 250 And iArr < UBound(arr)
            partialAddress = partialAddress & arr(iArr) & ","
            iArr = iArr + 1
        Loop
        If Len(partialAddress & arr(iArr)) <= 250 Then
            partialAddress = partialAddress & arr(iArr)
            iArr = iArr + 1
        Else
            partialAddress = Left(partialAddress, Len(partialAddress) - 1)
        End If
        Range(partialAddress).Delete shift:=xlUp
    Loop
End Sub

比使用7k加行的Union()方法快得多