以多种方式将多区域范围的值复制到另一张纸上

我在Excel中有一个命名范围(bufferFields),如下所示:

=Panel!$G$3:$G$24;Panel!$J$2:$J$20;Panel!$M$2:$M$14;Panel!$C$14;Panel!$M$15:$M$26

将这个多区域范围内的所有67个单元格的值放在另一个表格(历史logging)中,按照它们在范围中定义的相同顺序,这是一种高效的方法,这样我就可以logging在我的vba代码计算的每个迭代的面板表?

对于我的algorithm的每一个运行,我想将所有的bufferFields值logging到历史logging上的不同行。

这是我到目前为止所做的,并且如预期的那样工作,但是我认为性能受到原始范围内所有单元的循环的影响(而不是用一个方法或vba函数来完成)。

 dim c as range, column as integer, row as integer column = 1 row = 1 ' this is controlled in another portion of the sub For Each c In Range("bufferFields").Cells Sheets("History").Cells(row, column) = c.Value column = column + 1 Next 

将范围读入一个数组,然后构造一个新的数组写入第二个工作表,运行速度比使用单元格中的随机值的单元格快30倍。 另外,您应该closuresScreenUpdating,Calculation,如果您使用的是事件macros,也可以禁用它们。

当你将一个多区域范围读入一个数组时,你必须逐个区域地进行。 而且还需要进行testing以确保正在读取的区域是一个或多个单元格。 这是一些样本代码。 请注意,我不得不使用History_作为工作表的名称,因为在美国英语版的Excel中,History是一个保留字。

 Option Explicit Sub CopyBufferFields() Dim I As Long Dim J As Long, K As Long, L As Long Dim vSrc As Variant, vRes As Variant Application.ScreenUpdating = False Dim lRW As Long lRW = 1 'Row number to be set With [bufferfields] ReDim vRes(1 To 1, 1 To .Count) For I = 1 To .Areas.Count vSrc = .Areas(I) If IsArray(vSrc) Then For J = 1 To UBound(vSrc, 1) For K = 1 To UBound(vSrc, 2) L = L + 1 vRes(1, L) = vSrc(J, K) Next K Next J Else L = L + 1 vRes(1, L) = vSrc End If Next I End With Worksheets("History_").Cells(lRW, 1).Resize(columnsize:=UBound(vRes, 2)) = vRes Application.ScreenUpdating = True End Sub 

使用区域并复制它们:

 Row = 1 Col = 1 For Each R In Range("bufferFields").Areas R.Copy Destination:=Sheets("History").Cells(Row, Col) Row = Row + R.Rows.Count Next 

这将把所有的值放在一个列中。 如果你想要彼此旁边的所有列,使用

  Col = Col + 1 ' instead of Row = Row + R.Rows.Count 

如果你真的想要所有的值,如你的代码,使用(警告:此代码使用复制粘贴,可能会干扰用户):

 Row = 1 Col = 1 For Each R In Range("bufferFields").Areas R.Copy Sheets("History").Cells(Row, Col).PasteSpecial xlPasteAll, Transpose:=True Col = Col + R.Rows.Count Next 

如果表单中有很多公式,则通过放置代码来加快代码的速度

 Application.Calculation = xlCalculationManual 

之前你的代码和

 Application.Calculation = xlCalculationAutomatic 

在你复制代码之后。 如果工作簿很大,这可能会加速很多。