Dzwebs.Net

撰写电脑技术杂文十余年

Excel求出重复姓名及重复的次数的代码

Admin | 2012-8-15 9:06:58 | 被阅次数 | 7927

温馨提示!

如果未能解决您的问题,请点击搜索;登陆可复制文章,点击登陆

  假如,表格中的人物的姓名,有很多是重复的,而问题的需求是:要求编写一段代码,把重复的人的姓名以及重复的次数求出来,复制到另一个表格中。

  我们可通过如下的VBA代码来实现。

  Sub CountCFZ()
  Dim i&, Myr&, Arr
  Dim d, k, t
  Set d = CreateObject("Scripting.Dictionary")
  Myr = Sheet1.[a65536].End(xlUp).Row
  Arr = Sheet1.Range("a1:g" & Myr)
  For i = 2 To UBound(Arr)
      d(Arr(i, 3)) = d(Arr(i, 3)) + 1
  Next
  k = d.keys
  t = d.items
  Sheet2.Activate
  [a2].Resize(d.Count, 1) = Application.Transpose(k)
  [b2].Resize(d.Count, 1) = Application.Transpose(t)
  [a1].Resize(1, 2) = Array("重复的姓名", "重复的次数")
  Set d = Nothing
  End Sub

  部分代码的解释如下:

  1、Dim i&, Myr&, Arr :变量i和Myr声明为长整型变量。 也可以写为 Dim Myr As Long 。Long 的类型声明字符为(&)。Arr后面没有写明数据类型,默认就是可变型数据类型(Variant)。

  2、Set d = CreateObject("Scripting.Dictionary"):创建字典对象,并把字典对象赋给变量d。这是最常用的一句代码。所谓的“后期绑定”。用了这句代码就不用先引用c:\windows\system32\scrrun.dll了。

  3、Myr = Sheet1.[a65536].End(xlUp).Row :把表1的A列最后一行不为空白的行数赋给变量Myr。这里用了Range对象的End属性,它有4个方向参数,此处的xlUp表示向上,它的值为3,所以也可写成End(3)。xlDown表示向下,它的值为4;xlToLeft表示向左,它的值为1;xlToRight表示向右,它的值为2。

  4、Arr = Sheet1.Range("a1:g" & Myr):把表1的A1到G列最后一行不为空白的 单元格区域的值赋给变量Arr。这样Arr就是个二维数组了,用数组替代单元格引用可对执行代码的速度提高很多很多。

  5、For i = 2 To UBound(Arr) :For…Next循环结构,从2开始到数组的最大上界值之间循环。因为数组的第一行是表头。Ubound是VBA函数,返回数组的指定维数的最大可用上界。

  6、d(Arr(i, 3)) = d(Arr(i, 3)) + 1 :Arr(i,3)在本例是姓名列,也就是关键字列,举个例子,假如Arr(i,3)=”青山”,这句代码的意思就是把关键字”青山”加入字典,d(key)等于关键字key对应的项,每出现一次这个关键字,它的项的值就增加1。起到了按关键字累加的作用,也正因为有这个作用,所以可使用字典来进行各种汇总统计。后面要讲的实例会充分的展现这个作用。

  7、k=d.keys :把字典d中存在的所有的关键字赋给变量k。得到的是一个一维数组,下限为0,上限为d.Count-1。Keys是字典的方法,前面已经讲过了。

  8、t=d.items :把字典d中存在的所有的关键字对应的项赋给变量t。得到的也是一个一维数组,下限为0,上限为d.Count-1。Items也是字典的方法,前面也已经讲过了。

  9、Sheet2.Activate :激活表2。

  10、[a2].Resize(d.Count, 1) = Application.Transpose(k) :把字典d中所有的关键字赋给以a2单元格开始的单元格区域中。详细的解释请见前面的keys方法一节。

  11、[b2].Resize(d.Count, 1) = Application.Transpose(t) :把字典d中所有的关键字对应的项赋给以b2单元格开始的单元格区域中。

  12、[a1].Resize(1, 2) = Array("姓名", "重复个数") :Array是一个VBA函数,返回一个下界为0的一维数组。一维数组是水平排列的,所以赋值给水平的单元格区域不需要用转置函数了。这里作为表头一次性输入。

  13、Set d = Nothing  :释放字典内存。


该杂文来自: Excel杂文

上一篇:Excel字典中的CompareMode属性的例子

下一篇:Excel求出不重复的人的姓名的VBA代码

网站备案号:

网站备案号:滇ICP备11001339号-7

版权属性:

Copyright 2007-2021-forever Inc. all Rights Reserved.

联系方式:

Email:dzwebs@126.com QQ:83539231 访问统计