[转]关于VBA到VB时程序执行速度变慢的原因和解决方法
2010-02-09 22:02阅读:
楼主titihao()2005-08-08 11:37:51 在 VB / VBA 提问
当我在试着把VBA中的程序移植到VB中去的时候,发现执行速度明显变慢,当我用一小段代码寻找1000行数据中是否有重复的项目时,在EXCEL
VBA中用了1秒钟的时间,然而在VB中却用了1分钟20秒,
大家有什么好的建议吗?欢迎讨论,谢谢!
1 楼titihao()回复于 2005-08-08 11:42:04 得分 0
哦,忘了说了我用的是Windows XP + VB6.0 + Office 2003.
3 楼titihao()回复于 2005-08-08 13:02:33 得分 0
程序见下面,测试之前要把一个工作表的名称改为“FORM03',呵呵,,多费心了....
经过上网查资料我现在可以很快速的实现将一个数组中的内容快速地写回EXCEL中去,但是如何快速的从EXCEL中将数据读入数组中我没有好的方法,
Dim xlApp As Excel.Application
Dim DATAbase As Excel.Workbook
Dim DataBaseFile As String
Sub SelectDouble2()
Dim startime As Date
Dim stoptime As Date
Dim runtime As Date
Dim i As Long, j As Long
Dim max As Long
Dim a() As String, b() As Long
startime = Now()
Set xlApp = CreateObject('Excel.Application')
'创建EXCEL应用类
xlApp.Visible = True '设置EXCEL可见
DataBaseFile = Application.GetOpenFilename('excel
Files (*.xls), *.xls', 1, 'Please select a DataBase File:')
Set DATAbase = xlApp.Workbooks.Open(DataBaseFile)
max = 1000
ReDim a(max) As String
ReDim b(max) As Long
For i = 1 To max Step 1 '这里要很长时间运行
a(i) = DATAbase.Worksheets('FORM03').Range('B'
& i).Value
Next i
For i = 1 To max Step 1
For j = 1 To max Step 1
'不比较相同的行
If i <> j Then
If a(i) = a(j) Then
b(i) = 1
End If
End If
Next j
Next i
For i = 1 To max Step 1 '这里也要很长时间运行,不过已经搞定了
DATAbase.Worksheets('FORM03').Range('R' &
i).Value = b(i)
Next
stoptime = Now()
runtime = stoptime - startime
c = Str(runtime)
MsgBox c + 's'
End Sub
Private Sub Command1_Click()
Form1.SelectDouble2
End Sub
5 楼titihao()回复于 2005-08-08 20:38:54 得分 0
DawnPine(拂晓的松) :
谢谢你的关心,是这样子的,我想在VB中实现在对两个EXCEL文件进行操作,(其中有一个是库文件),这样就需要对几列数数进行比较,我的想法是通过数组来操作这些数据,所以就有上面的读一列去到一个数组了,在对这些数组进行比较后需要把库文件中的一些数据写回到EXCEL文件中去,但上面的程序执行时间太长了,呵呵,,
可能通过数组去处理上述问题是很笨的方法吧,不过我实在是想不出其它的方法了,呵呵,,
说了一大堆,也不知你听明白了没有?呵呵,,
6 楼titihao()回复于 2005-08-08 20:44:17 得分 0
关于快速写回EXCEL文件其实挺简单的,,
在这里我是把一个数组中的一些数据快速地写回EXCEL文件是是用了如下的方法:
DIM DATASOURCE(100,2)
sheets('Sheet1').range('A1:B100')=DATASOURCE
这里要注意的是数组的大小要与EXCEL中的单元格范围要一模一样,上面的执行速度比用循环写进EXCEL快了不少,用循环大约要17秒,但用上面的方法只要1秒左右,呵呵,我也是在网上看到了,,见笑了。
7 楼zlt982001(乐天)回复于 2005-08-08 21:27:51 得分 20
VBA 和 VB 的速度应该是差不多的, vb 如果采用编译后运行,会更快,你上面的时间差异是由于
创建 excel 对象需要时间。vba 由于是运行在excel
中,本身已经节省了重新创建对象的时间
10 楼titihao()回复于 2005-08-09 10:08:24 得分 0
哈哈,终于搞定,原来如此简单
直接在开始的时候定义一个变量为变体型的,Dim DATASOURCE As
Variant,然后直接把EXCEL中的数据赋值给它,
DATASOURCE=.....RANGE(“A1:B200')
这样之后DATASOURCE就变成了数组型的,呵呵,可以按数组的方式去操作了,不过要注意维数的对应关系。
采用上面的方法在提取数据的时候快了很多倍,大家可以测试一下,,
再次感谢大家的帮助,谢谢了,没有你们的提示也不会有这么快呀,,呵呵,,