Performance Excel 2010 VBA宏使Excel冻结

Performance Excel 2010 VBA宏使Excel冻结,performance,vba,excel,Performance,Vba,Excel,我有一大块大于50的数据,向下大于1500,其中一些条目是非常大的负数,比如-1000000或-9820000,我希望所有这些都变成-100。 我还希望任何大于-100的非零数字显示2位小数。 我原以为这个vba宏可以工作,但它会导致excel冻结,excel屏幕变为灰色,并显示发生了什么。 我想这可能是因为有太多的单元格,所以它需要很长的时间和过载的东西,有没有办法使这个代码更有效 Sub Blah() For ColNum = 2 To WorksheetFunction.Count

我有一大块大于50的数据,向下大于1500,其中一些条目是非常大的负数,比如-1000000或-9820000,我希望所有这些都变成-100。 我还希望任何大于-100的非零数字显示2位小数。 我原以为这个vba宏可以工作,但它会导致excel冻结,excel屏幕变为灰色,并显示发生了什么。 我想这可能是因为有太多的单元格,所以它需要很长的时间和过载的东西,有没有办法使这个代码更有效

Sub Blah()
    For ColNum = 2 To WorksheetFunction.CountA(Range("1:1"))
        For RowNum = 2 To WorksheetFunction.CountA(Range("A:A"))
            If Cells(RowNum, ColNum) < -101 Then Cells(RowNum, ColNum) = -100
            If Cells(RowNum, ColNum) <> 0 And Cells(RowNum, ColNum).Value > -100 Then Cells(RowNum, ColNum).NumberFormat = "0.00"
        Next RowNum
    Next ColNum
End Sub
Sub-Blah()
对于ColNum=2到工作表function.CountA(范围(“1:1”))
对于RowNum=2到工作表function.CountA(范围(“A:A”))
如果单元格(RowNum,ColNum)<-101,则单元格(RowNum,ColNum)=-100
如果单元格(RowNum,ColNum)0和单元格(RowNum,ColNum).Value>-100,则单元格(RowNum,ColNum).NumberFormat=“0.00”
下一行
下一个秋千
端接头

代码中没有特别慢的东西。你要换多少个细胞?我唯一的建议是预先为整个范围设置NumberFormat(设置为0.00),然后仅为循环中的0或-100单元格将其设置回General。更改NumberFormat可能是最昂贵的操作,因此您希望尽量减少为单个单元格设置它的时间


很快会有人来建议您关闭应用程序。屏幕更新。

尽管Tmdean指出了解决方案,但我将发布一个可能会有所帮助的示例代码。

Edit1:在单元格中指定负值似乎也花了一段时间。所以应用同样的原理。首先获取相关单元格并一次性赋值

Sub marine()
    Dim r As Range, c As Range, nonzero As Range, s As Range

    Set r = ActiveSheet.UsedRange
    For Each c In r
        Select Case True
        Case c.Value <= -101
            '~~> Identify the cells first and combine all of them, don't assign value
            If s Is Nothing Then Set s = c _
            Else Set s = Union(s, c)
        Case c.Value <> 0 And c.Value > -100
            '~~> Identify the cells first and combine all of them, do not format
            If nonzero Is Nothing Then Set nonzero = c _
            Else Set nonzero = Union(nonzero, c)
        End Select
    Next
    '~~> Once you got all the cells, assign value in one go
    If Not s Is Nothing Then s.Value = -100
    '~~> Once you got all the cells, format in one go
    If Not nonzero Is Nothing Then nonzero.NumberFormat = "0.00"
End Sub
Sub-marine()
变暗r为量程,c为量程,非零为量程,s为量程
设置r=ActiveSheet.UsedRange
对于r中的每个c
选择Case True
案例c.价值-100
“~~~>首先识别单元格并合并所有单元格,不要格式化
如果非零为零,则设置非零=c_
Else设置为非零=并集(非零,c)
结束选择
下一个
“~~>获得所有单元格后,立即赋值
如果不是s,则s值=-100
“~~>获得所有单元格后,立即格式化
如果Not nonzero为空,则nonzero.NumberFormat=“0.00”
端接头
您可以将其替换为For循环,只要更简单即可。

您还可以更明确地设置范围对象或使用UsedRange。哈。

@rivudey Tmdean是对的。首先确定满足条件的单元格,然后一次性格式化。重复应用格式确实需要很多时间。您测试了3次
单元格(RowNum,ColNum)
,但只需使用一个较长的变量即可完成一次测试(速度要快得多),如果
,则可以在第二次测试时使用
elseif
,并删除
之后的部分。另外,声明变量(尽可能长)。使用
application.enableevents=false
end screenUpdate=false作为开始。请参阅我的示例代码