大家好,我们今天继续讲解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 这种方法和利用数组转置回填有何不同?