您的位置 首页 java

VBA实例2:合并汇总

问题如上,

思路:

设计一个行列二维数组,用来逐个存储原始数据,后面存储的数据和数组已存在的数据进行比较,如果已经存在,则合并同类,否则数组添加新值。最后将该二维数组写入到目标区域

细节:

1、 因为是二维数组,而一般动态数组扩容只能改变最末维,所以可以提前定义一个足够大的固定数组;

2、 在元素是否已存在于数组中,采取循环遍历方法,但遍历时会将有值的元素和空元素都进行遍历,为减少循环量,可提前设置循环区域为有效数据区间;

代码:

Sub t()
Dim arr, n, check_return, max_ Row 
Dim rng
 
Sheets(1).Activate
With Sheets(1)
 max_row = [a66356].End(xlUp).Row
 n = max_row
 ReDim arr(1 To n, 1 To 3)
 n = 1
 For Each rng In Range("a2:a" & max_row)
 check_return = check(rng.value, arr, 1)
 If check_return Then
 arr(check_return, 2) = rng.Offset(, 1).value + arr(check_return, 2)
 arr(check_return, 3) = arr(check_return, 3) & "、" & rng.Offset(, 2).value
 Else
 arr(n, 1) = rng.value
 arr(n, 2) = rng.Offset(, 1).value
 arr(n, 3) = rng.Offset(, 2).value
 n = n + 1
 End If
 Next rng
End With
 
Sheets(2).Activate
[a2].Resize(n - 1, 3) = arr
 
End Sub
 
 
Function check(value, arr, column)
' 检查value是否存在于arr的指定列中,不存在返回False,存在返回对应在arr中的序号
Dim r, max_num
 
' 获取数组有效最大序号,减少循环比对
max_num = Application.WorksheetFunction.Count(arr) / 2
 
For r = 1 To max_num
 If value = arr(r, column) Then
 check = r
 Exit Function
 End If
Next r
check = False
End Function 
 

文章来源:智云一二三科技

文章标题:VBA实例2:合并汇总

文章地址:https://www.zhihuclub.com/197128.shtml

关于作者: 智云科技

热门文章

网站地图