Excel精英培训网

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

[已解决]如何用VBA将相部分列内容相同的行合并成一行

[复制链接]
发表于 2015-5-25 10:27 | 显示全部楼层 |阅读模式

规则        "1.若项目编号及内容1,内容2,内容3全部完全相同,将内容5,6,7放在一行.此时如果内容4相同,则取其中任意一个;若不同,则将内容合并。
2.若内容1,2,3中有任意一个不同,则分为多行"                                                                                                                                       
原内容                                                       
                                                       
项目编号        内容1        内容2        内容3        内容4        内容5        内容6        内容7
A        你好        我是1        断裂        牛        3.5        -        -
A        你好        我是1        断裂        牛        -        7.5        -
B        橘子        橙子        苹果        猪        2        4        -
A        你好        我是1        断裂        牛        -        -        10
C        收音机        洗衣机        橱柜        桌子        2        -        -
C        收音机        洗衣机        电脑        椅子        -        4        -
B        橘子        橙子        苹果        羊        -        -        3
                                                       
                                                       
目标内容                                                       
                                                       
项目编号        内容1        内容2        内容3        内容4        内容5        内容6        内容7
A        你好        我是1        断裂        牛        3.5        7.5        10
B        橘子        橙子        苹果        猪.羊        2        4        3
C        收音机        洗衣机        橱柜        桌子        2        -        -
C        收音机        洗衣机        电脑        椅子        -        4        -

                                               
最佳答案
2015-5-25 12:12
zhaoguang0920 发表于 2015-5-25 11:33
您好,您的这个我打开之后显示macro unavailable。您能把代码粘过来吗,谢啦

alt+f11查看代码
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, j%, s&, n&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = [a5:h12]
  5. ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
  6. For i = 1 To UBound(arr)
  7.     zf = arr(i, 1) & arr(i, 2) & arr(i, 3) & arr(i, 4)
  8.     If Not d.exists(zf) Then
  9.         s = s + 1
  10.         d(zf) = s
  11.         For j = 1 To UBound(arr, 2)
  12.             brr(s, j) = arr(i, j)
  13.         Next
  14.     Else
  15.         n = d(zf)
  16.         If InStr(brr(n, 5), arr(i, 5)) = 0 Then brr(n, 5) = brr(n, 5) & "." & arr(i, 5)
  17.         For j = 6 To UBound(arr, 2)
  18.             If IsNumeric(arr(i, j)) Then brr(n, j) = arr(i, j)
  19.         Next
  20.     End If
  21. Next
  22. Range("a17").Resize(s, UBound(brr, 2)) = brr
  23. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2015-5-25 10:29 | 显示全部楼层
详情见附件

Book 2.zip

7.43 KB, 下载次数: 25

回复

使用道具 举报

发表于 2015-5-25 11:11 | 显示全部楼层
………………

Book 2.zip

14 KB, 下载次数: 65

回复

使用道具 举报

发表于 2015-5-25 11:22 | 显示全部楼层
  1. Sub tt()
  2.     arr = [a1].CurrentRegion
  3.     ReDim brr(1 To UBound(arr), 1 To 100)
  4.     Set d = CreateObject("scripting.dictionary")     '控制行
  5.     Set d1 = CreateObject("scripting.dictionary")       '控制列
  6.     For i = 1 To UBound(arr)
  7.         x = arr(i, 1) & arr(i, 2) & arr(i, 3) & arr(i, 4) & arr(i, 5)
  8.         If Not d.exists(x) Then
  9.             n = n + 1
  10.             d(x) = n
  11.             For j = 1 To 5:   brr(n, j) = arr(i, j): Next
  12.             d1(x) = 5
  13.         End If
  14.         p = d(x)
  15.         For j = 6 To UBound(arr, 2)
  16.             If Len(arr(i, j)) > 0 And InStr(arr(i, j), "-") = 0 Then
  17.                 d1(x) = d1(x) + 1
  18.                 If d1(x) > jmax Then jmax = d1(x)
  19.                 brr(p, d1(x)) = arr(i, j)
  20.             End If
  21.         Next
  22.     Next
  23.     [a13].Resize(n, jmax) = brr
  24.     [a14].Resize(n - 1, jmax).Sort key1:=[a14]
  25. End Sub
复制代码

工作簿1.rar

10.39 KB, 下载次数: 45

