| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 267 人关注过本帖
标题:求协助优化我的程序,缩短运转时间。
只看楼主 收藏
ictest
Rank: 2
等 级:论坛游民
帖 子:166
专家分:45
注 册:2010-2-17
结帖率:72.73%
  已结贴   问题点数:50  回复次数:8   
求协助优化我的程序,缩短运转时间。
自己编写了一个程序,用于计算某种固定格式的EXCEL文件中某一列数据的和。

EXCEL文件格式如下:
第一列至第九列是用于筛选的条件值,具体参数项目从第十列开始,列数不定;
第一行为各项目名称,具体数值从第五行开始,行数不定。

我的软件运行方法:
附件解压缩后,运行软件,在FileListBOX中已有示例文件,直接点击command1,出现从第十列开始的参数项目名,勾选后,点击command2,计算选中参数的那一列从第5行开始到最后行的和。

现在我的软件问题:
已通过验证,计算数据正确,但是太慢了,计算一个参数的和竟需要200秒以上,接近四分钟啊,并且这只一个参数,一个文件啊。正常的情况是选5~10个参数,25个文件批量运行啊,

恳求版主,各位路过的高手一定要帮帮我,协助优化一下我的程序!多谢多谢!!!

附件: 您没有浏览附件的权限,请 登录注册
2017-08-03 08:42
ZHRXJR
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:45
帖 子:452
专家分:2621
注 册:2016-5-10
  得分:25 
呵呵!OB2362E_4SITE_144_T2_19.xls 文件有 31811 条记录,程序中有4层嵌套循环,有4套嵌套判断
那么运行结果是循环估计435万多次,加上31811记录的读取,应该要反复运行近14亿次,能在4分钟完成已经非常不错了。
你的代码可以优化,但非常费时、费事。

QQ    2653043392
2017-08-03 19:01
ictest
Rank: 2
等 级:论坛游民
帖 子:166
专家分:45
注 册:2010-2-17
  得分:0 
啊?!竟然是亿次计算!万万没想到!如果认为嵌套循环和嵌套判断太多了,有没有其他方法实现同等功能呢?
门外汉提点门外汉的方法(不知道能不能实现):比如把文件读入内存操作?再比如用VB编写实现同等功能的宏,让EXCEL运行宏这样是不是也能再快一点?
对于我这样的门外汉,完全比不上各位版主和路过的高手大侠的水平的万分之一,在这里十分的恳请各位的帮助解决这个问题。再次的拜谢!!!


2017-08-03 23:28
ZHRXJR
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:45
帖 子:452
专家分:2621
注 册:2016-5-10
  得分:0 
"在FileListBOX中已有示例文件,直接点击command1,出现从第十列开始的参数项目名,勾选后,点击command2,计算选中参数的那一列从第5行开始到最后行的和。"
这个意思不是特别明白,Check1选中,计算的是选中的这一列第5行以后的的和,仅仅是计算这一列是吗,那么就是说选中那一列,计算那一列对吗?计算后的结果保存在那里?
如果是这样,估计全部选中,也用不了1分钟。

[此贴子已经被作者于2017-8-4 09:46编辑过]


QQ    2653043392
2017-08-04 09:31
ictest
Rank: 2
等 级:论坛游民
帖 子:166
专家分:45
注 册:2010-2-17
  得分:0 
是的,是选中哪一列,就计算那一列,主要是这一列数据还要经过条件筛选。
2017-08-04 09:56
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:177
帖 子:3978
专家分:24505
注 册:2008-10-15
  得分:25 
我昨天也计算了一个运算量,大的惊人。

VB操作EXCEL,属于慢速操作中的慢速操作。要优化,就只能避免这种情况。
想到的办法:1、使用ado打开。我没装驱动,没装OFFICE,无法测试。
            2、全选所有的数据,然后复制到剪切板,然后读取并分解到数组里。这样去分析,应该会快一点。


[此贴子已经被作者于2017-8-4 11:22编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2017-08-04 11:20
ictest
Rank: 2
等 级:论坛游民
帖 子:166
专家分:45
注 册:2010-2-17
  得分:0 
非常非常认可“风吹过b”版主大大的第二种方法,十分的恳请“风吹过b”版主大大能在百忙中抽出一点时间帮助改写一下这个程序。
拜谢!拜谢!
2017-08-04 12:32
ZHRXJR
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:45
帖 子:452
专家分:2621
注 册:2016-5-10
  得分:0 
回复 5楼 ictest
哎,怎么回复均是说一点藏一点,你说要条件,什么条件,能不能一次说清楚。
我现在用ADO测试,一列数据没有条件1秒都不到

QQ    2653043392
2017-08-04 12:37
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:177
帖 子:3978
专家分:24505
注 册:2008-10-15
  得分:0 
我没时间去调试了,下面是 关键代码

Dim s As String         '所的数据
Dim f1() As String      '第一行分解结果
Dim f() As String       '所有行数据
Dim ft() As String      '当前行


xl.Workbooks.Open (Dir1.Path & "\" & File1.List(z2))        '打开文件
xl.Workbooks(1).Sheets(1).Range("A1:AW65535").Copy          '复制全部内容,行号用了最大的。使用 ET 测试最后有一个空行,但不会出现过多的空行
s = Clipboard.GetText                                       '取文本
f = Split(s, vbCrLf)                                        '分解成行
f1 = Split(f(0), vbTab)                                     '第一行

ft = Split(f(y2), vbTab)                    '每一行

因为每行分解后的数据是不保留的,所以循环要变化一下,如果你变化不了,那就按你前面的循环,每次重新分解数据吧。
第一层:文件
第二层:每一行
第三层:每个选择的字段
第四层:对应的每个行次里的字段。使用序号


---------------------------
你原来代码里优化:
                For y2 = 5 To (st.UsedRange.Rows.Count - 4)
               
                    If st.Cells(y2, 4).Value = "1" Then
                    tmpl = st.Cells(y2, x2).Value        '先取值,其实按下面优化了,不用再多这一个变量也行
                    
                    Select Case st.Cells(y2, 2).Value        '代替原来的 多个IF
                    Case "0"
                        a2 = a2 + tmpl
                    Case "1"
                        b2 = b2 + tmpl
                    Case "2"
                        c2 = c2 + tmpl
                    Case "3"
                        d2 = d2 + tmpl
                    Case "4"
                        e2 = e2 + tmpl
                    Case "5"
                        f2 = f2 + tmpl
                    Case "6"
                        g2 = g2 + tmpl
                    Case "7"
                        h2 = h2 + tmpl
                    End Select
                    End If
               
                Next y2
                Exit For        '本次计算完毕,退出当前查找字段
            End If

授人于鱼,不如授人于渔
早已停用QQ了
2017-08-04 12:43









关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029807 second(s), 8 queries.
Copyright©2004-2017, BCCN.NET, All Rights Reserved