ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4797|回复: 7

请求用VBA统计指定区域人名出现的重复次数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-5-25 12:19 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有时在工作中会用到“统计指定区域人名出现的重复次数”,请各位大师帮忙写一个代码。
要求:1、统计指定区域(A1:L51)人名出现的次数,分别在O列和P列中显示出来。
         2、最好对代码有具体的说明,以便于我学习和领悟。
         3、假如要改变指定区域的范围,应改变代码中哪些部分?

统计重复次数.rar

9.38 KB, 下载次数: 84

TA的精华主题

TA的得分主题

发表于 2015-5-25 18:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub 人名出现次数()
  2. Dim i&, j&, Arr
  3. Dim d, k, t
  4. Columns("O:P").ClearContents
  5. Set d = CreateObject("Scripting.Dictionary")
  6. Arr = Sheet1.Range("a1:l51")
  7. For i = 1 To UBound(Arr)
  8.     For j = 1 To UBound(Arr, 2)
  9.        If Arr(i, j) <> "" Then d(Arr(i, j)) = d(Arr(i, j)) + 1
  10.     Next
  11. Next
  12. k = d.keys
  13. t = d.items
  14. [o2].Resize(d.Count, 1) = Application.Transpose(k)
  15. [p2].Resize(d.Count, 1) = Application.Transpose(t)
  16. [o1].Resize(1, 2) = Array("姓名", "次数")
  17. Set d = Nothing
  18. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-5-25 18:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请看附件。

统计姓名重复次数.zip

15.93 KB, 下载次数: 362

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-26 08:25 | 显示全部楼层
谢谢清风竹老师的热心帮助和指导!代码好使,速度也快,今天早上我把它移植到Excel2010中也行。我也曾借用过其他的代码,但是它把区域内的空格也作为一个人名统计进去了,而你这个代码是我最称心的。再次感谢大师!

TA的精华主题

TA的得分主题

发表于 2015-5-26 08:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
厉害,作为VBA新手表示还有些看不懂,慢慢学习中,谢谢老师

TA的精华主题

TA的得分主题

发表于 2015-5-31 10:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个可以用函数实现的,何必要编码啊!

TA的精华主题

TA的得分主题

发表于 2015-6-12 12:14 | 显示全部楼层
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

统计重复次数.rar

20.96 KB, 下载次数: 131

TA的精华主题

TA的得分主题

发表于 2015-6-14 19:56 | 显示全部楼层
论坛新人 只为学习学习

统计重复次数.zip

17.49 KB, 下载次数: 93

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 20:29 , Processed in 0.045184 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表