| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3898 人关注过本帖
标题:想请教一个问题,已经问过很多专业的编程人员,但都没能解答
只看楼主 加入收藏
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:941
专家分:5244
注 册:2015-8-10
收藏
得分:0 
回复 9楼 start1901
我看你的代码你用的是Cell,
我说的是Range,比如Range("A1:D2)这样
一个是一格一格,我这是一片一片
2018-03-12 16:24
start1901
Rank: 1
等 级:新手上路
帖 子:25
专家分:4
注 册:2018-2-26
收藏
得分:0 
回复 11楼 xiangyue0510
我改成cells().resize(1,10)了,也就是range,但依然很慢
2018-03-12 23:26
start1901
Rank: 1
等 级:新手上路
帖 子:25
专家分:4
注 册:2018-2-26
收藏
得分:0 
回复 10楼 wds1
今天想了想,会不会不是复制粘贴导致的缓慢,因为,我观察软件运行的时候,前20秒没有复制文件,可是速度也慢了下来
这是什么原因啊?
2018-03-12 23:29
wds1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:49
帖 子:393
专家分:2025
注 册:2016-3-10
收藏
得分:0 
慢的原因就是I/o操作,所以建议你全部更改为内存操作。
如果你用execl的语句操作,数据量越大会越慢。

你没明白慢的本质原因,是由于I/o造成。
2018-03-13 12:38
start1901
Rank: 1
等 级:新手上路
帖 子:25
专家分:4
注 册:2018-2-26
收藏
得分:0 
回复 14楼 wds1
怎样使用内存操作啊,求大神给点具体的指导,或者给段可以借鉴的代码
是不是指我要把cell里的内容放到变量里,再把变量的值赋给新表的cell,是这样么?

[此贴子已经被作者于2018-3-13 22:32编辑过]

2018-03-13 22:29
Artless
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:4211
专家分:28888
注 册:2009-4-8
收藏
得分:3 
以下是引用start1901在2018-3-13 22:29:15的发言:

怎样使用内存操作啊,求大神给点具体的指导,或者给段可以借鉴的代码
是不是指我要把cell里的内容放到变量里,再把变量的值赋给新表的cell,是这样么?

数组

无知
2018-03-14 02:00
wds1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:49
帖 子:393
专家分:2025
注 册:2016-3-10
收藏
得分:0 
下面1,2是execl的一次性读取和保存示例,供调试和参考。另外数据量小的读取也可以直接用Excel.Application

你在比较时用内存数组,结果也用内存数组,之后保存。

1、execl读到内存数组txt1【直接调用函数,我的驱动是对xls格式的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
    '此处如果增加显示读取行数idea语句,增加doevents
  Next i
  Set rs = Nothing
  Set cn = Nothing
End Sub
2、txt2保存到execl
Public Sub Save_Execl(txt2)
Dim nRows As Long, nColumns As Long
 Set NewXls = CreateObject("Excel.Application") '创建excel应用程序
     NewXls.SheetsInNewWorkbook = 1
 Set newbook = NewXls.Workbooks.Add '创建工作簿
 Set NewSheet = newbook.Worksheets(1) '创建工作表
     NewXls.DisplayAlerts = False  '
      
   nRows = UBound(txt1, 1)
   nColumns = UBound(txt1, 2)
      
   '导出到Excel中
   Set objRange = NewSheet.Range(NewSheet.Cells(1, 1), NewSheet.Cells(nRows, nColumns))
      objRange.Value = txt2
       NewXls.Workbooks(1).Worksheets(1).Name = "D1H"
  newbook.SaveAs FileName:="execl名"
  newbook.Close
   Set newbook = Nothing
   Set NewXls = Nothing
end sub



[此贴子已经被作者于2018-3-14 10:01编辑过]

2018-03-14 09:58
wds1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:49
帖 子:393
专家分:2025
注 册:2016-3-10
收藏
得分:0 
数据处理.zip (615.2 KB)

今天正好空闲,把你的程序修改了一下。
1、主要修改读取部分,采用把execl直接读取到内存数组execla,之后在内存中形成临时测井数据,再保存为execl
2、比较部分,采用把execl直接读取到内存数组execla,execlb,之后在内存中比较形成新的execl,之后保存

其他说明:
1、由于不知道你的程序的具体用途,所以结果我没发验证。但你的程序刷选应该还可以优化的。
2、另外你临时保存在c盘目录的execl都没有必要,但是为了减少修改量,我几乎没有修改你的程序结构
3、测试后临时表都能输出,处理速度比你的提高不是10倍,具体自己测试。

2018-03-16 16:29
def0011
Rank: 2
等 级:论坛游民
威 望:1
帖 子:6
专家分:18
注 册:2015-1-11
收藏
得分:3 
excel里面表格的复制很简单的,效率绝对没问题:
Sheet1.Range("a1:a15").Copy Sheet2.Range("a1")
2018-03-16 17:10
start1901
Rank: 1
等 级:新手上路
帖 子:25
专家分:4
注 册:2018-2-26
收藏
得分:0 
回复 18楼 wds1
得到的新表是空白的啊,我以前的程序是可以得到结果的,
但还是感谢,我在学习下你的代码吧
(软件的目的是根据表2,劈分表1,得到新表,劈分后的一个单元一个sheet)
2018-03-17 00:49
快速回复:想请教一个问题,已经问过很多专业的编程人员,但都没能解答
数据加载中...
 
   



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

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