Excel精英培训网

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

[已解决]如何用 VBA 将多重条件的数据合并到一个单元格

[复制链接]
发表于 2013-7-11 07:43 | 显示全部楼层 |阅读模式
如何用 VBA 将多重条件的数据合并到一个单元格
条件需要根据 生产日期        产品型号        生产线        班组        不良类型 将不良位置汇总到一起,并计算不良数量 生产数量只在第一列显示
具体实现效果 如附件内容


工作簿.zip (11.42 KB, 下载次数: 92)
发表于 2013-7-11 08:02 | 显示全部楼层
回复

使用道具 举报

发表于 2013-7-11 09:32 | 显示全部楼层
  1. Sub 合并数据()
  2.     Dim arr, arrResult
  3.     Dim i As Long, j As Long
  4.     Dim strKey As String
  5.     Dim lCount As Long, lPos As Long, arrPos
  6.     Dim objDic As Object
  7.     Set objDic = CreateObject("scripting.dictionary")
  8.    
  9.    
  10.     arr = Sheet1.Range("a1").CurrentRegion
  11.     If Not IsArray(arr) Then
  12.         MsgBox "数据不符合要求"
  13.         Exit Sub
  14.     End If
  15.    
  16.    
  17.     ReDim arrResult(1 To UBound(arr), 1 To UBound(arr))
  18.    
  19.     For j = LBound(arr, 2) To UBound(arr, 2)
  20.         arrResult(1, j) = arr(1, j)
  21.     Next

  22.     lCount = 1

  23.     For i = LBound(arr) + 1 To UBound(arr)
  24.         strKey = arr(i, 1) & "#" & arr(i, 5) & "#" & arr(i, 6) & "#" & arr(i, 7) & "#" & arr(i, 8)
  25.         If objDic.exists(strKey) Then
  26.             lPos = objDic(strKey)
  27.             arrResult(lPos, 9) = arrResult(lPos, 9) & " " & arr(i, 9)
  28.             arrResult(lPos, 10) = arrResult(lPos, 10) + arr(i, 10)
  29.         Else
  30.             lCount = lCount + 1
  31.             objDic.Add strKey, lCount
  32.             lPos = lCount
  33.             For j = LBound(arr, 2) To UBound(arr, 2)
  34.                 arrResult(lPos, j) = arr(i, j)
  35.             Next
  36.         End If

  37.     Next
  38.     With Sheet2
  39.         .UsedRange.ClearContents
  40.         .Range("a1").Resize(lCount, UBound(arr, 2)).Value = arrResult
  41.     End With
  42.     MsgBox "合并完成"
  43. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-7-11 09:44 | 显示全部楼层
hwc2ycy 发表于 2013-7-11 09:32

谢 烟花老师,还有个问题 就是产量只在第一个数据显示

删除备注
更新附件
请帮忙修改


工作簿.rar (10.57 KB, 下载次数: 77)
回复

使用道具 举报

发表于 2013-7-11 10:02 | 显示全部楼层
  1. Sub 合并数据()
  2.     Dim arr, arrResult
  3.     Dim i As Long, j As Long
  4.     Dim strKey As String
  5.     Dim lCount As Long, lPos As Long, arrPos
  6.     Dim objDic As Object
  7.     Dim strLast As String
  8.     Set objDic = CreateObject("scripting.dictionary")


  9.     arr = Sheet1.Range("a1").CurrentRegion
  10.     If Not IsArray(arr) Then
  11.         MsgBox "数据不符合要求"
  12.         Exit Sub
  13.     End If


  14.     ReDim arrResult(1 To UBound(arr), 1 To UBound(arr, 2))

  15.     For j = LBound(arr, 2) To UBound(arr, 2)
  16.         arrResult(1, j) = arr(1, j)
  17.     Next

  18.     lCount = 1

  19.     For i = LBound(arr) + 1 To UBound(arr)
  20.         strKey = arr(i, 1) & "#" & arr(i, 5) & "#" & arr(i, 6) & "#" & arr(i, 7) & "#" & arr(i, 8)
  21.         If objDic.exists(strKey) Then
  22.             lPos = objDic(strKey)
  23.             arrResult(lPos, 9) = arrResult(lPos, 9) & " " & arr(i, 9)
  24.             arrResult(lPos, 10) = arrResult(lPos, 10) + arr(i, 10)
  25.         Else
  26.             lCount = lCount + 1
  27.             objDic.Add strKey, lCount
  28.             lPos = lCount
  29.             For j = LBound(arr, 2) To UBound(arr, 2)
  30.                 arrResult(lPos, j) = arr(i, j)
  31.             Next
  32.         End If
  33.     Next

  34.     j = UBound(arrResult, 2)

  35.     For i = LBound(arrResult) + 1 To lCount
  36.         If arrResult(i, 7) = arrResult(i - 1, 7) Then
  37.             arrResult(i, j) = ""
  38.         End If
  39.     Next
  40.     With Sheet2
  41.         .UsedRange.ClearContents
  42.         .Range("a1").Resize(lCount, UBound(arr, 2)).Value = arrResult
  43.     End With
  44.     MsgBox "合并完成"
  45. End Sub
复制代码
回复

使用道具 举报

