|
楼主 |
发表于 2020-7-18 12:23
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
2.纯数组法,耗时1分钟左右(和我笔记本CPU主频低也有关系)
循环数组arr第1个元素到当前元素的前一个,判断没有出现过相同的,就把arr元素传递给brr数组中,去重;
内循环brr,当数组arr的元素与brr(y,1)相同,次数累计,金额累加
当数据多时,arr循环次数*brr循环次数会变得非常大,期待大神优化纯数组方法。
- Sub 数组法取唯一值()
- t = Timer
- Dim arr(), i As Integer, x%, n%, m%
- Range("D:F").ClearContents '清空D:F列内容
- arr = Range("A1:B25000") '单元格值写入数组
- Dim brr(1 To 25000 + 1, 1 To 3) '定义数组brr空间,行数比数组arr大1,用于预防没有重复值时brr的合计行超出范围;也可以用Redim brr定义
- brr(1, 1) = "编号": brr(1, 2) = "次数": brr(1, 3) = "金额" '标题文字
- m = 1 '初始值
- s = UBound(arr)
- For i = 2 To s '循环数组arr
- For x = 1 To i - 1 '循环数组arr第1个元素到当前元素的上一个
- If arr(i, 1) = arr(x, 1) Then
- n = n + 1 '如果出现相同,则令n=n+1
- End If
- Next x
- If n = 0 Then '当n=0,即前面没有出现过相同的
- m = m + 1 '数组行增加1
- brr(m, 1) = arr(i, 1) '将arr数组的值赋给brr数组
- End If
- n = 0 '重置n
- For y = 2 To m '循环brr数组
- If arr(i, 1) = brr(y, 1) Then '当数组arr的元素与brr(y,1)相同
- brr(y, 2) = brr(y, 2) + 1 '元素brr(y,2)的计数+1
- brr(y, 3) = brr(y, 3) + arr(i, 2) 'brr(y,3)的金额加arr(i,2)
- End If
- Next y
- mysum = mysum + arr(i, 2) '累加arr数组的金额
- Next i
- Erase arr
- brr(m + 1, 1) = "合计" 'm是最后的有效范围行,加1即后一行,添加文字"合计"
- brr(m + 1, 2) = s - 1 '写入个数,即数组arr的上限-1
- brr(m + 1, 3) = mysum '写入合计金额
- Range("D1").Resize(m + 1, UBound(brr, 2)) = brr '将数组有效范围m+1行3列写出到单元格中
- MsgBox Timer - t
- End Sub
复制代码
|
|