暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

字典单条件汇总求和

VBA语言専攻 2022-07-25
117
【分享成果,随喜正能量】人的幸福感是自己给的,内心满足即圆满;若内心不知足,就很难得到真正的幸福。所谓圆满不是没苦乐,而是苦乐随喜,悲喜随缘。
《VBA数组与字典方案》教程是我推出的第三套教程,目前已经是第一版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。七、一、三、九组合套教程掌握后,可以解决大多数工作中遇到的实际问题。
这套教程共两册,一共八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:字典单条件汇总求和

第三十八讲  利用数组与字典,实现单条件汇总求和

大家好,我们今天继续讲解VBA数组与字典解决方案,今日的内容是第38讲,利用数组与字典,实现单个条件的数据汇总求和。在VBA解决方案的丛书中,这套VBA数组与字典解决方案是专门讲解数组和字典的。这套书的开始先讲了EXCEL数组的利用,然后又讲了VBA数组,从上一讲开始,我们开始讲字典。介绍了什么是字典,及其简单的应用,从这讲开始,我们开始讲数组和字典的各种实际利用方法,这些方案是我将多年的经验加以整理而成,如果你有机会能看到这些,希望对你有所帮助。

1  单条件汇总求和的实际场景

今日的内容是利用数组与字典,实现单个条件汇总求和,我们看下面的数据:
我们的目的要实现按A列数据汇总求和,看看我们怎么实现,由于这是我的第三套书,大家可以想想,这个内容在我的第一套书《VBA代码解决方案》和第二套书《VBA数据库解决方案》中如何实现呢?

2  实现单条件求和的代码实现及代码讲解

下面看看我给出字典解决方案的代码:
Sub MyNZsz_38() '第38讲 应用数组与字典,实现单个条件汇总求和
  Dim myarr
   '将数据放入数组中
   Sheets("38").Select
   myarr = Range("a2:b" & Range("b2").End(xlDown).row)
   '定义字典
   Set myDic = CreateObject("Scripting.Dictionary")
    '给字典赋值
    For i = 1 To UBound(myarr, 1)
              If Not myDic.exists(myarr(i, 1)) Then
                '没有找到键,那么就赋值
                myDic(myarr(i, 1)) = myarr(i, 2)
              Else
                '找到,值增加
                myDic(myarr(i, 1)) = myDic(myarr(i, 1)) + myarr(i, 2)
              End If
    Next
    Range("g:h").ClearContents
    Range("g1:h1") = Array("型号", "数量")
    '将键和键值赋给数组,并通过转置函数显示在工作表中
    myarr = Array(myDic.Keys, myDic.items)
    Range("g2").Resize(myDic.Count, 2) = Application.Transpose(myarr)
End Sub
代码截图:
代码解析:
1) 上述代码实现了按A列的值为基准,把B列数据汇总的功能。
2)  myarr = Range("a2:b" & Range("b2").End(xlDown).row)
上述语句将数据放到数组中,注意这里的myarr 是个二维数组
3)  Set myDic = CreateObject("Scripting.Dictionary")
上述语句定义了一个字典
4)   If Not myDic.exists(myarr(i, 1)) Then
                '没有找到键,那么就赋值
                myDic(myarr(i, 1)) = myarr(i, 2)
              Else
                '找到,值增加
                myDic(myarr(i, 1)) = myDic(myarr(i, 1)) + myarr(i, 2)
              End If
上述语句实现了首先查找,根据查找的结果做后续处理的方式。查找到了汇总求和,没有找到就新增条目。
5) myarr = Array(myDic.Keys, myDic.items)
上述语句赋给数组,仍是一个二维的数组
6) Range("g2").Resize(myDic.Count, 2) = Application.Transpose(myarr)
上述语句将数组放到工作表中。注意要首先将工作表的区域扩展到和数组一般的大小。
下面看代码的运行:

今日内容回向:
1  如何将键和键值回填到工作表?
2  回填工作表前要做好哪些准备?





我20多年的VBA实践经验,全部浓缩在下面的各个教程及各类工具中:


【分享成果,随喜正能量】人的一切痛苦,本质上都是对自己无能的愤怒。更多人不愿面对这点,转而通过消解别人的努力,来为自己寻找仅有的安慰,这才是loser的表现。
文章转载自VBA语言専攻,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论