|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
Sub 统计区域不重复值()
t = Timer
Range("n1:p3000").Clear '清除原来数据
Dim arr1(1 To 3000), arr2(1 To 3000) '数组最大值3000视所有名字个数而定,只能大不能小,要不数组空间不够
a = Cells(1, Columns.Count).End(xlToLeft).Column '查找第一行所用单元格的列数
b = Cells(Rows.Count, 1).End(xlUp).Row '查找第一列所用单元格的行数,这两句是定位右下角单元格,相当于动态引用,表格大小随便变动都可以找到所用区域
Cells(1, a + 3) = "姓名" '空两列赋值
Cells(1, a + 4) = "次数"
arr = Range(Cells(1, 1), Cells(b, a)) '区域值赋给数组arr
For Each i In arr '遍历区域中的单元格,并把不重复的值存到数组arr1中
For j = 1 To UBound(arr1) 'UBound(arr1)是计算数组arr1的最大值也就是3000
If i = arr1(j) Then '如果单元格i等于数组arr1(j)那么循环下个单元格,说明数组arr1中已经存在一个相同的单元格也就是名字已经存在
GoTo 100 '跳转语句,直接循环判断下个单元格
End If
Next j
k = k + 1 '计数的目的是统计不重复名字的个数,也就是数组arr1的大小
arr1(k) = i
100:
Next
[o2].Resize(k) = Application.Transpose(arr1) '以O2单元格为准,向下扩展k行,并把数组arr1(存储不重复名字的数组)写入这个区域
' Application.Transpose把数组转换成一维
'统计重复次数,思路是遍历所有单元格,当它与数组arr1相同时计数,也就是重复的次数
For a1 = 1 To UBound(arr1)
For Each i In arr '遍历区域
If i = arr1(a1) Then '遍历数组arr1,此时的数组arr1是有前面筛选出来的不重复名字组成
b1 = b1 + 1 '有相等的计数,单元格循环一遍有几个重复就记几次
End If
Next
a2 = a2 + 1 '计数,因为没有定义a2,所以a2从零开始,方便下面将b1的值写入数组arr2
arr2(a2) = b1 'b1值写入数组arr2
b1 = 0 'b1归零,下次循环判断下个单元格的值时候b1就会累加,最后的出来的b1是一个值,也就是所有重复名字的次数,而不是我们要的数组
Next
[p2].Resize(k) = Application.Transpose(arr2) '数组写入
MsgBox "运行所需时间是:" & Format(Timer - t, "0.00") & "S" '计时器,计算程序运行所需时间
End Sub
|
|