Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2615|回复: 6

[已解决]批量数据组合的问题

[复制链接]
发表于 2015-1-6 14:34 | 显示全部楼层 |阅读模式
本帖最后由 晓敏 于 2015-1-6 15:52 编辑

附件 批量数据组合附件.zip (6.32 KB, 下载次数: 8)
发表于 2015-1-6 15:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 香川群子 于 2015-1-6 22:23 编辑
  1. Sub test()
  2.     Dim ar, br&(), cr&(), i&, j&, k&, m&, n&, r&, t&, cnt&, tms#
  3.     tms = Timer
  4.    
  5.     ar = Sheet1.[a1].CurrentRegion
  6.     m = UBound(ar): n = UBound(ar, 2)
  7.    
  8.     ReDim br&(1 To m, 1 To n)
  9.     For j = 1 To n
  10.         ReDim cr&(99, m)
  11.         For i = 3 To m
  12.             t = ar(i, j): k = cr(t, 0) + 1: cr(t, 0) = k: cr(t, k) = i
  13.         Next
  14.         
  15.         cnt = 0
  16.         For i = 0 To 99
  17.             If cr(i, 0) > 1 Then
  18.                 For k = 1 To cr(i, 0)
  19.                     cnt = cnt + 1
  20.                     t = cr(i, k)
  21.                     'br(cnt, j) = ar(t - 2, j) & ar(t - 1, j) & ar(t, j)
  22.                     '……1位数时会产生漏0拼接错误 如 19 26 6 成为 019266 而不是期望的192606
  23.                     br(cnt, j) = ar(t - 2, j) * 10000 + ar(t - 1, j) * 100 + ar(t, j) '改成这样计算就没问题了。
  24.                 Next
  25.             End If
  26.         Next
  27.         If cnt > r Then r = cnt
  28.     Next
  29.    
  30.     Sheet2.Activate
  31.     [a1].CurrentRegion = ""
  32.     [a1].Resize(r, n).NumberFormat = "000000"
  33.     [a1].Resize(r, n) = br
  34.     MsgBox Format(Timer - tms, "0.000s")
  35. End Sub
复制代码

Chk 3.zip

13.08 KB, 下载次数: 10

评分

参与人数 1 +3 收起 理由
晓敏 + 3 很给力!

查看全部评分

回复

使用道具 举报

发表于 2015-1-6 15:47 | 显示全部楼层
算法原理:

① 遍历各行、统计相同数个数并记录所在行位置
② 检查返回相同数>1时对应的合并6位数

回复

使用道具 举报

 楼主| 发表于 2015-1-6 15:53 | 显示全部楼层
香川群子 发表于 2015-1-6 15:47
算法原理:

① 遍历各行、统计相同数个数并记录所在行位置

谢谢老师帮助。
人长得靓,代码写得也靓。
回复

使用道具 举报

 楼主| 发表于 2015-1-6 16:40 | 显示全部楼层
本帖最后由 晓敏 于 2015-1-6 16:41 编辑
香川群子 发表于 2015-1-6 15:47
算法原理:

① 遍历各行、统计相同数个数并记录所在行位置


老师您好,刚才正式运用的时候,仔细一看,有点不对劲啊。

三个小于或等于49的两位数组合,比如:01  33  37 ,组合后,是013337,其中,十位数,千位数,十万位数,这三个位置的数,不能有大于4的数出现。

附件中的结果,第一个组合体是:
019266
这里十位数与千位数,已经大于4了。显然这个结果是错误的。

经过百多列数据仔细对比,发现十位与千位这两个位置都或多或少有大于4的结果出现。十万位即超始位,还没发现。

麻烦老师看看,谢谢了。
回复

使用道具 举报

发表于 2015-1-6 22:19 | 显示全部楼层
晓敏 发表于 2015-1-6 16:40
老师您好,刚才正式运用的时候,仔细一看,有点不对劲啊。

三个小于或等于49的两位数组合,比如:01 ...

合并6位数的代码改一下:

原来:
br(cnt, j) = ar(t - 2, j) & ar(t - 1, j) & ar(t, j) …… 19 26 06 变成了 19266 → 019266

改为:
br(cnt, j) = ar(t - 2, j) * 10000 + ar(t - 1, j) * 100 + ar(t, j)


自己改一下吧。



回复

使用道具 举报

 楼主| 发表于 2015-1-7 16:11 | 显示全部楼层
香川群子 发表于 2015-1-6 22:19
合并6位数的代码改一下:

原来:

谢谢老师。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 17:58 , Processed in 0.415133 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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