这段代码执行效率太低,有什么方法解决?

linuxsun999 2005-07-18 02:15:31
Private Sub cmdBtn_Click()

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'判断名为sheet2的表是否存在,不存在则创建
Dim sheet2Exist As Boolean
sheet2Exist = funSheetExist("Sheet2")
If Not (sheet2Exist) Then
Worksheets.Add Count:=1, after:=Sheets(1)

ThisWorkbook.ActiveSheet.Name = "Sheet2"

End If

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim totalRow As Integer
totalRow = Sheet1.UsedRange.Rows.Count

For i = 1 To totalRow - 2

Worksheets("Sheet1").Activate
Worksheets("Sheet1").Select
Rows("2:2").Select
Selection.Copy

Worksheets("sheet2").Activate
Worksheets("sheet2").Select
Worksheets("sheet2").Rows(i * 2 - 1 & ":" & i * 2 - 1).Select
ActiveSheet.Paste

Worksheets("Sheet1").Activate
Worksheets("Sheet1").Select
Rows(i + 2 & ":" & i + 2).Select
Selection.Copy

Worksheets("sheet2").Activate
Worksheets("sheet2").Select
Worksheets("sheet2").Rows(i * 2 & ":" & i * 2).Select
ActiveSheet.Paste

Next



End Sub


Function funSheetExist(strSheetName As String) As Boolean

Dim existFlag As Boolean
Dim nNumOfSheets As Integer
existFlag = False
nNumOfSheets = Worksheets.Count
For i = 1 To nNumOfSheets
If Worksheets(i).Name = strSheetName Then existFlag = True
Next
funSheetExist = existFlag

End Function


这个执行效率太低了,原表有100行时,执行时间大约为1分钟,请问有什么方法提高效率.
...全文
183 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
flili 2005-07-21
  • 打赏
  • 举报
回复
看看你的代码:
1. "totalRow - 2"不要放在循环体
2. Worksheets("Sheet1").Activate
Worksheets("Sheet1").Select
Rows("2:2").Select
Selection.Copy
这一段应提到循环体外,否则执行了一百遍重复的东西
要注意:如果提到循环体外,标题和工资处理要用两次循环分别执行
3. 有Worksheets("sheet2").Select就可以不要Worksheets("sheet2").Activate

都是重复!!!!!!


建议方法:
方法1:
用这段代码把sheet2作为sheet1的副本来处理
(先删除sheet2,用Application.DisplayAlerts = False屏蔽提示)
Sheets("Sheet1").Select
Sheets("Sheet1").Copy After:=Sheets("Sheet1")
ActiveSheet.Name = "sheet2"
然后在奇数行插入空行,完成后,在空行填入标题

要点:表的副本+插入空行

方法2:
如果sheet2是新建的,先用同样的标题向下填充
(标题的格式:一行标题,一行空行)
填充完标题后,再重sheet1拷数据过来填到空行里

要点:向下填充命令比一行一行地复制重复的内容要快很多

方法3:预先做一个连接到sheet1的表,平时隐藏,需要打印时复制或显示,
一劳永逸!!!


建议少用copy paste(经过剪贴板),而应该用range cells等来直接赋值






maweifeng 2005-07-20
  • 打赏
  • 举报
回复
http://www.cnblogs.com/maweifeng/archive/2005/06/29/183464.html
rategy 2005-07-19
  • 打赏
  • 举报
回复
工作簿先要激活,否则还是拿sheet2的值。
linuxsun999 2005-07-19
  • 打赏
  • 举报
回复
Worksheets("Sheet2").Rows(i * 2 - 1 & ":" & i * 2 - 1) = Worksheets("Sheet1").Rows("2:2")
执行这个语句后,目的表Sheet2生成了行,但却无数据,这是怎么回事?
linuxsun999 2005-07-19
  • 打赏
  • 举报
回复
这段程序就是做工资条,我以前没用过VBA,是要用了临时抱佛脚,参考宏的代码写的.
好多VBA的基本知识我都不是很了解
晚上回家后我又改了一样,速度快了6倍左右
再想问一下,如果用cells或range取一行怎么写,我现在只会用rows


linuxsun999 2005-07-19
  • 打赏
  • 举报
回复
TO rategy(呼吸空气的鱼)
我试了一下,激活Sheet1执行结果还是一样啊
loadagain 2005-07-18
  • 打赏
  • 举报
回复
copy and pase时最傻得方法。
用sheet(1).cells(1,1)=sheet(2).cells(2,2)这样快100倍啊。
icansaymyabc 2005-07-18
  • 打赏
  • 举报
回复
我知道楼主是在做工资册。这段程序的目的是产生工资条。对不对?
icansaymyabc 2005-07-18
  • 打赏
  • 举报
回复
你这么喜欢用
.Select
Selection.Copy
ActiveSheet.Paste

那可就没办法了。

5,172

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