Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Excel 需要建议:VBA,从BOM中收集范围,以一次更改多行的格式_Excel_Vba_Loops - Fatal编程技术网

Excel 需要建议:VBA,从BOM中收集范围,以一次更改多行的格式

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

早上好,我需要一些建议

首先,这是我的全部。我正在迭代一个制造BOM:

我不是VBA的高手,但我已经编写了一个工作脚本,可以根据级别填充这些行的颜色/边框。目前,我正在使用for循环中的union将范围分组在一起:

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为空,则….