Excel在对大量单元格进行舍入时速度较慢(VBA)

Excel在对大量单元格进行舍入时速度较慢(VBA),excel,vba,bigdata,rounding,Excel,Vba,Bigdata,Rounding,我已经给了一个任务,用119col*176Rows=20944(可能更多)单元格和双倍数字将表格四舍五入。这来自一台测量机,它有大量的测量和计算。 我的第一个想法是制作一个简单的vba,在循环中用舍入的数字逐个更新该范围内的所有单元格,如下面的代码所示: 但是。。。这太慢了,以至于Excel应用程序都崩溃了。我只需要相同的工作表,但值舍入到3位小数(Excel格式单元格中的舍入数字功能在这种情况下,我需要舍入数字,并将每个值剪切到第三位小数) 任何解决办法都会非常感激 Sub Round_

我已经给了一个任务,用
119col*176Rows=20944
(可能更多)单元格和双倍数字将表格四舍五入。这来自一台测量机,它有大量的测量和计算。 我的第一个想法是制作一个简单的vba,在循环中用舍入的数字逐个更新该范围内的所有单元格,如下面的代码所示:

但是。。。这太慢了,以至于Excel应用程序都崩溃了。我只需要相同的工作表,但值舍入到3位小数(Excel格式单元格中的舍入数字功能在这种情况下,我需要舍入数字,并将每个值剪切到第三位小数)

任何解决办法都会非常感激

   Sub Round_numbers_click()
        Dim rng As Range
        Dim rCell As Range
    
        Dim valOriginal As Double
        Dim valRounded As Double
        
        Range("E15").Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        
        Set rng = Application.Selection
        
        For Each rCell In rng.Cells
            valOriginal = col.Cells.Value
            valRounded = Round(valOriginal, 3)
            rCell.Value = valRounded
        Next rCell
    End Sub

将范围保存到变体数组,处理数组并将数组保存回范围

Sub Round_numbers_click()
        Dim rng As Range
        Dim rCell As Range
        Dim vArr As Variant
        Dim iRow As Long, iCol As Long
    
        Dim valOriginal As Double
        Dim valRounded As Double
        
        Range("E15").Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        
        Set rng = Application.Selection
        vArr = rng
        For iRow = 1 To UBound(vArr, 1)
            For iCol = 1 To UBound(vArr, 2)
                vArr(iRow, iCol) = Round(Val(vArr(iRow, iCol)), 3)
            Next
        Next
        rng = vArr
    End Sub

您可以尝试使用Evaluate

Sub RoundToThree()
Dim rng As Range
Dim res As Variant

    Set rng = Range("E15")
    
    Set rng = Range(rng, rng.End(xlDown))
    
    Set rng = Range(rng, rng.End(xlToRight))
    
    res = Evaluate("ROUND(" & rng.Address & ",3)")
    
    rng.Value = res
    
End Sub

你真的想把数字四舍五入,还是只是格式问题?换言之:你真的想降低精度吗?如果是,则将数据复制到数组中(例如,请参见),在该数组上循环,对值进行四舍五入,然后将数组写回工作表中,这将大大加快处理速度。如果否,只需设置cellscol.cells.value的数字格式就可以了。应该是rcell.value吗?还可以尝试使用value2而不是value。Value将数字格式存储在内存中,value2不注意
Round
使用四舍五入。如果您不想这样做,请使用
WorksheetFunction.Round
。20000个条目并没有那么多,所以不需要太长时间。你确定工作表是健康的,没有包含太多的“删除”行吗?我可以看到它非常快,很像你的逻辑,但不起作用。每两列重复相同的数字,每两列都是零:)你真是个天才!,你能解释一下评估的目的吗。从未使用过:)