ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 12498|回复: 5

VBA Copy(复制)方法比Cut(剪切)方法效率快10倍以上

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-7-25 08:26 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
在我写的一个小代码过程中发现, Copy(复制)方法比Cut(剪切)方法效率快10倍以上。我要在订单中移除已经完成的订单到另一个工作表,开始是使用Cut方法,用了417秒。我觉得太慢,改用Copy方法,只用了31秒。
过程是:先复制已完成订单到目的工作表,然后把数据清除内容:ClearContents,全部移除之后做一个排序,并把空出来的那些行,再一次性清除内容、批注和格式:Clear.(没办法,ClearContents效率也远比Clear高)。

上传了附件,大家可以试试把代码中的Copy改为Cut。因为数据很大,我加了进度条和百分百显示,会多花一点时间了。

复件 全部订单.zip (464.51 KB, 下载次数: 235)

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-25 08:28 | 显示全部楼层
还有,在复制语句后面加一句:Application.CutCopyMode = False貌似也稍微快几秒钟。

TA的精华主题

TA的得分主题

发表于 2017-7-25 08:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这些不用测试,基本都知道。感谢你分享。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-25 08:51 | 显示全部楼层
'把红色的Copy改为Cut,效率会慢10倍

Sub Finished()
t = Timer
Application.EnableEvents = False
UserForm1.Show 0  '有进度条,因此请下载附件后使用
DoEvents
With Sheet1
r = .Range("a" & Rows.Count).End(3).Row
If r < 3 Then Exit Sub
Set rng = .Range("s3:s" & r)
i = 0
For Each c In rng
    If c = "Y" Or c = "y" Or c = "OK" Then
        L = Sheet2.Range("a" & Rows.Count).End(3).Row
        If L > Rows.Count - 2 Then Call NewSheet: L = Sheet2.Range("a" & Rows.Count).End(3).Row
        c.EntireRow.Copy Sheet2.Range("a" & L + 1)
        Application.CutCopyMode = False
        c.EntireRow.ClearContents
        i = i + 1
    End If
UserForm1.Label1.Caption = "程序正在进行:" & Format(c.Row / (2 * r), "0.00%")
DoEvents
Next
Set rng = .Range("n3:n" & r)
For Each c In rng
    If (c.Offset(, 1) <> "" And c.Offset(, 1) < Date) Or (c.Offset(, 1) = "" And c <> "" And c < Date) Then
        L = Sheet2.Range("a" & Rows.Count).End(3).Row
        If L > Rows.Count - 2 Then Call NewSheet: L = Sheet2.Range("a" & Rows.Count).End(3).Row
        c.EntireRow.Copy Sheet2.Range("a" & L + 1)
        Application.CutCopyMode = False
        c.EntireRow.ClearContents
        i = i + 1
    End If
UserForm1.Label1.Caption = "程序正在进行:" & Format((c.Row + r) / (2 * r), "0.00%")
DoEvents
Next
.Range("3:" & r).Sort key1:=.Range("a3"), Order1:=xlAscending, header:=xlNo
r = .Range("a" & Rows.Count).End(3).Row
.Range(r & ":" & Rows.Count).Clear
.Range("a" & Rows.Count).End(3).Offset(1).Select
End With
Unload UserForm1
MsgBox "共移除 " & i & "项 已完成订单!用时" & Format(Timer - t, "0.00\秒") & vbCrLf & "按『确定』键结束"
Application.EnableEvents = True
Set rng = Nothing
End Sub
Sub NewSheet() '当备份工作表填满时,开启新工作表
    Sheet2.Copy after:=Sheet2
    ActiveSheet.Name = "备份_" & Format(Date, "yyyy-mm-dd")
    Sheet2.Range("3:" & Rows.Count).Clear
End Sub


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-7-25 08:52 | 显示全部楼层
jiangxiaoyun 发表于 2017-7-25 08:50
这些不用测试,基本都知道。感谢你分享。

不会吧?我没有学过VBA,没有系统的了解过,只是在需要的时候,自己慢慢写几句。不好意思,贻笑大方了!

TA的精华主题

TA的得分主题

发表于 2020-1-3 15:06 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 04:42 , Processed in 0.034626 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表