Excel精英培训网

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

[已解决]VBA单条件求和

[复制链接]
发表于 2015-12-15 14:44 | 显示全部楼层 |阅读模式
本帖最后由 安全网 于 2015-12-18 15:08 编辑

求助VBA单条件对数据进行求次数和金额的求和,统计后的数据如公司名称从小到大排列
最佳答案
2015-12-15 20:02
  1. Sub TJ()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     arr = Range("A2").CurrentRegion
  5.     For i = 2 To UBound(arr)
  6.         x = arr(i, 1)
  7.         If arr(i, 5) * arr(i, 6) > 0 Then
  8.             d(x) = d(x) + 1
  9.             d1(x) = d1(x) + arr(i, 5)
  10.         End If
  11.     Next
  12.     With Sheet2
  13.         .Cells.Clear
  14.         .[a2].Resize(1, 4) = Array("序号", "公司", "授信次数", "授信额度")
  15.         .[b3].Resize(d.Count, 3) = Application.Transpose(Array(d.keys, d.items, d1.items))
  16.         .[b3].Resize(d.Count, 3).Sort key1:=.[b3]  '按公司名称排序
  17.         For i = 1 To d.Count: .Cells(i + 2, 1) = i: Next
  18.         .Cells(i + 2, 2) = "汇总"
  19.         .Cells(i + 2, 3).Resize(, 2).Formula = "=sum(r3c:r[-1]c)"
  20.         .Activate
  21.     End With
  22.     MsgBox "统计完成!"
  23. End Sub
复制代码

vba单条件求和.rar

13.11 KB, 下载次数: 10

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-12-15 15:09 | 显示全部楼层
  1. Sub TJ()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     arr = Range("A2").CurrentRegion
  5.     For i = 2 To UBound(arr)
  6.         x = arr(i, 1)
  7.         d(x) = d(x) + 1
  8.         d1(x) = d1(x) + arr(i, 5)
  9.     Next
  10.     With Sheet2
  11.         .Cells.Clear
  12.         .[a2].Resize(1, 4) = Array("序号", "公司", "授信次数", "授信额度")
  13.         .[b3].Resize(d.Count, 3) = Application.Transpose(Array(d.keys, d.items, d1.items))
  14.         .[b3].Resize(d.Count, 3).Sort key1:=.[b3]  '按公司名称排序
  15.         For i = 1 To d.Count: .Cells(i + 2, 1) = i: Next
  16.         .Activate
  17.     End With
  18.     MsgBox "统计完成!"
  19. End Sub
复制代码

vba单条件求和.rar

16.98 KB, 下载次数: 18

回复

使用道具 举报

 楼主| 发表于 2015-12-15 16:26 | 显示全部楼层
grf1973 发表于 2015-12-15 15:09

Sub TJ()
    Application.ScreenUpdating = False
    Dim WB As Workbook
    Set WB = Workbooks.Open(Filename:="E:\数据表\数据总表.xls", Password:="123", WriteResPassword:="123")
    y = WB.Sheets(1).Range("D" & Rows.Count).End(xlUp).Row
    arr = WB.Sheets(1).Range("A3:AM" & y)
    Set d = CreateObject("scripting.dictionary")
    Set d1 = CreateObject("scripting.dictionary")
    arr = WB.Sheets(1).Range("A2").CurrentRegion
    For i = 2 To UBound(arr)
        x = arr(i, 14)
        d(x) = d(x) + 1
        d1(x) = d1(x) + arr(i, 13)
    Next
        WB.Close True
    Set WB = Nothing

    With ThisWorkbook
    With Sheet11
        .Cells.Clear
        .[a2].Resize(1, 4) = Array("序号", "公司", "授信次数", "授信额度")
        .[b3].Resize(d.Count, 3) = Application.Transpose(Array(d.keys, d.items, d1.items))
        .[b3].Resize(d.Count, 3).Sort key1:=.[b3]  '按公司名称排序
        For i = 1 To d.Count: .Cells(i + 2, 1) = i: Next
        .Activate
    End With
    End With
    Application.ScreenUpdating = True
    MsgBox "统计完成!"
End Sub

回复

使用道具 举报

 楼主| 发表于 2015-12-15 16:27 | 显示全部楼层
帮忙 看看这个代码错误在哪里
回复

使用道具 举报

发表于 2015-12-15 16:35 | 显示全部楼层
上面arr已经用四至范围定义了,下面再用arr=....currentregion就没有必要了。
回复

使用道具 举报

发表于 2015-12-15 16:36 | 显示全部楼层
With ThisWorkbook
    With Sheet11

写成
With ThisWorkbook.Sheet11
比较好一点
回复

使用道具 举报

发表于 2015-12-15 16:37 | 显示全部楼层
至于文件打开,数组定义是否出错是要看附件调试才知道的。
回复

使用道具 举报

 楼主| 发表于 2015-12-15 17:19 | 显示全部楼层
grf1973 发表于 2015-12-15 16:37
至于文件打开,数组定义是否出错是要看附件调试才知道的。

现在碰到授信额度内空或者担保额度内空,就不计数和金额,怎么设置,后面的值内要加个汇总栏怎么设置


QQ图片20151215170807.png
QQ图片20151215170935.png
回复

使用道具 举报

发表于 2015-12-15 20:02 | 显示全部楼层    本楼为最佳答案   
  1. Sub TJ()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     arr = Range("A2").CurrentRegion
  5.     For i = 2 To UBound(arr)
  6.         x = arr(i, 1)
  7.         If arr(i, 5) * arr(i, 6) > 0 Then
  8.             d(x) = d(x) + 1
  9.             d1(x) = d1(x) + arr(i, 5)
  10.         End If
  11.     Next
  12.     With Sheet2
  13.         .Cells.Clear
  14.         .[a2].Resize(1, 4) = Array("序号", "公司", "授信次数", "授信额度")
  15.         .[b3].Resize(d.Count, 3) = Application.Transpose(Array(d.keys, d.items, d1.items))
  16.         .[b3].Resize(d.Count, 3).Sort key1:=.[b3]  '按公司名称排序
  17.         For i = 1 To d.Count: .Cells(i + 2, 1) = i: Next
  18.         .Cells(i + 2, 2) = "汇总"
  19.         .Cells(i + 2, 3).Resize(, 2).Formula = "=sum(r3c:r[-1]c)"
  20.         .Activate
  21.     End With
  22.     MsgBox "统计完成!"
  23. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-12-16 14:30 | 显示全部楼层
grf1973 发表于 2015-12-15 20:02

像图片的错误是什么原因引起的,怎么样修改VBA可以避免
QQ图片20151216142116.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 17:50 , Processed in 0.604370 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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