爲什麽VBA程序這麽慢,跑出來頂級配置的電腦要用1個小時左右?請問有沒有好的解決方案?

时间:2021-11-02 16:06:05
我電腦配置:
AMD Authon 1800+,256DDR,KT333主板,7200轉硬盤
我為別人做了一套品質管理系統,其中一個重要的功能就是生成Excel報表。
報表有三種:
1.一種是日報,日報有四個Sheet,全部是自己創建,然後從數據庫里抓數直接往Cell里填,全部生成大概要4—6分鐘的時間。
但黨我分別作了三個FlexGrid用來顯示四個sheet里的數據,每個FlexGrid顯示完全部數據只要3-10秒,然後我分別將FlexGrid里的數據往四個Excel文件里填,平均每個要30秒左右。這和起來的時間是3分鐘左右,但這不符合用戶要求。

2.周報就要了我的命。周報大概有30多個sheet。數據增多了,全部運行完要65分鐘左右!!!!!天啊!!!
但如果對每個sheet顯示分別用FlexGrid顯示,在生成當個的Excel文件,也比較快。
我在周報里有一個模版sheet。每次要新增sheet的時候我在程序先將模版sheet拷貝,然後生成一個新的Sheet,這樣就避免了格式的定義。

3.月報更慢。形式和周報一樣。

問題:
1.VBAExcel編程的數度瓶頸是什麽?如何提高VBA程序速度???
2.VBAExcel編程要注意些什麽?
3.如果是用打開一個Excel文件然後往裏面填數據的方法是不是比創建一個Excel文件要快的多?但是如果涉及到一個Excel文件要有動態的多個Sheet(Sheet格式一樣),那怎麽弄 ?

請兄弟姐妹還要Microsoft專家幫忙,救小弟一命!

13 个解决方案

#1


同道中人啊,我以前用VBA也是这样的慢,后来改为数据库就变快了。读取Excel数据的主要代码如下:
  
  Dim db As DAO.Database
  Dim rs As DAO.Recordset  
  Dim SourcePath as String
  Dim data(100,5)       '100,5可以改,也可以定义为动态数组
  dim i,j as integer

  SourcePath="d:\book1.xls"
  Set db = OpenDatabase(SourcePath, False, True, "Excel 8.0;")
  Set rs = db.OpenRecordset("sheet1$", dbOpenTable)
  
  i=0
  do not rs.eof
    i=i+1
    for =j to 5
      data(i,j)=rs.field(j-1)
    next j
    rs.movenext
  loop 
  
  往Excel里写数据也可以用数据库方式。
 

#2


兄弟,我是往Excel里寫數據,而不是從Excel往外調數據

#3


改用插件速度好像会快些,当然,要Disable掉Screenupdating。

#4


henryw() :
什麽插件??怎麽用?多謝!

#5


对不起,可能我说的不清楚。自己写com add-in,用VB好像更*一些。
此外,直接写入Excel的方式能否改成先将结果写到一个文本文件中,然后再用Excel导入,再做格式化,如此速度可能会快一些。

#6


老大,不行的,我有幾十個 sheet的內容要顯示,不好倒到文本文件中去!

#7


建议使用F1Book控件,显示数据用此控件,然后可以使用控件的导出功能,导成excel表格或者其他的很多类型,速度比较快。

#8


coolsky(天心) 
我的Excel文檔有嚴格的格式限制.所以你將的方法是不行的

#9


SOS

#10


非常简单啦!
先将计算结果放在数组中,在数组中计算是非常快的!
然后用Range对象的FormulaArray属性将数组一次性复制到整个Range对象中。
这样做非常快!
详细情况自己去看Excel的帮助文件吧。

如还不清楚,可发邮件给我 user_hj@hotmail.com

#11


user_hj(office之友) ,
我先去試試.
不懂再向你請教!
多謝!

#12


user_hj(office之友) ,
我先去試試.
不懂再向你請教!
多謝!

#13


user_hj(office之友)老大,你果然牛.
速度是快了一倍.
請你道http://www.csdn.net/expert/topic/915/915177.xml?temp=.2821466
上去領分.再次感謝.

