大家好,我们今天继续讲解VBA数组与字典解决方案,今日的内容是第41讲,在利用字典时,精准控制字典键值回填的方法。通过我前几讲的讲解,大家发现了字典利用的妙处,这种妙处往往是不可说的,给我们的工作带来了极大的便利,让我们的工作可以瞬间完成。做到秒杀。但问题来了,如果我想精确的控制键值的回填,该如何做到呢?之前的讲解中,我总是在利用数组的转置,一次完成,现在我需要的是精准的控制,是否可以做到呢?答案是肯定的。 我们看下面的数据,我们要实现按A列汇总后,将数据回填到E、 F列时要一个一个的填入,以利于我们在某些程序中能对数据有针对性的处理。 这里我们要利用到count属性了,下面我们看我给出的代码: Sub mynzsz_41() '第41讲 在利用字典时,精准控制字典键值回填的方案 Dim mydic, myarr Sheets('41').Select Set mydic = CreateObject('scripting.dictionary') myarr = Sheets('41').UsedRange For i = 2 To UBound(myarr) '当mydic(arr(i,1))没有值时,默认是0,通过下面进行累加。 mydic(myarr(i, 1)) = mydic(myarr(i, 1)) + myarr(i, 2) Next '为字典键值的回填做区域准备 Range('e:f').ClearContents '将表头A1,B1复制到e1,f1单元格 Sheets('41').Range('a1:b1').Copy Sheets('41').Range('e1') '将键去重,纵向写入到单元格 Sheets('41').Cells(2, 'e').Resize(mydic.Count, 1) = Application.Transpose(mydic.Keys) For i = 2 To mydic.Count + 1 '循环输入字典键对应的值到f列,逐一找到键的对应键值 Sheets('41').Cells(i, 'f').Value2 = mydic(Sheets('41').Cells(i, 'e').Value) Next '释放内存 Set mydic = Nothing End Sub 代码截图: 代码讲解: 1 上述代码实现了将字典数据回填时精准控制每个键值的目的,这个过程中主要利用了mydic.Count 的属性。 2 myarr = Sheets('41').UsedRange 此语句将数据填入数组。注意此语句的写法,不能用Sheets('41').[a1].UsedRange,大家要注意,如果用[A1],那么写法是 Sheets('41').[a1]. CurrentRegion。 3 For i = 2 To UBound(myarr) '当mydic(arr(i,1))没有值时,默认是0,通过下面进行累加。 mydic(myarr(i, 1)) = mydic(myarr(i, 1)) + myarr(i, 2) Next 上述语句中实现了,按字典键的汇总,此处有多种写法,大家要灵活运用。 4 Sheets('41').Cells(2, 'e').Resize(mydic.Count, 1) = Application.Transpose(mydic.Keys) 上述代码先将键回填到工作表中。以便利用键来找键值 5 For i = 2 To mydic.Count + 1 '循环输入字典键对应的值到f列,逐一找到键的对应键值 Sheets('41').Cells(i, 'f').Value2 = mydic(Sheets('41').Cells(i, 'e').Value) Next 上述循环语句利用了键来找键值,然后回填工作表。由于键的数量是mydic.Count ,所以可以直接用一个FOR NEXT循环。 6 如果我们在在实际工作中需要针对每一个键值有精确处理的话,就可以在上述语句中实现了。 下面看代码的运行: 今日内容回向: 1 如何实现数据回填的精准控制? 2 这种方法和利用数组转置回填有何不同? |
|