Excel精英培训网

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

[已解决]如何用vba实现源数据自动合并???

[复制链接]
发表于 2017-2-25 18:12 | 显示全部楼层 |阅读模式
{:1112:}

最佳答案
2017-2-26 12:39
  1. Sub 数据转化()
  2.     Dim d As Object
  3.     Dim i&, j&, n&, m&, k, k1, rng As Range, rng1 As Range
  4.     Dim arr, brr(), myPath$
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     myPath = ThisWorkbook.Path & "\源数据.xls"
  7.     Application.ScreenUpdating = False
  8.     With GetObject(myPath)
  9.         With .Sheets("sheet1")
  10.             n = .Cells(.Rows.Count, 1).End(xlUp).Row
  11.             arr = .Range("a1").CurrentRegion
  12.         End With
  13.         .Close
  14.     End With
  15.     For i = 1 To n
  16.         If Not d.exists(arr(i, 1) & "_" & arr(i, 2)) Then
  17.             m = m + 1
  18.             d.Add arr(i, 1) & "_" & arr(i, 2), m
  19.             ReDim Preserve brr(1 To m)
  20.             Set brr(m) = CreateObject("Scripting.Dictionary")
  21.             If Not brr(m).exists(arr(i, 3)) Then
  22.                 brr(m).Add arr(i, 3), arr(i, 4)
  23.             Else
  24.                 brr(m)(arr(i, 3)) = brr(m)(arr(i, 3)) & "、" & arr(i, 4)
  25.             End If
  26.         Else
  27.             If Not brr(d(arr(i, 1) & "_" & arr(i, 2))).exists(arr(i, 3)) Then
  28.                 brr(d(arr(i, 1) & "_" & arr(i, 2))).Add arr(i, 3), arr(i, 4)
  29.             Else
  30.                 brr(d(arr(i, 1) & "_" & arr(i, 2)))(arr(i, 3)) = brr(d(arr(i, 1) & "_" & arr(i, 2)))(arr(i, 3)) & "、" & arr(i, 4)
  31.             End If
  32.         End If
  33.     Next
  34.     m = 1
  35.     With Sheet1
  36.         .UsedRange.Delete
  37.         For Each k In d.keys
  38.             .Cells(m, 1).Resize(1, 2) = Split(k, "_")
  39.             Set rng = .Cells(m, 1)
  40.             Set rng1 = .Cells(m, 2)
  41.             For Each k1 In brr(d(k)).keys
  42.                 .Cells(m, 3) = k1
  43.                 .Cells(m, 4) = brr(d(k))(k1)
  44.                 Set rng = Union(.Cells(m, 1), rng)
  45.                 Set rng1 = Union(.Cells(m, 2), rng1)
  46.                 m = m + 1
  47.             Next
  48.             rng.Merge
  49.             rng1.Merge
  50.             Set rng = Nothing: Set rng1 = Nothing
  51.         Next
  52.     End With
  53.     Application.ScreenUpdating = True
  54. End Sub
复制代码

Desktop.rar

11.97 KB, 下载次数: 9

源数据

发表于 2017-2-26 12:39 | 显示全部楼层    本楼为最佳答案   
  1. Sub 数据转化()
  2.     Dim d As Object
  3.     Dim i&, j&, n&, m&, k, k1, rng As Range, rng1 As Range
  4.     Dim arr, brr(), myPath$
  5.     Set d = CreateObject("Scripting.Dictionary")
  6.     myPath = ThisWorkbook.Path & "\源数据.xls"
  7.     Application.ScreenUpdating = False
  8.     With GetObject(myPath)
  9.         With .Sheets("sheet1")
  10.             n = .Cells(.Rows.Count, 1).End(xlUp).Row
  11.             arr = .Range("a1").CurrentRegion
  12.         End With
  13.         .Close
  14.     End With
  15.     For i = 1 To n
  16.         If Not d.exists(arr(i, 1) & "_" & arr(i, 2)) Then
  17.             m = m + 1
  18.             d.Add arr(i, 1) & "_" & arr(i, 2), m
  19.             ReDim Preserve brr(1 To m)
  20.             Set brr(m) = CreateObject("Scripting.Dictionary")
  21.             If Not brr(m).exists(arr(i, 3)) Then
  22.                 brr(m).Add arr(i, 3), arr(i, 4)
  23.             Else
  24.                 brr(m)(arr(i, 3)) = brr(m)(arr(i, 3)) & "、" & arr(i, 4)
  25.             End If
  26.         Else
  27.             If Not brr(d(arr(i, 1) & "_" & arr(i, 2))).exists(arr(i, 3)) Then
  28.                 brr(d(arr(i, 1) & "_" & arr(i, 2))).Add arr(i, 3), arr(i, 4)
  29.             Else
  30.                 brr(d(arr(i, 1) & "_" & arr(i, 2)))(arr(i, 3)) = brr(d(arr(i, 1) & "_" & arr(i, 2)))(arr(i, 3)) & "、" & arr(i, 4)
  31.             End If
  32.         End If
  33.     Next
  34.     m = 1
  35.     With Sheet1
  36.         .UsedRange.Delete
  37.         For Each k In d.keys
  38.             .Cells(m, 1).Resize(1, 2) = Split(k, "_")
  39.             Set rng = .Cells(m, 1)
  40.             Set rng1 = .Cells(m, 2)
  41.             For Each k1 In brr(d(k)).keys
  42.                 .Cells(m, 3) = k1
  43.                 .Cells(m, 4) = brr(d(k))(k1)
  44.                 Set rng = Union(.Cells(m, 1), rng)
  45.                 Set rng1 = Union(.Cells(m, 2), rng1)
  46.                 m = m + 1
  47.             Next
  48.             rng.Merge
  49.             rng1.Merge
  50.             Set rng = Nothing: Set rng1 = Nothing
  51.         Next
  52.     End With
  53.     Application.ScreenUpdating = True
  54. End Sub
复制代码

Desktop.rar

19.22 KB, 下载次数: 9

评分

参与人数 1 +6 收起 理由
laoau138 + 6 来学习

查看全部评分

回复

使用道具 举报

发表于 2017-2-26 18:08 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 23:54 , Processed in 0.589872 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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