| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 856 人关注过本帖
标题:想请教一个问题,已经问过很多专业的编程人员,但都没能解答
只看楼主 收藏
start1901
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2018-2-26
结帖率:25%
  已结贴   问题点数:20  回复次数:23   
想请教一个问题,已经问过很多专业的编程人员,但都没能解答
想请教一个问题,已经问过很多专业的编程人员,可能他们都不接触vb与excel,都没给我想要的解答,至今百思不得其解
我写了一个vb的程序处理excel里的数据,
主要功能是:打开两个excel,A和B,再新建一个excel,C
A里面有8000多行的数据,我的软件根据B表里面的范围及条件,把A表中对应数据行粘贴到新表C中
复制、粘贴用的是 :
xlbook.sheets(1).cells(i,2).resize(1,6).Copy
Zlbook.sheets(1).cells(j,2).resize(1,6).Pastespical
软件运行得很正常,结果正确
但问题是:
开始时运行很快,一秒能粘贴很多行,但过一段时间软件就开始越来越慢,一秒粘贴一行,后来就几秒才粘贴一行
我写的循环很简单,反复查过不是循环导致的
前面粘贴的和后面粘贴的都差不多,不知道为什么,到后来就非常非常慢了

想请教大家,在筛查、复制、粘贴大量数据的时候是否也是这样,该怎样解决?



我上传了一个压缩包,如图,有两个excel,第一个提到的A,第二个是提到的B
再如图,软件的三个按钮,点按钮一导入第一个excel,点按钮二导入第二个excel
按钮三是开始处理,也就是慢的那部分,可否帮看一下为什么运行这么慢,(我上传的工区是vb6.0)

[此贴子已经被作者于2018-3-12 00:12编辑过]

附件: 您没有浏览附件的权限,请 登录注册
2018-03-10 17:48
suzhanpeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:45
专家分:168
注 册:2016-9-28
  得分:3 
提供源码吧
2018-03-11 09:57
wds1
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:20
帖 子:212
专家分:1148
注 册:2016-3-10
  得分:3 
1、读取的execl增加以下语句  
  xlApp.Visible = False
2、保存的语句增加
 NewXls.DisplayAlerts = False
3、读取要一次性读到内存,写入也要一次性写入

你试试以上方法,数据量大的一般能提高5倍以上效率,数据量小的区别不大。


2018-03-11 10:20
xyxcc177
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:141
专家分:910
注 册:2017-7-8
  得分:3 
用数组,把要复制的数据据先写入数组中,一次性写入非常快,10万条数据也是瞬间。
2018-03-11 14:45
start1901
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2018-2-26
  得分:0 
回复 3楼 wds1
前两句明白一点,让表格不可见、警告窗口别弹出,不太明白第三句是什么意思,具体该怎样办,请指点一下
2018-03-12 00:11
start1901
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2018-2-26
  得分:0 
回复 2楼 suzhanpeng
提供了,帮忙看一下前两个按钮是导入,可否帮忙看一下第三个按钮为什么慢
2018-03-12 00:14
start1901
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2018-2-26
  得分:0 
回复 4楼 xyxcc177
想请教下,我的格子里有字符也有数字,数组应该是用什么数据类型,
是不是说复制的时候,把要复制的每个格子都放到数组里,粘贴的时候再一个一个cells的粘出来?
请教了
2018-03-12 00:53
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:85
帖 子:908
专家分:5207
注 册:2015-8-10
  得分:3 
不用使用range整体进行复制粘贴么?
2018-03-12 10:58
start1901
Rank: 1
等 级:新手上路
帖 子:19
专家分:4
注 册:2018-2-26
  得分:0 
回复 8楼 xiangyue0510
我就是range整体复制,很慢
2018-03-12 14:00
wds1
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:20
帖 子:212
专家分:1148
注 册:2016-3-10
  得分:0 
1、你导入的1号文件和2号文件不要存在C盘,保存到内存数组,同时只读取包含数据记录,可以参考以下函数
'============================================================
'  读取EXECL到内存数组【需要DAO控件,速度快-优选】
'  输入参数:execl名字、sheet名
'  输出参数:txt1内存数组【execl数据到内存数组】
'============================================================
Public Sub Load_Execl(ByVal execl_name As String, ByVal sheet_name, txt1)
  Dim cn As New ADODB.Connection
  Dim rs As New ADODB.Recordset
  Dim i As Long, j As Long
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & execl_name & ";extended properties= 'Excel 8.0;HDR=YES;IMEX=1';"
  rs.Open "select * from [" + sheet_name + "$]", cn, adOpenKeyset, adLockOptimistic
  ReDim txt1(rs.RecordCount, rs.Fields.Count)
  For i = 1 To rs.Fields.Count: txt1(0, i) = rs.Fields(i - 1).Name: Next i '读第一行【首行当标题了】
  For i = 1 To rs.RecordCount '读其余行
    For j = 1 To rs.Fields.Count: txt1(i, j) = IIf(Not IsNull(rs.Fields(j - 1)), rs.Fields(j - 1), ""): Next j
    rs.MoveNext
  Next i
  Set rs = Nothing
  Set cn = Nothing
End Sub
  数据调用格式:call Load_Execl("第二个按钮导入.xlsx", "sheet1", txt1)
         call Load_Execl("第一个按钮导入done.xlsx", "D1H", txt2)

2、数据比较时,采用txt1,txt2内存数组对比,之后保存目标execl


2018-03-12 14:31







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

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