发表于 2013-7-11 10:20 | 显示全部楼层
上面的有点问题,判断条件不完善。
  1. Sub 合并数据()
  2.     Dim arr, arrResult
  3.     Dim i As Long, j As Long, k As Long
  4.     Dim strKey As String
  5.     Dim lCount As Long, lPos As Long, arrPos
  6.     Dim objDic As Object
  7.     Dim strLast As String
  8.     Set objDic = CreateObject("scripting.dictionary")

  9.     arr = Sheet1.Range("a1").CurrentRegion
  10.     If Not IsArray(arr) Then
  11.         MsgBox "数据不符合要求"
  12.         Exit Sub
  13.     End If

  14.     ReDim arrResult(1 To UBound(arr), 1 To UBound(arr, 2))

  15.     For j = LBound(arr, 2) To UBound(arr, 2)
  16.         arrResult(1, j) = arr(1, j)
  17.     Next

  18.     lCount = 1
  19.     k = UBound(arrResult, 2)
  20.     For i = LBound(arr) + 1 To UBound(arr)
  21.         strKey = arr(i, 1) & "#" & arr(i, 5) & "#" & arr(i, 6) & "#" & arr(i, 7) & "#" & arr(i, 8)
  22.         If objDic.exists(strKey) Then
  23.             lPos = objDic(strKey)
  24.             arrResult(lPos, 9) = arrResult(lPos, 9) & " " & arr(i, 9)
  25.             arrResult(lPos, 10) = arrResult(lPos, 10) + arr(i, 10)
  26.         Else
  27.             lCount = lCount + 1
  28.             objDic.Add strKey, lCount
  29.             lPos = lCount
  30.             For j = LBound(arr, 2) To k
  31.                 arrResult(lPos, j) = arr(i, j)
  32.             Next
  33.             If arrResult(lPos, 7) = arrResult(lPos - 1, 7) And arrResult(lPos, 6) = arrResult(lPos - 1, 6) Then
  34.                 arrResult(lPos, k) = ""
  35.             End If
  36.         End If
  37.     Next

  38.     'With Sheet2
  39.     '.UsedRange.ClearContents
  40.     '.Range("a1").Resize(lCount, k).Value = arrResult
  41.     'end with
  42.    
  43.     Worksheets.Add
  44.     Range("a1").Resize(lCount, k).Value = arrResult
  45.    
  46.     MsgBox "合并完成"
  47.    
  48. End Sub
复制代码
回复

使用道具 举报

发表于 2013-7-11 10:50 | 显示全部楼层    本楼为最佳答案   
  1. Sub 合并数据()
  2.     Dim arr, arrResult
  3.     Dim i As Long, j As Long, k As Long
  4.     Dim strKey As String
  5.     Dim lCount As Long, lPos As Long, arrPos
  6.     Dim objDic As Object
  7.     Dim strLast As String
  8.     Set objDic = CreateObject("scripting.dictionary")

  9.     arr = Sheet1.Range("a1").CurrentRegion
  10.     If Not IsArray(arr) Then
  11.         MsgBox "数据不符合要求"
  12.         Exit Sub
  13.     End If

  14.     ReDim arrResult(1 To UBound(arr), 1 To UBound(arr, 2))

  15.     For j = LBound(arr, 2) To UBound(arr, 2)
  16.         arrResult(1, j) = arr(1, j)
  17.     Next

  18.     lCount = 1
  19.     k = UBound(arrResult, 2)
  20.     For i = LBound(arr) + 1 To UBound(arr)
  21.         strKey = arr(i, 1) & "#" & arr(i, 5) & "#" & arr(i, 6) & "#" & arr(i, 7) & "#" & arr(i, 8)
  22.         If objDic.exists(strKey) Then
  23.             lPos = objDic(strKey)
  24.             arrResult(lPos, 9) = arrResult(lPos, 9) & " " & arr(i, 9)
  25.             arrResult(lPos, 10) = arrResult(lPos, 10) + arr(i, 10)
  26.         Else
  27.             lCount = lCount + 1
  28.             objDic.Add strKey, lCount
  29.             lPos = lCount
  30.             For j = LBound(arr, 2) To k
  31.                 arrResult(lPos, j) = arr(i, j)
  32.             Next
  33.             If arrResult(lPos, 7) = arrResult(lPos - 1, 7) And arrResult(lPos, 6) = arrResult(lPos - 1, 6) And arrResult(lPos, 5) = arrResult(lPos - 1, 5) Then
  34.                 arrResult(lPos, k) = ""
  35.             End If
  36.         End If
  37.     Next

  38.     'With Sheet2
  39.     '.UsedRange.ClearContents
  40.     '.Range("a1").Resize(lCount, k).Value = arrResult
  41.     'end with
  42.    
  43.     Worksheets.Add
  44.     Range("a1").Resize(lCount, k).Value = arrResult
  45.    
  46.     MsgBox "合并完成"
  47.    
  48. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-7-11 10:53 | 显示全部楼层
完美解决 谢谢烟花老师,不知道什么时候才有老师这样的技术

回复

使用道具 举报

发表于 2021-8-17 15:09 | 显示全部楼层
小老头慢慢消化学习
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:40 , Processed in 0.413335 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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