Vba第三十五课
例:如下图,按左图数据源不分型号/规格只按货物名称进行汇总,包过盘存数量、出库数量及库存数量(以数组方式运算)
代码:
Sub 汇总()
Dim arr, brr, a, b
Sheets(1).Range("l3:o9") = ""
arr = Sheets(1).Range("b3:g17")
brr = Sheets(1).Range("k3:o9")
For a = 1 To UBound(arr)
For b = 1 To UBound(brr)
If arr(a, 1) = brr(b, 1) Then
brr(b, 2) = arr(a, 3)
brr(b, 3) = brr(b, 3) + arr(a, 4)
brr(b, 4) = brr(b, 4) + arr(a, 5)
brr(b, 5) = brr(b, 5) + arr(a, 6)
Exit For
End If
Next
Next
Sheets(1).Range("k3:o9") = brr
Sheets(1).Range("k3:o9").HorizontalAlignment = xlCenter
End Sub
代码解释:
Sheets(1).Range("l3:o9") = ""
清空工作表L3:O3中的数据,因为代码在调试运行中可能会进行多次,如果没有清空,当发现数据有错时,再次运行会导致数据的不准确或者程序报错中断;
arr = Sheets(1).Range("b3:g17")
brr = Sheets(1).Range("k3:o9")
把表中的数据放入两个数组中
For a = 1 To UBound(arr)
For b = 1 To UBound(brr)
If arr(a, 1) = brr(b, 1) Then
第一个for是在arr中循环,第二个for是在brr中循环,然后去判断arr中的第a行第1列是否等于brr中的第b行第1列的值是否相等或是相同,可能初学者不太好理解,打个比方说就是工作表中的B3单元格的值循环去对比K3:k9的值(如上图),当相等时也就是满足if arr(a, 1) = brr(b, 1)的条件,然后运if判断下的代码,然后B4再次去比对K3:k9的值,直到B15为止;
brr(b, 2) = arr(a, 3):把工作表货物名称的单位赋值到brr数组
brr(b, 3) = brr(b, 3) + arr(a, 4) :
1.0花线在arr中有三行,当第一次赋值给brr时,值是对的,当第二次赋值给brr时,是不是要加上第一次的值,否则第一次的值就被第二次的值覆盖,就达不到数据累计求和的作用,只能是获最到最后一次1.0花线的值,所以这是一个动态的运算,大家可以单步运行一下在本地窗口中看一下值的变化就清楚了。
Exit For
这是一个知识点,我们可以确定K3:K9区域的值是唯一的,当B3从K3开始循环判是否相等时,当与K3相等,再与K4:K9的循环就毫无意义,这样直接跳出第二个循环也就是for b=1 to ubound(brr)这个循环,大家注意exit for 的位置是在if和endif中间,大家可以把它放在end if和next之间,单步循环,同时在本地窗口看a,b值的变化,就能体会到exit for它生效在哪个环节,这些东西文字比较难表达,大家运行一下就知道它的逻辑了。
如果觉得有帮助的话记得关注和点赞,有不懂的地方可以私信我,需要表格素材的也可私信给我转发给你们。
如果各位在实际工作中遇见excel常规方法无法解决的或操作比较复杂的报表可以私信我,可以免费编写代码来解决!