Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: dfsfsa

[已解决]怎么求和?

[复制链接]
发表于 2017-5-15 17:36 | 显示全部楼层
一样的,字典不适用。
  1. Sub aaa()
  2. Dim arr, brr, r1&, r2&, c1&, c2
  3. arr = Range("e6:i" & [i65536].End(3).Row)
  4. ReDim brr(1 To UBound(arr) * 2, 1 To 9)
  5. r1 = 1: r2 = 1: c2 = 3
  6. For i = 1 To UBound(arr)
  7.   If InStr(arr(i, 5), "a") Then
  8.     c1 = c1 + 1
  9.     If c1 = 4 Then
  10.       c1 = 1
  11.       r1 = r1 + 6
  12.     End If
  13.     brr(r1, c1) = arr(i, 3)
  14.     brr(r1, 7) = brr(r1, 7) + arr(i, 3)
  15.     brr(r1, 9) = brr(r1, 9) + arr(i, 3)
  16.   End If
  17.   If InStr(arr(i, 5), "b") Then
  18.     c2 = c2 + 1
  19.     If c2 = 7 Then
  20.       c2 = 4
  21.       r2 = r2 + 6
  22.     End If
  23.     brr(r2, c2) = arr(i, 3)
  24.     brr(r2, 8) = brr(r2, 8) + arr(i, 3)
  25.     brr(r2, 9) = brr(r2, 9) + arr(i, 3)
  26.   End If
  27. Next i
  28. [k6].Resize(IIf(r1 > r2, r1, r2), 9) = brr
  29. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
dfsfsa + 1 很给力

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2017-5-15 21:27 | 显示全部楼层
本帖最后由 dfsfsa 于 2017-5-18 12:28 编辑
大灰狼1976 发表于 2017-5-15 17:36
一样的,字典不适用。

帮忙再改下代码?
回复

使用道具 举报

 楼主| 发表于 2017-5-17 13:07 | 显示全部楼层
回复

使用道具 举报

发表于 2017-5-17 16:14 | 显示全部楼层
在原代码上修改了一下,没有测试,你试试看有无问题。
  1. Sub aaa()
  2. Dim arr, brr, r1&, r2&, c1&, c2
  3. arr = Range("e6:i" & [i65536].End(3).Row)
  4. ReDim brr(1 To UBound(arr) * 2, 1 To 9)
  5. r1 = 1: r2 = 1: c2 = 3
  6. For i = 1 To UBound(arr)
  7.   If InStr(arr(i, 5), "a") Then
  8.     c1 = c1 + 1
  9.     If c1 = 4 Then
  10.       c1 = 1
  11.       r1 = r1 + 6
  12.     End If
  13.     brr(r1, c1) = arr(i, 3)
  14.     brr(r1, 7) = brr(r1, 7) + arr(i, 3)/2
  15.     brr(r1, 9) = brr(r1, 9) + arr(i, 3)/4
  16.   End If
  17.   If InStr(arr(i, 5), "b") Then
  18.     c2 = c2 + 1
  19.     If c2 = 7 Then
  20.       c2 = 4
  21.       r2 = r2 + 6
  22.     End If
  23.     brr(r2, c2) = arr(i, 3)
  24.     brr(r2, 8) = brr(r2, 8) + arr(i, 3)/2
  25.     brr(r2, 9) = brr(r2, 9) + arr(i, 3)/4
  26.   End If
  27. Next i
  28. [k6].Resize(IIf(r1 > r2, r1, r2), 9) = brr
  29. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-5-17 16:55 | 显示全部楼层
本帖最后由 dfsfsa 于 2017-5-18 12:28 编辑
大灰狼1976 发表于 2017-5-17 16:14
在原代码上修改了一下,没有测试,你试试看有无问题。

结果不对,你测试一下
回复

使用道具 举报

发表于 2017-5-17 17:05 | 显示全部楼层
我试了一下是正确的,举例:
第一行包含a的数据为500、530、300,求和为1330,除以2以后为665,包含b的数据为20、25、30,求和为75,除以2以后为37.5,包含ab的数据求和为1405,除以4以后为351.25
跟代码运行结果是一致的。
回复

使用道具 举报

 楼主| 发表于 2017-6-16 10:07 | 显示全部楼层
Sub Macro1()
    Dim d1 As Object, d2 As Object
    Set d1 = CreateObject("scripting.dictionary")
    Set d2 = CreateObject("scripting.dictionary")
    arr = Range("E6:I" & Range("E65536").End(xlUp).Row)
    Dim brr: ReDim brr(1 To UBound(arr, 1), 1 To 7)
    For i = 1 To UBound(arr, 1)
        If InStr(arr(i, 5), "a") <> 0 Then
            If d1.exists(arr(i, 1) & ",a") Then
                d1(arr(i, 1) & ",a") = d1(arr(i, 1) & ",a") & "," & arr(i, 3)
            Else
                d1(arr(i, 1) & ",a") = arr(i, 3)
            End If
        ElseIf InStr(arr(i, 5), "b") <> 0 Then
            If d2.exists(arr(i, 1) & ",b") Then
                d2(arr(i, 1) & ",b") = d2(arr(i, 1) & ",b") & "," & arr(i, 3)
            Else
                d2(arr(i, 1) & ",b") = arr(i, 3)
            End If
        End If
    Next
    key1 = Application.Index(arr, , 1)
    For Each k1 In d1.keys
        r = Application.Match(Split(k1, ",")(0), key1, 0)
        crr = Split(d1(k1), ",")
        For i = 0 To 1
            brr(r, i + 1) = Val(crr(i))
        Next
    Next
    For Each k2 In d2.keys
        r = Application.Match(Split(k2, ",")(0), key1, 0)
        crr = Split(d2(k2), ",")
        For i = 0 To 1
            brr(r, i + 3) = Val(crr(i))
        Next
        brr(r, 5) = brr(r, 1) + brr(r, 2)
        brr(r, 6) = brr(r, 3) + brr(r, 4)
        brr(r, 7) = brr(r, 5) + brr(r, 6)
    Next
    Range("k6").Resize(UBound(brr, 1), 7) = brr
End Sub
回复

使用道具 举报

 楼主| 发表于 2017-6-16 10:09 | 显示全部楼层
Sub Macro2()
ReDim ar(1 To 100, 1 To 7)
For i = 6 To 17
    n = n + 1
    If Cells(i, "E") <> Cells(i - 1, "E") Then
        s = Application.CountIf(Range("E1:E1000"), Cells(i, "E"))
        For j = 6 To 17
            If Cells(j, "I") Like "*a*" And Cells(i, "E") = Cells(j, "E") Then g = g + 1: ar(n, g) = Cells(j, "G")
        Next
        For j = 6 To 17
            If Cells(j, "I") Like "*b*" And Cells(i, "E") = Cells(j, "E") Then g = g + 1: ar(n, g) = Cells(j, "G")
        Next
            ar(n, 5) = ar(n, 1) + ar(n, 2)
            ar(n, 6) = ar(n, 3) + ar(n, 4)
            ar(n, 7) = ar(n, 5) + ar(n, 6)
        g = 0
    End If
Next i
Cells(6, "K").Resize(n, 7) = ar
End Sub
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 01:20 , Processed in 0.316605 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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