回复

使用道具 举报

 楼主| 发表于 2015-5-25 11:33 | 显示全部楼层
dsmch 发表于 2015-5-25 11:11
………………

您好,您的这个我打开之后显示macro unavailable。您能把代码粘过来吗,谢啦
回复

使用道具 举报

 楼主| 发表于 2015-5-25 11:36 | 显示全部楼层
grf1973 发表于 2015-5-25 11:22

您好,测试之后结果如下:
项目编号         内容1         内容2         内容3         内容4         内容5         内容6         内容7
A         你好         我是1         断裂         牛         3.5         7.5         10
B         橘子         橙子         苹果         猪         2         4        
B         橘子         橙子         苹果         羊         3               
C         收音机         洗衣机         橱柜         桌子         2                
C         收音机         洗衣机         电脑         椅子         4        
B行的那个3跑到内容5里了,本来他应该是内容7的。
这肿么办呀。。       
回复

使用道具 举报

发表于 2015-5-25 12:12 | 显示全部楼层    本楼为最佳答案   
zhaoguang0920 发表于 2015-5-25 11:33
您好,您的这个我打开之后显示macro unavailable。您能把代码粘过来吗,谢啦

alt+f11查看代码
  1. Sub Macro1()
  2. Dim arr, brr, d, i&, j%, s&, n&
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = [a5:h12]
  5. ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
  6. For i = 1 To UBound(arr)
  7.     zf = arr(i, 1) & arr(i, 2) & arr(i, 3) & arr(i, 4)
  8.     If Not d.exists(zf) Then
  9.         s = s + 1
  10.         d(zf) = s
  11.         For j = 1 To UBound(arr, 2)
  12.             brr(s, j) = arr(i, j)
  13.         Next
  14.     Else
  15.         n = d(zf)
  16.         If InStr(brr(n, 5), arr(i, 5)) = 0 Then brr(n, 5) = brr(n, 5) & "." & arr(i, 5)
  17.         For j = 6 To UBound(arr, 2)
  18.             If IsNumeric(arr(i, j)) Then brr(n, j) = arr(i, j)
  19.         Next
  20.     End If
  21. Next
  22. Range("a17").Resize(s, UBound(brr, 2)) = brr
  23. End Sub
复制代码
回复

使用道具 举报

发表于 2015-5-25 13:20 | 显示全部楼层
没注意要求,以为前五项为key。改过来了。
  1. Sub tt()
  2.     arr = [a1].CurrentRegion
  3.     ReDim brr(1 To UBound(arr), 1 To 100)
  4.     Set d = CreateObject("scripting.dictionary")     '控制行
  5.     Set d1 = CreateObject("scripting.dictionary")       '控制列
  6.     For i = 1 To UBound(arr)
  7.         x = arr(i, 1) & arr(i, 2) & arr(i, 3) & arr(i, 4)
  8.         If Not d.exists(x) Then
  9.             n = n + 1
  10.             d(x) = n
  11.             For j = 1 To 5:   brr(n, j) = arr(i, j): Next
  12.             d1(x) = 5
  13.         End If
  14.         p = d(x)
  15.         If InStr(brr(p, 5), arr(i, 5)) = 0 Then brr(p, 5) = brr(p, 5) & "." & arr(i, 5)
  16.         For j = 6 To UBound(arr, 2)
  17.             If Len(arr(i, j)) > 0 And InStr(arr(i, j), "-") = 0 Then
  18.                 d1(x) = d1(x) + 1
  19.                 If d1(x) > jmax Then jmax = d1(x)
  20.                 brr(p, d1(x)) = arr(i, j)
  21.             End If
  22.         Next
  23.     Next
  24.     [a13].Resize(n, jmax) = brr
  25.     [a14].Resize(n - 1, jmax).Sort key1:=[a14]
  26. End Sub
复制代码

工作簿1.rar

10.36 KB, 下载次数: 98

回复

使用道具 举报

 楼主| 发表于 2015-5-26 10:17 | 显示全部楼层
dsmch 发表于 2015-5-25 12:12
alt+f11查看代码

赶脚自己好笨啊。新手看不懂代码,前辈能稍微解释一下吗。。

点评

在论坛上搜一下主题:代码解释器  发表于 2015-5-26 13:25
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 06:39 , Processed in 0.220387 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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