vba 字典_VBA字典,精准控制字典键值回填的方法

  • Post author:
  • Post category:其他


大家好,我们今天继续讲解VBA数组与字典解决方案,今日的内容是第41讲,在利用字典时,精准控制字典键值回填的方法。通过我前几讲的讲解,大家发现了字典利用的妙处,这种妙处往往是不可说的,给我们的工作带来了极大的便利,让我们的工作可以瞬间完成。做到秒杀。但问题来了,如果我想精确的控制键值的回填,该如何做到呢?之前的讲解中,我总是在利用数组的转置,一次完成,现在我需要的是精准的控制,是否可以做到呢?答案是肯定的。

我们看下面的数据,我们要实现按A列汇总后,将数据回填到E、 F列时要一个一个的填入,以利于我们在某些程序中能对数据有针对性的处理。

3507099f818110deb48a75feeb657949.png

这里我们要利用到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

代码截图:

ed0957a55f6c820fff613f7ce130a9e0.png

代码讲解:

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 如果我们在在实际工作中需要针对每一个键值有精确处理的话,就可以在上述语句中实现了。

下面看代码的运行:

e9bafe97b0a1a85ddf9ad8471100f1b1.png

今日内容回向:

1 如何实现数据回填的精准控制?

2 这种方法和利用数组转置回填有何不同?