Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 运行时错误';1004';-方法';范围';对象的'_全球';删除行时失败_Vba_Excel - Fatal编程技术网

Vba 运行时错误';1004';-方法';范围';对象的'_全球';删除行时失败

Vba 运行时错误';1004';-方法';范围';对象的'_全球';删除行时失败,vba,excel,Vba,Excel,我试图一次删除工作表中的每一个奇数行,但它返回上述错误 代码: 对于icount=endRow到第3步-2 strDelete=strDelete&“,”&icount&“:”&icount 下一个icount strDelete=右侧(strDelete,Len(strDelete)-1) 范围(strDelete).Delete shift:=xlUp'可以删除的行数没有限制,但是范围的.Address属性可以返回的字符数有限制(或者在本例中通过其索引器)。不要构建字符串,而是使用联合构建一

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

代码:

对于icount=endRow到第3步-2
strDelete=strDelete&“,”&icount&“:”&icount
下一个icount
strDelete=右侧(strDelete,Len(strDelete)-1)

范围(strDelete).Delete shift:=xlUp'可以删除的行数没有限制,但是
范围
.Address
属性可以返回的字符数有限制(或者在本例中通过其索引器)。不要构建字符串,而是使用
联合构建一个实际范围

Dim toDelete As Range
For i = endRow To 3 Step -2
    If toDelete Is Nothing Then
        Set toDelete = Rows(i)
    Else
        Set toDelete = Union(toDelete, Rows(i))
    End If
Next
toDelete.Delete shift:=xlUp

可以删除的行数没有限制,但是
范围
.Address
属性可以返回的字符数有限制(或者在本例中通过其索引器)。不要构建字符串,而是使用
联合构建一个实际范围

Dim toDelete As Range
For i = endRow To 3 Step -2
    If toDelete Is Nothing Then
        Set toDelete = Rows(i)
    Else
        Set toDelete = Union(toDelete, Rows(i))
    End If
Next
toDelete.Delete shift:=xlUp

我认为您一直在避免使用
Union()
方法,因为它非常耗时

也许你还没去过

无论如何,这是很耗时的,当您有如此多的行要删除时,您必须使用
范围
方法

如前所述,限制是传递给
Range()
方法的字符串长度,似乎必须限制在250个字符左右(可能是256个…)

因此,让我们使用范围方法来适当缩短字符串

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
对于icount=endRow到第3步-2
strDelete=strDelete&“,”&icount&“:”&icount
下一个icount
删除地址权限(strDelete,Len(strDelete)-1)
子删除地址(ByVal地址作为字符串)
作为变体的Dim-arr
暗淡如长
Dim partialAddress作为字符串
arr=拆分(地址“,”)
iArr=LBound(arr)
当iArrDo While Len(partialAddress&arr(iArr))+1我认为您一直在避免使用
Union()
方法,因为它很耗时

也许你还没去过

无论如何,这是很耗时的,当您有如此多的行要删除时,您必须使用
范围
方法

如前所述,限制是传递给
Range()
方法的字符串长度,似乎必须限制在250个字符左右(可能是256个…)

因此,让我们使用范围方法来适当缩短字符串

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
对于icount=endRow到第3步-2
strDelete=strDelete&“,”&icount&“:”&icount
下一个icount
删除地址权限(strDelete,Len(strDelete)-1)
子删除地址(ByVal地址作为字符串)
作为变体的Dim-arr
暗淡如长
Dim partialAddress作为字符串
arr=拆分(地址“,”)
iArr=LBound(arr)
当iArr当Len(partialAddress&arr(iArr))+1是的,联盟很耗时,我会试试这个。谢谢没有更快的方法吗?像Rows(strDelete).Entirerow.Delete?我看到你为“最快”的东西写了一篇新文章。检查后我的答案第二个解决方案!至于这篇文章,请关闭它:或者选择一个答案,或者告诉回答者他们的答案没有解决问题的原因。是的,联盟很耗时,我会试试这个。谢谢没有更快的方法吗?像Rows(strDelete).Entirerow.Delete?我看到你为“最快”的东西写了一篇新文章。检查后我的答案第二个解决方案!对于这篇文章,关闭它:要么选择一个答案,要么告诉回答者他们的答案没有解决问题的原因