另外感謝諸位兄弟姊妹!
另外有點補充我受難的心得:
===================================================
如何提高VBA程序速度
===================================================
1.最好用模版Excel文件,因為自己創建的如果要頁面設置的話,速度會像生小孩一樣慢!
2.最好不要用Cell對象來操作,用Range對象會快些.
3.像user_hj(office之友)個們所說,先将计算结果放在数组中,在数组中计算是非常快的!然后用Range对象的FormulaArray属性将数组一次性复制到整个Range对象中。這很管用.速度會提高一倍!!!!!多謝他!
4.將Application.ScreenUpdating属性设为False.速度會提高15%-25%.

好了,我就寫這麼多,歡迎大家交流,和补充.
我新開了個交流的帖子,希望大家去發表意見.
http://www.csdn.net/expert/topic/934/934155.xml?temp=.2673151
我的Mail:liangxyb@163.net

#1


同道中人啊,我以前用VBA也是这样的慢,后来改为数据库就变快了。读取Excel数据的主要代码如下:
  
  Dim db As DAO.Database
  Dim rs As DAO.Recordset  
  Dim SourcePath as String
  Dim data(100,5)       '100,5可以改,也可以定义为动态数组
  dim i,j as integer

  SourcePath="d:\book1.xls"
  Set db = OpenDatabase(SourcePath, False, True, "Excel 8.0;")
  Set rs = db.OpenRecordset("sheet1$", dbOpenTable)
  
  i=0
  do not rs.eof
    i=i+1
    for =j to 5
      data(i,j)=rs.field(j-1)
    next j
    rs.movenext
  loop 
  
  往Excel里写数据也可以用数据库方式。
 

#2


兄弟,我是往Excel里寫數據,而不是從Excel往外調數據

#3


改用插件速度好像会快些,当然,要Disable掉Screenupdating。

#4


henryw() :
什麽插件??怎麽用?多謝!

#5


对不起,可能我说的不清楚。自己写com add-in,用VB好像更*一些。
此外,直接写入Excel的方式能否改成先将结果写到一个文本文件中,然后再用Excel导入,再做格式化,如此速度可能会快一些。

#6


老大,不行的,我有幾十個 sheet的內容要顯示,不好倒到文本文件中去!

#7


建议使用F1Book控件,显示数据用此控件,然后可以使用控件的导出功能,导成excel表格或者其他的很多类型,速度比较快。

#8


coolsky(天心) 
我的Excel文檔有嚴格的格式限制.所以你將的方法是不行的

#9


SOS

#10


非常简单啦!
先将计算结果放在数组中,在数组中计算是非常快的!
然后用Range对象的FormulaArray属性将数组一次性复制到整个Range对象中。
这样做非常快!
详细情况自己去看Excel的帮助文件吧。

如还不清楚,可发邮件给我 user_hj@hotmail.com

#11


user_hj(office之友) ,
我先去試試.
不懂再向你請教!
多謝!

#12


user_hj(office之友) ,
我先去試試.
不懂再向你請教!
多謝!

#13


user_hj(office之友)老大,你果然牛.
速度是快了一倍.
請你道http://www.csdn.net/expert/topic/915/915177.xml?temp=.2821466
上去領分.再次感謝.

另外感謝諸位兄弟姊妹!
另外有點補充我受難的心得:
===================================================
如何提高VBA程序速度
===================================================
1.最好用模版Excel文件,因為自己創建的如果要頁面設置的話,速度會像生小孩一樣慢!
2.最好不要用Cell對象來操作,用Range對象會快些.
3.像user_hj(office之友)個們所說,先将计算结果放在数组中,在数组中计算是非常快的!然后用Range对象的FormulaArray属性将数组一次性复制到整个Range对象中。這很管用.速度會提高一倍!!!!!多謝他!
4.將Application.ScreenUpdating属性设为False.速度會提高15%-25%.

好了,我就寫這麼多,歡迎大家交流,和补充.
我新開了個交流的帖子,希望大家去發表意見.
http://www.csdn.net/expert/topic/934/934155.xml?temp=.2673151
我的Mail:liangxyb@163.net