新浪博客

[转]关于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就变成了数组型的,呵呵,可以按数组的方式去操作了,不过要注意维数的对应关系。
 采用上面的方法在提取数据的时候快了很多倍,大家可以测试一下,,
 再次感谢大家的帮助,谢谢了,没有你们的提示也不会有这么快呀,,呵呵,,

我的更多文章

下载客户端阅读体验更佳

APP专享