ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7728|回复: 7

[求助] 如何用VBA数组写双条件求和

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-5-5 20:55 | 显示全部楼层 |阅读模式
想写一个双条件求和的代码,终于完成了,但是采用一般循环方法速度太慢,想学习数组的写法,希望各位能帮助写一个。

我原来代码如下
  1. Sub 双条件求和()Application.ScreenUpdating = False        '冻结屏幕,以防屏幕抖动

  2. For jj = 3 To 29
  3.     '循环结果行数For k = 2 To 31
  4.         '循环结果列数,
  5. For Each sht In WorksheetsIf sht.Name <> "汇总" Then
  6.                
  7. For i = 2 To 300
  8.                     '循环数据源行数If sht.Cells(i, "A") = Sheets("汇总").Cells(2, k) And sht.Cells(i, "B") = Sheets("汇总").Cells(jj, "A") Thenmysum = mysum + sht.Cells(i, "C")
  9.                     End If
  10.                 Next i
  11.             End If
  12.         Next sht
  13.         Sheets("汇总").Cells(jj, k) = mysum
  14.         mysum = 0
  15.         '清空求和,继续循环求和
  16.     Next k
  17. Next jj
  18. Application.ScreenUpdating = True
  19. End Sub
复制代码





希望各位写个简易数组,让我学习一下。
双条件求和.rar (30.69 KB, 下载次数: 1036)


TA的精华主题

TA的得分主题

发表于 2012-5-5 21:13 | 显示全部楼层
Sub 双条件求和()
tt = Timer
Application.ScreenUpdating = False '冻结屏幕,以防屏幕抖动
ahz = [a2].CurrentRegion
For jj = 2 To 28
    '循环结果行数,2:5行
    For k = 2 To 31
        '循环结果列数,B:F列
        For Each sht In Worksheets
            If sht.Name <> "汇总" Then
            aaa = sht.[a1].CurrentRegion
                For i = 2 To UBound(aaa)
                    '循环数据源行数
                    
                    If aaa(i, 1) = ahz(1, k) And aaa(i, 2) = ahz(jj, 1) Then
                        '如果G列=第一行的日期数据 且 同行I列=A列的地区
                        mysum = mysum + aaa(i, 3)
                    End If
                Next i
            End If
        Next sht
        ahz(jj, k) = mysum
        mysum = 0
        '清空求和,继续循环求和
    Next k
Next jj
[a2].Resize(UBound(ahz), UBound(ahz, 2)) = ahz
Application.ScreenUpdating = True
MsgBox Timer - tt
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-5-5 21:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-5 21:20 | 显示全部楼层
这个用字典加数组代码运行很快的。

TA的精华主题

TA的得分主题

发表于 2013-1-14 18:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
{:soso_e100:}

TA的精华主题

TA的得分主题

发表于 2015-2-4 21:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub SUMPRODUCT2()
    '先将两个表拷在一起,这人代码我忘了
    Dim i&
    Dim a&
    Dim arr
    Dim dic As Object
    Dim dic1 As Object
   
    Sheet1.Range("a1").CurrentRegion.ClearContents
    arr = Sheet2.Range("a1").CurrentRegion
    Set dic1 = CreateObject("scripting.dictionary")
    For i = 2 To UBound(arr)
        dic1(arr(i, 1)) = arr(i, 2)
    Next
   
    Sheet1.Range("B2").Resize(1, dic1.Count) = dic1.KEYS
    Sheet1.Range("A3").Resize(dic1.Count) = Application.Transpose(dic1.ITEMS)
   
    Set dic = CreateObject("scripting.dictionary")
    For i = 2 To UBound(arr)
        dic(arr(i, 1) & " " & arr(i, 2)) = dic(arr(i, 1) & " " & arr(i, 2)) + arr(i, 3)
    Next
   
    arr = Sheet1.Range("A2:AE32")
    For i = 2 To UBound(arr)
        For a = 2 To UBound(arr, 2)
            arr(i, a) = dic(arr(1, a) & " " & arr(i, 1))
        Next
    Next
    Sheet1.Range("A2:AE32") = arr
   

TA的精华主题

TA的得分主题

发表于 2019-10-30 14:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
vba初学者,试着用字典写一下,时间也很短,不到1秒

Sub 多条件汇总()

t = Timer

Dim dic1 As Object

Set dic1 = CreateObject("scripting.dictionary")


    For Each sh In Worksheets
   
        If sh.Name <> "汇总" Then
        
            For i = 2 To sh.UsedRange.Rows.Count
            
                If dic1.exists(sh.Cells(i, 1) & sh.Cells(i, 2)) Then
               
                    dic1(sh.Cells(i, 1) & sh.Cells(i, 2)) = dic1(sh.Cells(i, 1) & sh.Cells(i, 2)) + sh.Cells(i, 3)
                    
                    Else
                    
                    dic1(sh.Cells(i, 1) & sh.Cells(i, 2)) = sh.Cells(i, 3)
               
                End If
               
            Next i
        
        End If
   
    Next sh


For a = 2 To 31

    For b = 3 To 29
   
        Sheet1.Cells(b, a) = dic1(Sheet1.Cells(2, a) & Sheet1.Cells(b, 1))
   
    Next b

Next a


dic1.RemoveAll

MsgBox Timer - t

End Sub

TA的精华主题

TA的得分主题

发表于 2022-5-29 16:36 | 显示全部楼层


Sub 多个表格求和()
Application.ScreenUpdating = False
Dim a As Integer, b As Integer, m As Worksheet, sum, i

For a = 3 To Sheets("汇总").Range("a3").End(xlDown).Row
        For b = 2 To Sheets("汇总").Range("a2").End(xlToRight).Column
               
                For Each m In Worksheets
                    If m.Name <> "汇总" Then
                        For i = 2 To m.Range("a1").End(xlDown).Row
                        If Sheets("汇总").Cells(a, 1) = m.Cells(i, 2) And Sheets("汇总").Cells(2, b) = m.Cells(i, 1) Then
                        sum = sum + m.Cells(i, 3)
                        End If
                        Next
                    End If
                Next
            Cells(a, b) = sum
            
            sum = 0
            
        Next
Next
Application.ScreenUpdating = True
End Sub



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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-26 06:43 , Processed in 0.049107 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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