python数量不确定的数组定义 不确定个数的数组储存_数据


大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第78讲内容:利用字典和数组,完成不确定分类数目下数据分工作表分类。

这讲的内容是继续上一讲的内容,将数据分类后分工作表记录分类后的数据。在上一讲中我讲了数组的方法,这一讲中我讲利用字典的方法来实现这个方案。利用字典,代码会非常简单套,条理也会非常清晰。应用字典能让思路清晰主要是字典只有键和键值,是一一对应的关系,逻辑关系简单。利用的时候,只要弄懂键和键值的关系,就可以得心应手。

实例,数据仍是上一节的数据,要根据编号不同放入以编号为命名的工作表中。这讲我们将采用字典的方案。


python数量不确定的数组定义 不确定个数的数组储存_数组_02


思路分析:我们首先把数据存入数组,用一个字典存放分类的依据,同时要再创建一个字典留作结果数据的储存。在存储的数据中键值用数组处理,这样回填数据的时候可以方便一些。在这讲的讲解中,我们不用事先指定分类的依据,可以在数据中自动产生。

下面看我给出的代码:

Sub mynzsz_78() '第78讲 利用字典和数组,完成不确定数目下数据的分工作表分类
Sheets("78").Select
'将数据放到数组中
 myarr = Range("a2:d" & Range("a1").End(xlDown).Row)
 Set mydic = CreateObject("Scripting.Dictionary")
 Set myadic = CreateObject("Scripting.Dictionary")
 '提取数据中的分类标准放入数组
 For i = 1 To UBound(myarr)
 mydic(myarr(i, 2)) = ""
 Next
 '按键分类数据
 For Each uu In mydic.Keys
 '利用数组分别存放数据
 For i = 1 To UBound(myarr)
 If myarr(i, 2) = uu Then
 myadic(myarr(i, 1)) = Array(myarr(i, 3), myarr(i, 4))
 End If
 Next
 '新建工作表,回填数据
 Set YY = Worksheets.Add(after:=Sheets("78"))
 YY.Name = uu
 '回填数据,设置格式
 With YY
 .Range("a1:C1") = Array("序号", "日期", "金额")
 .[a2].Resize(myadic.Count, 1) = WorksheetFunction.Transpose(myadic.Keys)
 .[b2].Resize(myadic.Count, 2) = WorksheetFunction.Transpose(WorksheetFunction.Transpose(myadic.Items))
 .UsedRange.Borders.LineStyle = xlContinuous
 End With
 '清空字典
 myadic.RemoveAll
 Next
 Set mydic = Nothing
 Set myadic = Nothing
End Sub

代码的截图:


python数量不确定的数组定义 不确定个数的数组储存_python数量不确定的数组定义_03


代码分析:

1 上述代码用于存储源数据的是myarr数组,用字典mydic存储提取数据的分类依据,也就是要建立的工作表名称,同时创建用于存储提取结果数据的字典myadic,然后我们先要取得数据分类的标准,也就是说编号的字段做一下排重处理,然后根据分类的基准在数据中提取数据放到存储结果的数据字典中,每一类提取完成,新建工作表回填数据。

2 '将数据放到数组中
 myarr = Range("a2:d" & Range("a1").End(xlDown).Row)
以上代码将数据存入数组。
3 Set mydic = CreateObject("Scripting.Dictionary")
 Set myadic = CreateObject("Scripting.Dictionary")
上述语句创建了两个字典分别用来装载数据的分类和提取的结果。
4 '提取数据中的分类标准放入数组
 For i = 1 To UBound(myarr)
 mydic(myarr(i, 2)) = ""
 Next
上述语句实现分类标准的提取
5 '利用数组分别存放数据
 For i = 1 To UBound(myarr)
 If myarr(i, 2) = uu Then
 myadic(myarr(i, 1)) = Array(myarr(i, 3), myarr(i, 4))
 End If
 Next
上述语句分类提取数据装入字典
6 '新建工作表,回填数据
 Set YY = Worksheets.Add(after:=Sheets("78"))
 YY.Name = uu
 '回填数据,设置格式
 With YY
 .Range("a1:C1") = Array("序号", "日期", "金额")
 .[a2].Resize(myadic.Count, 1) = WorksheetFunction.Transpose(myadic.Keys)
 .[b2].Resize(myadic.Count, 2) = WorksheetFunction.Transpose(WorksheetFunction.Transpose(myadic.Items))
 .UsedRange.Borders.LineStyle = xlContinuous
 End With

上述代码建立一个新的工作表,工作表的名字就是分类的标准,数据的回填就是刚才提取出来的字典myadic的数据。

7 '清空字典

myadic.RemoveAll

上述语句千万不要漏掉,是清空字典,以便下一次循环。

下面看代码的运行:


python数量不确定的数组定义 不确定个数的数组储存_新建工作表_04


python数量不确定的数组定义 不确定个数的数组储存_新建工作表_05


今日内容回向:

1 如何利用字典实现数据的分类,填入工作表。

2 这讲的内容和上一讲相比,自动实现了数据分类类别的计算,是如何做到的?