Excel精英培训网

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

VBA 合并同类项并求和

[复制链接]
发表于 2017-6-19 10:28 | 显示全部楼层 |阅读模式
1.jpg
我的代码:
Sub test()
Dim arr, k%, brr(), n%, d, dstr$, h%, x
arr = Range("h1").CurrentRegion
Set d = CreateObject("scripting.dictionary")
For k = 2 To UBound(arr)
    dstr = arr(k, 5) & arr(k, 8)
    If d.exists(dstr) = False Then
        n = n + 1
        d(dstr) = n
        ReDim Preserve brr(1 To 3, 1 To n)
        brr(1, n) = arr(k, 5)
        brr(2, n) = arr(k, 8)
        brr(3, n) = arr(k, 4)
    Else
        h = d(dstr)
        brr(3, h) = brr(3, h) + arr(k, 4)

    End If
Next k
Range("o1") = arr(1, 5): Range("p1") = arr(1, 8): Range("q1") = arr(1, 4)
Range("o2").Resize(UBound(brr, 2), 3) = Application.WorksheetFunction.Transpose(brr)
End Sub
应该是代码出现了问题


 楼主| 发表于 2017-6-19 10:29 | 显示全部楼层
求大神帮忙,谢谢了。最右边那一列按正确来算应该是:20,20,50,40,100......
回复

使用道具 举报

 楼主| 发表于 2017-6-19 11:19 | 显示全部楼层

VBA同类项合并且另一列数据相加

1.jpg
我的代码:
Sub test()
Dim arr, k%, brr(), n%, d, dstr$, h%, x
arr = Range("h1").CurrentRegion
Set d = CreateObject("scripting.dictionary")
For k = 2 To UBound(arr)
    dstr = arr(k, 5) & arr(k, 8)
    If d.exists(dstr) = False Then
        n = n + 1
        d(dstr) = n
        ReDim Preserve brr(1 To 3, 1 To n)
        brr(1, n) = arr(k, 5)
        brr(2, n) = arr(k, 8)
        brr(3, n) = arr(k, 4)
    Else
        h = d(dstr)
        brr(3, h) = brr(3, h) + arr(k, 4)

    End If
Next k
Range("o1") = arr(1, 5): Range("p1") = arr(1, 8): Range("q1") = arr(1, 4)
Range("o2").Resize(UBound(brr, 2), 3) = Application.WorksheetFunction.Transpose(brr)
End Sub
应该是代码出现了问题

正确计算的是在右边是20 20 50 40 100 ......
回复

使用道具 举报

 楼主| 发表于 2017-6-19 11:20 | 显示全部楼层

求大神帮忙,谢谢了。最右边那一列按正确来算应该是:20,20,50,40,100......
回复

使用道具 举报

发表于 2017-6-19 11:24 | 显示全部楼层
大哥真是锲而不舍啊,告诉你得不到答复的原因吧,附件附件附件!
如果真的不方便上传附件,至少图片要包含所有必需信息,行列号是最基本的。
就问题而言,是很简单的,就是用字典合并同类项。
回复

使用道具 举报

发表于 2017-6-19 12:10 | 显示全部楼层
上传附件
回复

使用道具 举报

发表于 2017-6-19 12:43 | 显示全部楼层
Sub test()
Dim arr, k%, brr(), n%, d, dstr$, h%, x
arr = Range("h1").CurrentRegion
Set d = CreateObject("scripting.dictionary")
For k = 2 To UBound(arr)
    dstr = arr(k, 5) & arr(k, 8)
    If d.exists(dstr) = False Then
        n = n + 1
        d(dstr) = n
        ReDim Preserve brr(1 To 3, 1 To n)
        brr(1, n) = arr(k, 5)
        brr(2, n) = arr(k, 8)
        brr(3, n) = arr(k, 4)
    Else
        h = d(dstr)
        brr(3, h) = brr(3, h) + (arr(k, 4) * 1)

    End If
Next k
Range("o1") = arr(1, 5): Range("p1") = arr(1, 8): Range("q1") = arr(1, 4)
Range("o2").Resize(UBound(brr, 2), 3) = Application.WorksheetFunction.Transpose(brr)
End Sub
文本格式转为数字就可以了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 13:29 , Processed in 0.336039 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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