以下是引用那么的帅在2010-12-19 10:07:00的发言:楼主,1楼看的有些乱,请把需要解释的代码,用红色字体标注一下,可以吗? Sub L() Dim arr, brr, crr, drr(), q(), k% Dim dic As Object On Error Resume Next Application.ScreenUpdating = False Sheets(1).Range("E5:BY65536").ClearContents arr = Sheets(2).Range("A4", Sheets(2).[X65536].End(3)) '取得原始数据 brr = Sheets(1).Range("A5", Sheets(1).[A65536].End(3)) '取得表一a列的各地址 crr = Sheets(1).Range("e2", Sheets(1).[by2].End(1)) '取得表一的各疾病表头:不懂为什么要用“[by2].”? Set dic = CreateObject("scripting.dictionary") For m = 1 To UBound(crr, 2) dic(crr(1, m)) = 0 ' 在字典中添加表1中每个病种的名称,并将计数值初始化为0 Next m k = 1 For i = 1 To UBound(arr) If Not dic.exists(arr(i, 24)) Then ''在这里判断表2中出现的病名在字典中是否存在,不存在则添加到字典中,也将计数值初始化为0,并加入一维数组q中 dic(arr(i, 24)) = 0 ReDim Preserve q(1 To k) q(k) = arr(i, 24) k = k + 1 End If Next If Not IsEmpty(q) Then Sheets(1).[by2].End(1).Offset(, 1).Resize(UBound(q)) = q '若数组q不为空 说明表2中存在表1中所没有的病名, ' 于是就 将新增的病名添加到表1中去,追加在第2行后面的列中 '如果q不为空,后面的crr就与第一次的crr不一样了,当然后面的字典也就不一样了,所以要重新来一次。 '如果q是空的,那crr,字典和之前的是一样的。 crr = Sheets(1).Range("e2", Sheets(1).[by2].End(1)) '因为经过上面的操作,表1的病名列表可能更新,因此再一次的给crr赋值,是为了增加新增的病名 ReDim drr(1 To UBound(brr), 1 To UBound(crr, 2)) For i = 1 To UBound(brr) '该字典循环不是在上面第一个已循环了吗?为什么还要执行一次? Set dic = CreateObject("scripting.dictionary") '为什么还要set dic?该dic与上面的有什么不同? '注意这是在遍历表2的每个地名,每次得到一行数据,每行数据对应一个地名中所有病种的统计 ' 情况 , 因此在统计前有必要将字典中的统计值清零 For m = 1 To UBound(crr, 2) '在前面的第二个循环If Not dic.exists(arr(i, 24)) Then中不是已加了?我试着去掉该小循环后怎么得出的结果是不变? dic(crr(1, m)) = 0 Next m For j = 1 To UBound(arr) If InStr(1, arr(j, 13), Trim(brr(i, 1))) Then dic(arr(j, 24)) = dic(arr(j, 24)) + 1 End If Next j For n = 1 To UBound(crr, 2) drr(i, n) = dic(crr(1, n)) '这句的意思是将每行统计数据写入记录最终结果的数组drr中,dic(crr(1, n)) 就是读取字典 ' 中病名为 crr(1, n)的统计数据,而crr数组存放的就是表1中各个病名的数组 '仍不太理解!dic(arr(j, 24))是条目值的累加,中间没有通过赋值给dic(crr(1, n)) ,dic(crr(1, n))也应是条目值啊。 Next n Set dic = Nothing Next i Sheets(1).[E5].Resize(UBound(brr), UBound(crr, 2)) = drr Application.ScreenUpdating = True MsgBox "DONE!!!!!" End Sub 谢谢那么的帅老师:现仅剩2个问题了(见红色标注部分 ): 1、程序中是否要通过红色代码部分重新循环一次,加入新的键值。但在前面第二个循环 If Not dic.exists(arr(i, 24)) Then中不是已加了吗?我试着去掉该小循环后怎么不影响结果呢?得出的结果是一样的! For m = 1 To UBound(crr, 2) dic(crr(1, m)) = 0 Next m 2、另外: drr(i, n) = dic(crr(1, n)) 中的dic(crr(1, n))就是dic(arr(j, 24)) = dic(arr(j, 24)) + 1的计数结果吗?不太理解!dic(arr(j, 24))是条目值的累加,中间没有通过赋值给dic(crr(1, n)) ,dic(crr(1, n))也应是条目值啊。 |