VBA: 加速复制
VBA: Speeding up Copying
我有两个关于 VBA 效率的问题。我的 VBA 代码从一个 sheet 中获取一个单元格值,将其放在另一个 excel 工作簿中,然后该工作簿执行自己的计算并 returns 结果,然后我将该结果复制回去进入原始 workbook.A 我的代码的简化版本是:
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 秒。
我的两个问题是:
我是否应该命名和设置这些范围,即:
暗淡目标作为范围
设置目标 = calcSheet.Cells(1,1)
target.Value = currentSheet.Cells(i,1).Value
而不是
calcSheet.Cells(1,1).Value = currentSheet.Cells(i,1).Value
- 是否有更好的方法将多个非连续单元格从一个 sheet 复制到另一个,即
而不是
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 条记录(与下面的解决方案比较)
最快的方法是使用:
SourceRange.Copy DestinationRange
如果您想一次复制多个值,请使用直接赋值
currentSheet.Range("A1").Resize(numRows,1).Value = otherSheet.Range("A1").Resize(numRows,1).Value
.Range()
属性 将单个单元格转换为具有给定尺寸的一系列单元格,并且可以分配或复制它们的所有值。
如果目标范围是连续的,你可以这样做:
curSheet.Cells(i, 1).Resize(1,16).Value = Array(someRange.Value, someRange2.Value, _
someRange3.Value, [...], someRange16.Value)
我有两个关于 VBA 效率的问题。我的 VBA 代码从一个 sheet 中获取一个单元格值,将其放在另一个 excel 工作簿中,然后该工作簿执行自己的计算并 returns 结果,然后我将该结果复制回去进入原始 workbook.A 我的代码的简化版本是:
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 秒。
我的两个问题是:
我是否应该命名和设置这些范围,即:
暗淡目标作为范围 设置目标 = calcSheet.Cells(1,1) target.Value = currentSheet.Cells(i,1).Value
而不是
calcSheet.Cells(1,1).Value = currentSheet.Cells(i,1).Value
- 是否有更好的方法将多个非连续单元格从一个 sheet 复制到另一个,即
而不是
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 条记录(与下面的解决方案比较)
最快的方法是使用:
SourceRange.Copy DestinationRange
如果您想一次复制多个值,请使用直接赋值
currentSheet.Range("A1").Resize(numRows,1).Value = otherSheet.Range("A1").Resize(numRows,1).Value
.Range()
属性 将单个单元格转换为具有给定尺寸的一系列单元格,并且可以分配或复制它们的所有值。
如果目标范围是连续的,你可以这样做:
curSheet.Cells(i, 1).Resize(1,16).Value = Array(someRange.Value, someRange2.Value, _
someRange3.Value, [...], someRange16.Value)