我有两个关于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秒。
我有两个问题:
我应该命名并设置这些范围,即:
将目标调暗为范围 set target = calcSheet.Cells(1,1) target.Value = currentSheet.Cells(i,1).Value
而不是
calcSheet.Cells(1,1).Value = currentSheet.Cells(i,1).Value
而不是
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条记录(与下面的解决方案进行比较)
答案 0 :(得分:2)
如果您想一次复制多个值,请使用直接分配
currentSheet.Range("A1").Resize(numRows,1).Value = otherSheet.Range("A1").Resize(numRows,1).Value
.Range()
属性将单个单元格转换为具有给定尺寸的单元格范围,并且可以分配或复制所有值。
答案 1 :(得分:1)
答案 2 :(得分:0)
如果目标范围是连续的,您可以这样:
curSheet.Cells(i, 1).Resize(1,16).Value = Array(someRange.Value, someRange2.Value, _
someRange3.Value, [...], someRange16.Value)