范围限制难题

有什么限制,我可以通过VBA在一个范围内select? 基本上我发现,如果我要在循环中隐藏整行,需要很长时间才能隐藏行。

例如) – 隐藏A列中没有值的行

For i = 1 to 600 With Range("A" & i) If .value = vbEmpty then .EntireRow.Hidden = True End With Next 

这样做的更快捷的方法是创build一个引用每个行的单个范围,然后执行一个“.entirerow.hidden = true”语句。 是的,我已经有了application.screenupdating = false设置。

我遇到的问题是,如果范围的string引用太长,它只是失败。

下面的代码声明了一个函数,该函数既接受行号的标准数组(如果数组是事先制定的),也接受参数参数(如果您不想先声明数组,行很小)。 然后创build一个在范围参考中使用的string。

 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 

第二个函数“dfdfd”只是用来举例说明什么时候失败。 要查看它的工作时间,只需要创build一个新的数组,然后尝试一下。 有用。

最终(?)更新:

 Option Explicit Public Sub test() Dim i As Integer Dim t As Long Dim nRng As Range t = Timer() Application.ScreenUpdating = False Set nRng = [A1] For i = 1 To 6000 Set nRng = Union(nRng, Range("A" & i)) Next nRng.RowHeight = 0 'nRng.EntireRow.Hidden = true Application.ScreenUpdating = True Debug.Print "Union (RowHeight): " & Timer() - t & " seconds" 'Debug.Print "Union (EntireRow.Hidden): " & Timer() - t & " seconds" End Sub 

结果:

联盟(行高:0.109375秒
联盟(隐藏行):0.625秒

我认为你在这里寻找的神奇function是Union()。 它内置到Excel VBA中,所以请看帮助。 它只是你所期望的。

循环遍历你的范围,而不是build立一个string,build立一个多区域的范围。 然后,您可以一次select或设置整个属性。

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

更快的选项可能是使用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 2​​003中的testing代码(注释掉其中一个版本):

 Option Explicit Public Sub test() Dim i As Integer Dim t As Long t = Timer() Application.ScreenUpdating = False For i = 1 To 6000 With Range("A" & i) 'If .Value = vbEmpty Then .EntireRow.Hidden = True If .Value = vbEmpty Then .RowHeight = 0 End With Next Application.ScreenUpdating = True Debug.Print Timer() - t & " seconds" End Sub 

string长度有一个限制。 我刚刚遇到类似的问题,发现如果范围(Txt)的stringTxt大于255个字符,我的VBA将引发Error.eg。 代码:

 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个字符的string),而代码

 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”没有错误。 区域数量在两种情况下都是相同的。