Arrays 重拨数组后,如何将数组写入单元格区域?

Arrays 重拨数组后,如何将数组写入单元格区域?,arrays,vba,Arrays,Vba,我的目标是选择一列大约300000个单元格,并将每个单元格的值四舍五入到小数点后两位 我发现循环数组要比循环单元格快得多 如果我让整个数组在循环后而不是在循环期间将其数据发布到单元格中,速度会快得多,因为再次在循环中发布任何数据需要花费太多时间 循环完成后,是否有方法写入新数组(“varArray”)中的所有值? Sub-RoundedTwoDecimalPlaces() 作为整数的Dim i Dim MyArray()作为变量“声明动态数组”。 将最后一行设置为整数 暗淡的一部分是双重的 暗借

我的目标是选择一列大约300000个单元格,并将每个单元格的值四舍五入到小数点后两位

我发现循环数组要比循环单元格快得多

如果我让整个数组在循环后而不是在循环期间将其数据发布到单元格中,速度会快得多,因为再次在循环中发布任何数据需要花费太多时间

循环完成后,是否有方法写入新数组(“varArray”)中的所有值?

Sub-RoundedTwoDecimalPlaces()
作为整数的Dim i
Dim MyArray()作为变量“声明动态数组”。
将最后一行设置为整数
暗淡的一部分是双重的
暗借双倍
lStart=计时器
LastRow=单元格(1,Selection.Column).End(xlDown).Row
MyArray=范围(“a1:a8”)。值2
ReDim MyArray(LastRow)'调整为x个元素的大小。
对于i=1到最后一行
MyArray(i)=圆形(单元格(i,Selection.Column),2)'初始化数组。
接下来我
''这是我无法让我的数组动态发布到单元格中的地方。
Selection.Value=MyArray()
''看看完成所需的时间。
“我的目标是快速完成300000行
借出=计时器
Debug.Print“Duration=&(lEnd-lStart)和“seconds”
端接头

您可以直接从范围中获取数组,然后恢复更改后的值:


次舍入小数位数()
作为整数的Dim i
作为变体的Dim-arr
暗淡的一部分是双重的
将ws设置为工作表,col设置为长
设置ws=ActiveSheet
col=Selection.Column
lStart=计时器
使用ws.Range(ws.Cells(1,col),ws.Cells(1,col.End(xlDown))
arr=.Value
对于i=1至Ubound(arr,1)
arr(i,1)=四舍五入(arr(i,1),2)
接下来我
.Value=arr
以
调试。打印“Duration=”&(计时器-lStart)和“seconds”
端接头

以下是我如何使用@Tim Williams code完成的

我不得不循环它,因为数组有一个最大字符限制

以下是完成的代码:

Sub loopthrough()

    Dim i As Integer
    Dim arr As Variant
    Dim arr1 As Variant
    Dim arr2 As Variant
    Dim lStart As Double
    Dim ws As Worksheet, col As Long
    
     

   LastRow = Cells(1, Selection.Column).End(xlDown).Row
 

    Set ws = ActiveSheet
    col = Selection.Column
    lStart = Timer

   If LastRow < 30001 Then
   
    With ws.Range(ws.Cells(1, col), ws.Cells(1, col).End(xlDown))
        arr = .Value2
        For i = 1 To UBound(arr, 1)
        
        If IsNumeric(arr(i, 1)) Then
            arr(i, 1) = Round(arr(i, 1), 2)
        Else
            arr(i, 1) = arr(i, 1)
        End If
        
        Next i
        .Value2 = arr
    End With
   

Else ''if selection is more than 30,000 lines.
  
n = 1
Z = 30000
Do While Z < LastRow
    
      With ws.Range(ws.Cells(n, col), ws.Cells(Z, col))
        arr = .Value2
        For i = 1 To UBound(arr, 1)
        
        If IsNumeric(arr(i, 1)) Then
            arr(i, 1) = Round(arr(i, 1), 2)
        Else
            arr(i, 1) = arr(i, 1)
        End If
        
        Next i
        .Value2 = arr
      End With
    n = n + 30000
    Z = Z + 30000

Loop


      With ws.Range(ws.Cells(n, col), ws.Cells(n, col).End(xlDown))
        arr = .Value2
        For i = 1 To UBound(arr, 1)
            
            If IsNumeric(arr(i, 1)) Then
            arr(i, 1) = Round(arr(i, 1), 2)
        Else
            arr(i, 1) = arr(i, 1)
        End If
        
        Next i
        .Value2 = arr
      End With
     
End If

 Debug.Print "Duration = " & (Timer - lStart) & " seconds"

End Sub
Sub-loopthrough()
作为整数的Dim i
作为变体的Dim-arr
Dim-arr1作为变体
Dim-arr2作为变体
暗淡的一部分是双重的
将ws设置为工作表,col设置为长
LastRow=单元格(1,Selection.Column).End(xlDown).Row
设置ws=ActiveSheet
col=Selection.Column
lStart=计时器
如果LastRow<30001,则
使用ws.Range(ws.Cells(1,col),ws.Cells(1,col.End(xlDown))
arr=.Value2
对于i=1至UBound(arr,1)
如果是数字(arr(i,1)),则
arr(i,1)=四舍五入(arr(i,1),2)
其他的
arr(i,1)=arr(i,1)
如果结束
接下来我
.Value2=arr
以
如果选择的行数超过30000行,则为Else“”。
n=1
Z=30000
在Z