在我的excel VBA代码中,我需要将一些数据从一个范围移动到另一个工作表。
截至目前,我正在遍历范围并复制像这样的值:
For offset = 0 To 101
ActiveWorkbook.Sheets(Sheet).Range("C3").offset(offset, 0).Value = ActiveSheet.Range("D4").offset(offset, 0).Value
Next offset
但是,迭代并复制100个单元格的值需要将近一分钟。
以编程方式使用Copy-Paste会更好吗,还是有办法立即复制整个范围?类似的东西:
ActiveWorkbook.Sheets(Sheet).Range("C3:C102").Value = ActiveSheet.Range("D4:D104").Value
答案 0 :(得分:2)
所以,愚蠢的我在发布之前没有尝试过。显然,我可以通过这种方式移动整个范围的数据:
Workbook.Sheets(Sheet).Range("C3:C102").Value = ActiveSheet.Range("D4:D104").Value
与复印粘贴一样快,无需切换纸张。 使用for循环遍历该范围对于100个单元格大约需要45秒,而上述两个选项是即时的。
答案 1 :(得分:2)
您可以使用以下方法加速代码并停止闪烁:
Application.ScreenUpdating = False
'YOUR CODE
Application.ScreenUpdating = True
答案 2 :(得分:2)
您可以立即将整个范围读入Variant数组,然后将其写回另一个范围。这也是快速,无闪烁的,并且还有额外的好处,如果您愿意,可以对数据进行一些操作编码。
Dim varDummy As Variant
varDummy = ActiveSheet.Range("D4:D104")
' Can insert code to do stuff with varDummy here
Workbook.Sheets(Sheet).Range("C3:C103") = varDummy
我学到了很多方法:尽可能避免复制/粘贴!复制并粘贴使用剪贴板。其他程序可能会在代码运行时读取/写入剪贴板,这将导致疯狂的,不可预测的结果。
此外,最好尽量减少VBA和Excel之间的交互次数,因为它们很慢。在循环中进行这样的交互是很慢的。
答案 3 :(得分:1)
Columns("A:Z").Select
Selection.Copy
Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste
这会将第1列到第Z页从第1页复制到第2页。这是通过录制宏来生成的。您也可以使用以下内容将其应用于范围:
Range("D4:G14").Select
Selection.Copy
Sheets("Sheet2").Select
Range("D4").Select
ActiveSheet.Paste
这就像你追求的那样吗?
如果您需要任何特定内容并且可以手动执行(例如复制和粘贴),请记录宏以获取它的VBA代码。
答案 4 :(得分:1)
复制和粘贴在VBA中有相当大的开销,处理类似的范围也是如此。自从我完成VBA以来已经有一段时间了,但是如果我没记错的话,最快的方法就是将你想要的值写入数组然后使用Resize函数。所以像这样:
Option Base 0
Dim firstrow as integer
Dim lastrow as integer
Dim valuesArray() as Long
Dim i as integer
//Set firstrow and lastrow however you deem appropriate
...
//Subtracing first row from last row gets you the needed size of the 0 based array
ReDim valuesArray(lastrow-firstrow)
for int i = 0 to (lastrow-firstrow)
valuesArray(i)=Cells(i+firstrow, COLUMNNUMBER).value
next i
当然,将COLUMNNUMBER替换为您正在迭代的任何列。这应该用您想要的值填充您的数组。然后选择目标单元格并使用“调整大小”将值放入。因此,如果目标单元格为D4:
Range("D4").Resize(UBound(valuesArray)+1, 0).value = valuesArray
从D4开始写入数组中的所有值,然后向下移动到数组中的多个单元格。稍微复杂但是如果你想要速度我不认为我有更快的想法。我也做了这个,所以请测试并确保你不会在这里和那里切断一个单元格。
答案 5 :(得分:1)
OZGrid页面包含非常有用的信息 - http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm
在我的情况下,我需要复制格式,所以我一直在使用它:
Sheet1.Range("A1:A200").Copy Destination:=Sheet2.Range("B1")
但执行速度仍然很慢 - 到了锁定应用程序的程度 - 我终于找到了问题 - 在过去的某些时候,我的页面中有许多空文本框 - 而且每次都被复制我的代码运行它们没有被我的代码删除以清除工作区域。结果就像4,500个空文本框 - 每个文本框都被上面的代码复制和粘贴。
如果您使用编辑 - 转到... - 单击特殊 - 然后选择对象 - 并且您没有看到任何好的 - 如果您在页面上看到一堆您不知道的对象不好。