Excel将区域中重复数据按出现次数的多少降序排序提取到一列

时间:2015-04-17   作者:snow   来源:互联网

一个固定区域中包含重复数据,要求将其中的数据按出现次数的多少提取到指定列,用包含MODE函数的数组公式可以实现这个要求,如下图所示,数值区域为A1:E10,按出现次数的多少提取到G列。

用MODE函数按出现次数提取区域中的数值

在G2中输入公式:

=MODE(IF(COUNTIF($G$1:G1,A$1:E$10)=0,A$1:E$10))

公式输入完毕按Ctrl+Shift+Enter建结束,之后拖动填充柄向下填充公式,直到出现“#N/A”为止。下面介绍MODE函数用法,不熟悉的朋友可以卡看。

MODE函数

用法:传回在一阵列或范围的资料中出现频率最高的值。

语法: MODE(number1,[number2],...])

参数:

Number1:是要计算众数的第一个数字引数。

Number2:可选参数,是第2 个到第255 个您要计算众数的数字引数。也可以使用单一阵列或阵列参照,来取代以逗点分隔的引数。

受MODE函数的限制,该公式仅对数值有效,且不能提取只出现一次的数值。要将区域中数据按出现次数的多少提取到一列,可用VBA代码来实现。如将下图A1:E10区域中的文本按出现次数多少提取到G列:

VBA按出现次数提取区域中的文本

按Alt+F11,打开VBA编辑器,接着在代码窗口中输入下列代码并运行,即可在G列得到按出现次数降序排序的文本,并在H列得到对应文本的出现次数。如果文本出现的次数相同,则按先行后列的顺序依次提取。

Sub 按出现次数排序()
  Dim d As Object
  Dim Arr
  Dim i As Integer, j As Integer
  Application.ScreenUpdating = False
  
  '提取不重复值并计算出现次数
  Set d = CreateObject("Scripting.Dictionary")
  Arr = Range("A1:E10")
  For i = 1 To UBound(Arr, 1)
  For j = 1 To UBound(Arr, 2)
  If Not d.Exists(Arr(i, j)) Then
  d.Add Arr(i, j), 1
  Else
  d.Item(Arr(i, j)) = d.Item(Arr(i, j)) + 1
  End If
  Next
  Next
  
  '输出并排序
  Range("G2").Resize(d.Count) = Application.Transpose(d.keys)
  Range("H2").Resize(d.Count) = Application.Transpose(d.items)
  Range("G2:H2").Resize(d.Count).Sort key1:=Range("H2"), Order1:=xlDescending
  
  Set d = Nothing
  Application.ScreenUpdating = True
End Sub

以上便是为大家介绍的有关将区域中的数据按其出现次数的多少提取到一列的两种方法,前者仅对数值有效,且只能提取出现二次或以上的数值,后者应用范围比较广一点,建议大家将其掌握。

tag : 重复   次数
发表评论