首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

两个报表比较,提高效率

2013-09-28 
两个表格比较,提高效率现在有两个表格A,B, A和B的第一列内容有相同,把A的第一列内容和B的第一列逐一比较,

两个表格比较,提高效率
现在有两个表格A,B, A和B的第一列内容有相同,把A的第一列内容和B的第一列逐一比较,如果相同,则把A的第二列内容考到B的第二列,我现在用的For循环来做,代码大概如下,但是如果比较内容多的话,效率太低了,可能完成比较要用10多分钟甚至更长。
For i =1 to 3000
  for j = 1 to 3000
     if A.cells(i,1) = B.cells(j,1) then
        B.cells(j,2)=A.cells(i,2)
     endif
   next
next

大概知道可能可以使用字典,不过不太会用字典,各位大虾能否给例子,或者提供一下其它思路。最好能个例子。谢谢, 急
[解决办法]
把A与B的数据导入到数据库中操作,一条更新语句就可以实现:
UPDATE B SET B.b2=A.a2 FROM B INNER JOIN A ON B.b1=A.a1

[解决办法]
用 Dictionary 对象来处理的方法:

Option Explicit
'在VBA编辑器菜单“工具”→“引用”中,引用:
' Microsoft Scripting Runtime
Private Sub CopyData()
    'Dim A As Worksheet
    'Dim B As Worksheet
    Dim objDict As Dictionary
    Dim i As Long, strTemp As String
    

    'Set A = Sheet1
    'Set B = Sheet2
    Set objDict = New Dictionary
    For i = 1 To 3000
        strTemp = A.Cells(i, 1)
        'If (Not objDict.Exists(strTemp)) Then objDict.Add strTemp, i
        objDict.Add strTemp, i
    Next
    For i = 1 To 3000
        strTemp = B.Cells(i, 1)
        If objDict.Exists(strTemp) Then _
                B.Cells(i, 2) = A.Cells(objDict.Item(strTemp), 2)
    Next
    objDict.RemoveAll
    Set objDict = Nothing
End Sub

这个要求A表的A列数据无重复。

如果有重复,就要用上 If 的那一句。
同时,B表只能复制到A表重复项中第一个的B列的数据(你用双重循环,也是这样的结果)。

[解决办法]
我觉得应该从另一个角度来解决,即不要调用对象,而是直接对字符串数组操作,因为有可能主要开销是在调用对象接口上面.

测试一下吧:

先把你的A与B内容复制到数组中,再在数组中比较:

dim strArrA() as string,strArrB() as string

strarra()=A.range("A1:B3000")      '一次性读入数组
strarrb()=b.range("A1:B3000")

redim strarrc(ubound(strarra))     '分配空间
outindex=-1

For i =0 to 2999
  for j = 0 to 2999
     if strarra(i,0) = strarrb(j,0) then
        strarrb(i,1)=strarra(j,1)
     endif
   next
next

A.range("A1:B3000")=strarra()      '一次性从数组写入EXCEL对象
B.range("A1:B3000")=strarrb()

[解决办法]
直接使用公式吧

=IFERROR(INDEX(Sheet1!$B:$B,MATCH(Sheet2!A1,Sheet1!$A:$A,0)),"")

3000行数据很快就处理完
[解决办法]
或者公式
=VLOOKUP(A1,Sheet1!A:B,2,FALSE)
[解决办法]
引用:
把A与B的数据导入到数据库中操作,一条更新语句就可以实现:
UPDATE B SET B.b2=A.a2 FROM B INNER JOIN A ON B.b1=A.a1


不导入 Access,直接把 Excel 当作 ADO 的外部数据库来操作应该也可以。

热点排行