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里写数据也可以用数据库方式。
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导入,再做格式化,如此速度可能会快一些。
此外,直接写入Excel的方式能否改成先将结果写到一个文本文件中,然后再用Excel导入,再做格式化,如此速度可能会快一些。
#6
老大,不行的,我有幾十個 sheet的內容要顯示,不好倒到文本文件中去!
#7
建议使用F1Book控件,显示数据用此控件,然后可以使用控件的导出功能,导成excel表格或者其他的很多类型,速度比较快。
#8
coolsky(天心)
我的Excel文檔有嚴格的格式限制.所以你將的方法是不行的
我的Excel文檔有嚴格的格式限制.所以你將的方法是不行的
#9
SOS
#10
非常简单啦!
先将计算结果放在数组中,在数组中计算是非常快的!
然后用Range对象的FormulaArray属性将数组一次性复制到整个Range对象中。
这样做非常快!
详细情况自己去看Excel的帮助文件吧。
如还不清楚,可发邮件给我 user_hj@hotmail.com
先将计算结果放在数组中,在数组中计算是非常快的!
然后用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
速度是快了一倍.
請你道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里写数据也可以用数据库方式。
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导入,再做格式化,如此速度可能会快一些。
此外,直接写入Excel的方式能否改成先将结果写到一个文本文件中,然后再用Excel导入,再做格式化,如此速度可能会快一些。
#6
老大,不行的,我有幾十個 sheet的內容要顯示,不好倒到文本文件中去!
#7
建议使用F1Book控件,显示数据用此控件,然后可以使用控件的导出功能,导成excel表格或者其他的很多类型,速度比较快。
#8
coolsky(天心)
我的Excel文檔有嚴格的格式限制.所以你將的方法是不行的
我的Excel文檔有嚴格的格式限制.所以你將的方法是不行的
#9
SOS
#10
非常简单啦!
先将计算结果放在数组中,在数组中计算是非常快的!
然后用Range对象的FormulaArray属性将数组一次性复制到整个Range对象中。
这样做非常快!
详细情况自己去看Excel的帮助文件吧。
如还不清楚,可发邮件给我 user_hj@hotmail.com
先将计算结果放在数组中,在数组中计算是非常快的!
然后用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
速度是快了一倍.
請你道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