Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: willtools

[已解决]2000万级别的数据处理,求解决方案。

[复制链接]
发表于 2013-6-27 18:50 | 显示全部楼层    本楼为最佳答案   
我为了方便多次测试,所以将生成的数据放在新建的工作表SHEET1内。
如果一定要放在1112工作表的话,我可以修改代码。
完了,我没有分卷压缩工具,这样吧,我把方法和代码告诉你,你自己试试:
1、在工作表最后新建一个空白工作表,表名无所谓,但顺序一定要正确。
   顺序:1112⇒1104⇒新建工作表
2、在1112工作表内随便哪个你感觉方便的位置新建一个CommandButton,加入以下代码
3、运行时间在我的机器上是44秒多,结果生成在新建工作表内
  1. Private Sub CommandButton1_Click()
  2. t = Timer
  3. Dim arr, arr1, arr2, i&, j%, k&, l&
  4. arr = [a1].CurrentRegion
  5. arr1 = Sheets(2).[a1].CurrentRegion
  6. ReDim arr2(1 To UBound(arr) + UBound(arr1) - 2, 1 To UBound(arr, 2) + UBound(arr1, 2) - 2)
  7. For i = 2 To UBound(arr)
  8.   If Right(arr(i, 1), 1) = "X" Or Right(arr(i, 1), 1) = "x" Then arr(i, 1) = Left(arr(i, 1), Len(arr(i, 1)) - 1)
  9.   If Right(arr(i, 8), 1) = "X" Or Right(arr(i, 8), 1) = "x" Then arr(i, 8) = Left(arr(i, 8), Len(arr(i, 8)) - 1)
  10. Next i
  11. For i = 2 To UBound(arr1)
  12.   If Right(arr1(i, 1), 1) = "X" Or Right(arr1(i, 1), 1) = "x" Then arr1(i, 1) = Left(arr1(i, 1), Len(arr1(i, 1)) - 1)
  13.   If Right(arr1(i, 8), 1) = "X" Or Right(arr1(i, 8), 1) = "x" Then arr1(i, 8) = Left(arr1(i, 8), Len(arr1(i, 8)) - 1)
  14. Next i
  15. l = 1
  16. For i = 2 To UBound(arr)
  17.   For j = 1 To UBound(arr, 2)
  18.     arr2(l, j) = arr(i, j)
  19.   Next j
  20.   l = l + 1
  21.   For k = 2 To UBound(arr1)
  22.     If arr(i, 8) = arr1(k, 1) Then
  23.       For j = 1 To UBound(arr, 2)
  24.         arr2(l, j) = arr1(k, j)
  25.       Next j
  26.       l = l + 1
  27.     End If
  28.   Next k
  29. Next i
  30. Sheets(3).[a1].Resize(UBound(arr2), UBound(arr2, 2)) = arr2
  31. Erase arr: Erase arr1: Erase arr2
  32. MsgBox Timer - t
  33. End Sub
复制代码
回复

使用道具 举报

发表于 2013-6-27 19:14 | 显示全部楼层
大灰狼1976 发表于 2013-6-27 18:50
我为了方便多次测试,所以将生成的数据放在新建的工作表SHEET1内。
如果一定要放在1112工作表的话,我可以 ...

Erase arr: Erase arr1: Erase arr2   问一下 这个是什么意思
回复

使用道具 举报

 楼主| 发表于 2013-6-27 19:26 | 显示全部楼层
大灰狼1976 发表于 2013-6-27 18:50
我为了方便多次测试,所以将生成的数据放在新建的工作表SHEET1内。
如果一定要放在1112工作表的话,我可以 ...

谢谢你的代码。
但是我有几点不明白,需要请教你。
能不能把代码注释一下?
谢谢。

PS数组的效率真不错,比单元格强不少!
回复

使用道具 举报

发表于 2013-6-27 19:27 | 显示全部楼层
你查一下英文意思,擦除数组,释放内存。
回复

使用道具 举报

 楼主| 发表于 2013-6-27 19:36 | 显示全部楼层
大灰狼1976 发表于 2013-6-27 19:27
你查一下英文意思,擦除数组,释放内存。

ReDim arr2(1 To UBound(arr) + UBound(arr1) - 2, 1 To UBound(arr, 2) + UBound(arr1, 2) - 2)

这一句能解释一下吗?为什么都要-2
回复

使用道具 举报

发表于 2013-6-27 19:40 | 显示全部楼层
不好意思,后面的减2是错误的,请删除,手误!
前面减2的意思是,因为两张表都有标题行,我生成的数组不需要标题行,所以减去2,当然正常像你给的数据的情况下,减不减2都是一样的,因为真正匹配的数据不多,如果两个工作表全部行都能匹配插入的话,那新数组的行数就应该是每张表的行数之和再减去2个标题行2.
回复

使用道具 举报

发表于 2013-6-27 19:43 | 显示全部楼层
又错了,再补充说明:
ReDim arr2(1 To UBound(arr) + UBound(arr1) - 2, 1 To UBound(arr, 2) + UBound(arr1, 2) - 2)
改成:
ReDim arr2(1 To UBound(arr) + UBound(arr1) - 2, 1 To UBound(arr, 2))
无端耗用了很多空间,更改后速度应该还会略有提升。
回复

使用道具 举报

发表于 2013-6-27 20:25 | 显示全部楼层
用SQL呢。
还没有破65536条嘛。
回复

使用道具 举报

 楼主| 发表于 2013-6-27 22:04 | 显示全部楼层
大灰狼1976 发表于 2013-6-27 19:43
又错了,再补充说明:
ReDim arr2(1 To UBound(arr) + UBound(arr1) - 2, 1 To UBound(arr, 2) + UBound(a ...

明白了,因为我2个表的标题行都一样,如果我要保存一行标题行,如何操作?
难道是最后插入吗?
回复

使用道具 举报

发表于 2013-6-27 22:11 | 显示全部楼层
你2张表的标题行是有部分不一样的,需要哪张表的标题行可以在生成数组arr2后先赋值,从第2行开始放数据。
如果你需要直接放在1112表内,那就直接在第2行贴数组就可以了,标题行不会变动。
hwc2ycy高手的建议非常好,但是我还没有开始学SQL,所以没法解答,有时间要学一下了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-1 12:33 , Processed in 0.538872 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表