Excel 需要建议:VBA,从BOM中收集范围,以一次更改多行的格式
早上好,我需要一些建议 首先,这是我的全部。我正在迭代一个制造BOM: 我不是VBA的高手,但我已经编写了一个工作脚本,可以根据级别填充这些行的颜色/边框。目前,我正在使用for循环中的union将范围分组在一起:Excel 需要建议:VBA,从BOM中收集范围,以一次更改多行的格式,excel,vba,loops,Excel,Vba,Loops,早上好,我需要一些建议 首先,这是我的全部。我正在迭代一个制造BOM: 我不是VBA的高手,但我已经编写了一个工作脚本,可以根据级别填充这些行的颜色/边框。目前,我正在使用for循环中的union将范围分组在一起: Case 1 If arrRngFill(1) Is Nothing Then Set arrRngFill(1) = Range(Cells(rwCount, 1), Cells(rwCount, colLast)) Else Se
Case 1
If arrRngFill(1) Is Nothing Then
Set arrRngFill(1) = Range(Cells(rwCount, 1), Cells(rwCount, colLast))
Else
Set arrRngFill(1) = Union(arrRngFill(1), Range(Cells(rwCount, 1), Cells(rwCount, colLast)))
End If
'etc... for 8 levels
然而,我正在迭代190000行,这些行逐渐停止
因此,作为一项棘手的工作,我每6000个循环应用一次格式化(如果速度再慢一点),然后清除数组:
'Do stuff and release every 6000 ticks or on last row - Union is super slow when it gets big for some reason
If releaseTick = 6000 Or lvlNext = -1 Then
If Not arrRngFill(1) Is Nothing Then Call SetFill(arrRngFill(1), RGB(44, 35, 45), RGB(0, 0, 0), RGB(0, 0, 0), True)
If Not arrRngFill(2) Is Nothing Then Call SetFill(arrRngFill(2), RGB(77, 76, 125), RGB(0, 0, 0), RGB(0, 0, 0), True)
'etc..... for 8 levels
Erase arrRngFill
releaseTick = 1
End If
我的问题是:有没有一种更干净的方法可以在不降低脚本速度的情况下实现这一点?我的目标是一次应用所有格式。每6000个循环就必须转储一次格式似乎是错误的,我想我遗漏了一些东西。目前,该脚本在190000行上耗时约5.5秒
谢谢你的关注 对我来说,这似乎是合理的——由于添加太多,联合会的速度确实会变慢,所以每隔一段时间清除范围是有意义的。您如何递增
releaseTick
-是否所有范围都只有一个计数器?是的,整个级别循环只有1个releaseTick
,因此它实际上是级别不可知的;一种快速的黑客解决方案;这就是If Not xxxxx Is Nothing
的作用,因为如果它为空,我会得到错误。事实上,使用Union添加另一个范围所需的时间会增加,目标范围中已引用的非连续范围越多。在非连续范围的数量达到10000(YMMV)之前,这种减速不会变得显著。但它大致是指数型的,一旦它变得足够糟糕,以至于注意到它会迅速变得更糟。我认为,限制联合范围数量的“黑客”解决方案大体上是正确的。仅供参考,完整代码中有大量重复,可以分解为BuildRange(rangeToBuild As Range,rangeToAdd As Range)
,您的Select Case
可以是单个case1到9
,使用(例如)CInt(stackLevel.Peek)
要选择要传递到BuildRange
的范围,请添加如果rng为空,则退出Sub
作为SetFill
中的第一行,并且setboorders
也会删除对这些Sub的调用中的大量如果不是XXXX为空,则….
。