Excel 射程限制难题

Excel 射程限制难题,excel,vba,Excel,Vba,我可以通过VBA在某个范围内选择的内容是否有一些限制?基本上,我发现如果在循环中隐藏整行,如果有很多行要隐藏,则需要相当长的时间 ex)-隐藏列a中没有值的任何行 For i = 1 to 600 With Range("A" & i) If .value = vbEmpty then .EntireRow.Hidden = True End With Next 更快捷的方法是创建一个引用这些行的单个范围,然后执行单个“.entirerow.hidden

我可以通过VBA在某个范围内选择的内容是否有一些限制?基本上,我发现如果在循环中隐藏整行,如果有很多行要隐藏,则需要相当长的时间

ex)-隐藏列a中没有值的任何行

For i = 1 to 600
    With Range("A" & i)
        If .value = vbEmpty then .EntireRow.Hidden = True
    End With
Next
更快捷的方法是创建一个引用这些行的单个范围,然后执行单个“.entirerow.hidden=true”语句。是的,我已经设置了application.screenUpdate=false

我遇到的问题是,如果范围的字符串引用太长,它就会失败

下面的代码声明了一个函数,该函数既接受一个标准的行号数组(如果数组是在手之前创建的),也接受参数参数(如果您不想在手之前声明数组,并且行列表很小)。然后,它创建一个用于范围引用的字符串

Function GetRows(argsArray() As Long, ParamArray args() As Variant) As Range

    Dim rngs As String
    Dim r

    For Each r In argsArray
        rngs = rngs & "," & r & ":" & r
    Next
    For Each r In args
        rngs = rngs & "," & r & ":" & r
    Next

    rngs = Right(rngs, Len(rngs) - 1)
    Set GetRows = Range(rngs)

End Function
Function dfdfd()

    Dim selList(50) As Long, j As Long
    For i = 1 To 100
        If i Mod 2 = 1 Then
            selList(j) = i
            j = j + 1
        End If
    Next
    selList(50) = 101
    GetRows(selList).Select

End Function
第二个函数“dfd”只是用来举例说明它何时失败。若要查看它何时起作用,只需创建一个包含-5项的新数组,然后进行尝试。它起作用了

最终(?)更新:

结果:

接头(行高:0.109375秒

Union(隐藏行):0.625秒

我认为您在这里寻找的神奇功能是Union()。它内置于Excel VBA中,请查看有关它的帮助。它正是您所期望的

在你的范围内循环,但不要构建字符串,而是构建一个多区域范围。然后你可以一次选择或设置整个范围的属性


我不知道你可以在一个范围内建立的区域数量限制是多少(如果有的话),但它大于600。我不知道什么(如果有的话)选择或设置多区域范围的属性也有限制,但可能值得一试。

更快的选择可能是使用SpecialCells属性查找空白,然后隐藏行:

Sub HideRows()

    Dim rng As Range

    Set rng = ActiveSheet.Range("A1:A600")
    Set rng = rng.SpecialCells(xlCellTypeBlanks)
    rng.EntireRow.Hidden = True

End Sub

我认为,这只适用于UsedRange中的单元格。

如果将RowHeight属性设置为0,则可以获得较小的加速。 在我的系统中,速度大约是原来的两倍 (在6000次迭代中,约为1.17秒,而不是2.09秒)

您没有提到什么是“相当长一段时间”,以及您正在使用的XL版本

问题可能部分在于行检测代码检查要隐藏的行(?)

以下是我在XL 2003中的测试代码(先注释一个版本,然后注释另一个版本):


字符串长度有一个限制。我刚刚遇到一个类似的问题,发现如果 范围(Txt) 大于255个字符时,我的VBA将抛出一个错误。例如,代码:

Debug.Print sheet1.Range("R2300,T2300,V2300,R2261,T2261,V2261,R1958,T1958,V1958,R1751,T1751,V1751,R1544,T1544,V1544,R1285,T1285,V1285,R1225,T1225,V1225,R1193,T1193,V1193,R1089,T1089,V1089,R802,T802,V802,R535,T535,V535,R264,T264,V264,R205,T205,V205,R168,T168,V168,R135,T135,V135,R101").Areas.count
抛出错误(字符串中包含256个字符),而代码

Debug.Print sheet1.Range("R230,T2300,V2300,R2261,T2261,V2261,R1958,T1958,V1958,R1751,T1751,V1751,R1544,T1544,V1544,R1285,T1285,V1285,R1225,T1225,V1225,R1193,T1193,V1193,R1089,T1089,V1089,R802,T802,V802,R535,T535,V535,R264,T264,V264,R205,T205,V205,R168,T168,V168,R135,T135,V135,R101").Areas.count

有255个字符,打印出的“46”没有错误。两种情况下的区域数相同。

也非常有用;但我的问题是偶然出现的。哎呀。无论如何,在进一步调查中,似乎有一个限制(8192)有关可以通过SpecialCells属性添加到某个范围的非连续单元格的数量,请参阅MS知识库文章编号832293。因此,即使这是您的问题,您也可能会遇到我的解决方案的困难。非常好!使用Union和ROWHEIGH的组合,宏现在运行得非常快。代码修改更新in OP。
Debug.Print sheet1.Range("R2300,T2300,V2300,R2261,T2261,V2261,R1958,T1958,V1958,R1751,T1751,V1751,R1544,T1544,V1544,R1285,T1285,V1285,R1225,T1225,V1225,R1193,T1193,V1193,R1089,T1089,V1089,R802,T802,V802,R535,T535,V535,R264,T264,V264,R205,T205,V205,R168,T168,V168,R135,T135,V135,R101").Areas.count
Debug.Print sheet1.Range("R230,T2300,V2300,R2261,T2261,V2261,R1958,T1958,V1958,R1751,T1751,V1751,R1544,T1544,V1544,R1285,T1285,V1285,R1225,T1225,V1225,R1193,T1193,V1193,R1089,T1089,V1089,R802,T802,V802,R535,T535,V535,R264,T264,V264,R205,T205,V205,R168,T168,V168,R135,T135,V135,R101").Areas.count