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

字典双条件数据汇总

VBA语言専攻 2022-08-07
17
【分享成果,随喜正能量】生活不简单,尽量简单过。时间就是一颗药,你掌握好了它便是解药,你肆意挥霍它便是毒药。不喧,不吵,静静地守着岁月;不怨,不悔,淡淡地对待自己。别紧张。深呼吸。坚持住。扛过去。
《VBA数组与字典方案》教程是我推出的第三套教程,目前已经是第一版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。七、一、三、九组合套教程掌握后,可以解决大多数工作中遇到的实际问题。
这套教程共两册,一共八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:字典双条件数据汇总

第三十九讲 利用数组与字典,实现双条件数据汇总

大家好,我们今天继续讲解VBA数组与字典解决方案,今日的内容是第39讲,利用数组与字典,实现双条件数据汇总的方法。大家或许在之前没有接触过字典,其实,字典在VBA中占据着很重要的地位。大家已经注意到了,字典的应用和数组是密不可分的。要想理解字典的应用,必须要掌握数组的用法,对于数组的理解要透彻后才能谈到字典的理解,字典本身其实非常的简单,就是要灵活的利用他的键和键值。

1  应用场景的具体分析

我们今日的内容是实现双条件的数据汇总,如下的数据,我们要根据A列和B列的值对C列数据实现汇总求和:
怎么能做到呢?我刚才讲过,字典的本身的定义非常简单,我们要深入的理解键和键值,巧妙的加以应用。

2  实现场景的代码及讲解

下面看我给出的代码:
Sub mynzsz_39() '39 利用数组与字典,实现双条件数据汇总的方法
  Dim myarr
  Sheets("39").Select
  '将数据装入数组
  myarr = Range("a2:c" & Range("c2").End(xlDown).row)
  Set myDic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(myarr, 1)
              '利用"丨"将数组的第一第二列合并,以利用查询
              mykey = myarr(i, 1) & "丨" & myarr(i, 2)
              '如果存在,合并值,如果不存在建立新的
              If Not myDic.exists(mykey) Then
                myDic(mykey) = myarr(i, 3)
              Else
                myDic(mykey) = myDic(mykey) + myarr(i, 3)
              End If
    Next
    Range("g1:I1") = Array("型号", "类别", "数量")
    '提取键数组,这个时候的元素是用"丨"隔开的,用replace分别替换掉左右的字符
    myarr1 = Array(myDic.Keys)
    Range("g2").Resize(myDic.Count, 2) = Application.Transpose(myarr1)
    Range("g2").Resize(myDic.Count, 1).Replace "丨*", "", xlPart
    Range("h2").Resize(myDic.Count, 1).Replace "*丨", "", xlPart
    '提取键值数组
    myarr2 = Array(myDic.items)
    Range("I2").Resize(myDic.Count, 1) = Application.Transpose(myarr2)
End Sub
代码截图:
代码讲解:
1)上述代码实现了根据数据的A列和B列进行汇总求和的功能,实现类似的办法可以用以前我讲过的方法代码循环,还可以用数据库,大家可以试着比较一下。
2)  '将数据装入数组
  myarr = Range("a2:c" & Range("c2").End(xlDown).row)
上述代码实现将数据装入数组,以利用后续的操作。
3)  mykey = myarr(i, 1) & "丨" & myarr(i, 2)
上述代码将数组的第一个元素和第二个元素合并,作为一个键,然后赋值
4)         '如果存在,合并值,如果不存在建立新的
              If Not myDic.exists(mykey) Then
                myDic(mykey) = myarr(i, 3)
              Else
                myDic(mykey) = myDic(mykey) + myarr(i, 3)
              End If
上面的代码是判断键存在与否的标准语句,大家要利用好,这也是一个标准的写法。
5) myarr1 = Array(myDic.Keys)
Range("g2").Resize(myDic.Count, 2) = Application.Transpose(myarr1)
将键组成的数组回填给单元格,注意这里回填的是两列,下面还有对这两列分别处理
6) Range("g2").Resize(myDic.Count, 1).Replace "丨*", "", xlPart
上述语句去右留左。
   Range("h2").Resize(myDic.Count, 1).Replace "*丨", "", xlPart
上述语句去左留右。
上述代码也可以作为标准的语句进行写法的记忆。

下面看代码的运行:


今日内容回向:
1  如何实现双列的数据汇总?
2  在字典中双列的汇总最关键的步骤是什么?





我多年的VBA实践经验,全部浓缩在以下十套教程中,可以联络我V信VBA6337取得教程,成为我的学员:


【分享成果,随喜正能量】人生在世,有干不完的活,想不完的事,不去纠结,不去贪恋。物质极简,内心丰盈。
文章转载自VBA语言専攻,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论