VBA:加速复制

时间:2015-01-16 21:28:10

标签: performance vba excel-vba excel

我有两个关于VBA效率的问题。我的VBA代码从一个工作表中获取一个单元格值,将其放在另一个excel工作簿中,然后执行它自己的计算并返回结果,然后将该结果复制回原始工作簿。我的代码的简化版本是:

dim currentWB as workbook
dim currentSheet as worksheet
dim calcWB as workbook
dim calcSheet as worksheet 
dim numRows as integer 
dim i as integer
dim target as range
dim result as range


set currentWB = workbooks.Open(...)
set currentSheet = currentWB.Sheets("sheetName")
set calcWB = workbooks.Open(...)
set calcSheet = calcWB.Sheets("sheetName")
set target = calcSheet.Cells(1,1)
set result = calcSheet.Cells(2,1)

numRows = activeSheet.UsedRange.Rows.count


For i = 0 to numRows
  target.Value = currentSheet.Cells(i,1).Value
  currentSheet.Cells(i,2) = result.Value
next i

currentWB.Close SaveChanges:=True
calcWB.Close SaveChanges:=False

在实际的脚本中,我们不是像上面那样复制,而是13。循环遍历~15,000条记录。现在,我每回合平均1.5秒。

我有两个问题:

  1. 我应该命名并设置这些范围,即:

    将目标调暗为范围 set target = calcSheet.Cells(1,1) target.Value = currentSheet.Cells(i,1).Value

  2. 而不是

    calcSheet.Cells(1,1).Value = currentSheet.Cells(i,1).Value

    1. 是否有更好的方法可以将几个非顺序单元格从一个工作表复制到另一个工作表,即
    2. 而不是

          curSheet.Cells(i, 1) = someRange.Value
          curSheet.Cells(i, 2) = someRange2.Value
          curSheet.Cells(i, 3) = someRange3.Value
      
          ...
      
          curSheet.Cells(i, 14) = someRange14.Value
          curSheet.Cells(i, 15) = someRange15.Value
          curSheet.Cells(i, 16) = someRange16.Value
      

      更快的东西?

      非常感谢你们!

      感激, 扎克

      **此代码需要66秒才能运行50条记录(与下面的解决方案进行比较)

3 个答案:

答案 0 :(得分:2)

如果您想一次复制多个值,请使用直接分配

currentSheet.Range("A1").Resize(numRows,1).Value = otherSheet.Range("A1").Resize(numRows,1).Value

.Range()属性将单个单元格转换为具有给定尺寸的单元格范围,并且可以分配或复制所有值。

答案 1 :(得分:1)

最快捷的方法是使用:

SourceRange.Copy DestinationRange

请参阅:Range.Copy method

答案 2 :(得分:0)

如果目标范围是连续的,您可以这样:

    curSheet.Cells(i, 1).Resize(1,16).Value = Array(someRange.Value, someRange2.Value, _
                                              someRange3.Value, [...], someRange16.Value)