玖叶教程网

前端编程开发入门

Vba第三十五课

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常规方法无法解决的或操作比较复杂的报表可以私信我,可以免费编写代码来解决!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言