ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 看见星光

[分享] HI,来吧,咱们一起来边练边学FREQUENCY!

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:FREQUENCY
13732120571 发表于 2014-10-13 10:00
1)去重2)排序或数组公式

I64=TEXT(LARGE(IF(FREQUENCY(B$64:B$75,B$64:B$75),B$64:B$75,-1),ROW(A1)),"0;;0")

以防有 0 分出现

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:34 | 显示全部楼层
本帖最后由 极地飞雪007 于 2014-10-13 12:38 编辑

第三题:


从大到小排序
I64输入普通公式 =IFERROR(LARGE(IF(FREQUENCY($B$64:$B$75,$B$64:$B$75),$B$64:$B$75),ROW(A1)),""),然后下拉


求和
E64输入普通公式=SUM(IF(FREQUENCY($B$64:$B$75,$B$64:$B$75),$B$64:$B$75))

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:42 | 显示全部楼层
排序
  1. =IFERROR(LARGE(IF(FREQUENCY($B$64:$B$75,$B$64:$B$75),$B$64:$B$75),ROW(A1)),"")
复制代码

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:44 | 显示全部楼层
丢丢表格 发表于 2014-10-13 12:31
I64=TEXT(LARGE(IF(FREQUENCY(B$64:B$75,B$64:B$75),B$64:B$75,-1),ROW(A1)),"0;;0")

以防有 0 分出现 ...

谢谢,丢丢老师指正!
  1. =TEXT(LARGE($B$64:$B$75-(MATCH($B$64:$B$75,$B$64:$B$75,)<>ROW($1:$12))/1%%,ROW(A1)),"0;")
复制代码
多画了条脚
也麻烦

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 香川群子 于 2014-10-14 07:45 编辑
aoe1981 发表于 2014-10-12 22:30
只好来个倒过来的:

对Frequency()工作表函数、进行VBA逆向工程破解,得到如下自定义函数:

=frq([统计对象数据区域 DataRng],[分段点数据区域 BinRng],[输出参数k 缺省=0])
  1. Function frq(DataRng, BinRng, Optional k& = 0)
  2.     Dim i&, j&, m&, n&, r, t
  3.    
  4.     '对分段点进行 排除空单元格、去重复、并从小到大排序
  5.     ReDim bin(BinRng.Count) '定义数组
  6.     For Each r In BinRng '遍历分段点数据区域
  7.         t = r.Value
  8.         If IsNumeric(t) Then '排除空单元格或文字
  9.             m = m + 1    '统计非空有效分段点个数m
  10.             For i = 0 To n
  11.                 If bin(i) > t Then Exit For Else If bin(i) = t Then n = n - 1: Exit For
  12.             Next
  13.             If bin(n) = "" Then
  14.                 For j = n To i + 1 Step -1
  15.                     bin(j) = bin(j - 1)
  16.                 Next
  17.                 bin(j) = t
  18.             End If
  19.             n = n + 1 '统计不重复有效分段点个数n
  20.         End If
  21.     Next
  22.     ReDim Preserve bin(n - 1) '排序完成后、按实际不重复有效分段点个数n 缩小区域(这一步可以不做)
  23.    
  24.     '以下按去重复排序后的分段点区间,对原始数据进行频数个数的统计
  25.     ReDim fq&(n) '定义统计结果数组fq 比分段个数+1 (最后1个需要统计>最大分段值的个数)
  26.     For Each t In DataRng
  27.         For i = 0 To n - 2
  28.             If t <= bin(i) Then Exit For '检查到<=某个分段点值时就可以确定
  29.         Next
  30.         fq(i) = fq(i) + 1 '在该分段值对应位置统计+1
  31.     Next
  32.    
  33.     '以下把完成的频数统计结果,按分段区域个数+1的形式返回
  34.     ReDim fc&(m): m = 0
  35.     For Each r In BinRng '遍历分段值区域 进行检查比对、然后赋值
  36.         t = r.Value
  37.         If t <> "" Then '仅需处理非空单元格
  38.             For i = 0 To n - 1
  39.                 If bin(i) = t Then fc(m) = fq(i): fq(i) = 0: m = m + 1: Exit For
  40.                 '遍历查找 相同匹配时返回频数统计结果 并修改=0 (确保仅首次出现的分段值有正确统计结果)
  41.             Next
  42.         End If
  43.     Next
  44.     fc(m) = fq(n) '最后一个有效位置放入 >最大分段点的频数统计值
  45.    
  46.     If k = 0 Then frq = WorksheetFunction.Transpose(fc)  Else If k < 0 Then frq = "#VALUE!" Else If k - 2 < m Then frq = fc(k - 1) Else If k - 1 > BinRng.Count Then frq = "#REF!" Else frq = "#N/A"
  47. End Function
复制代码
输出部分,为大家能明白,在后面的帖子重新做了整理、
各种错误值的设置,是参考实际工作表函数的返回值来设置的。


呵呵。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:49 | 显示全部楼层
第三题:如果是按顺序的不重复排序呢?
抛砖引玉下
  1. =INDEX(G:G,SMALL(IF(FREQUENCY($G$64:$G$75,$G$64:$G$75),ROW($G$64:$G$75)),ROW(A1)))
复制代码

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:51 | 显示全部楼层
本帖最后由 香川群子 于 2014-10-13 13:21 编辑

或者输出参数k的处理,按从小到大应该是:

    If k < 0 Then
        frq = "#VALUE!"
    ElseIf k = 0 Then
        'frq = fc '横向一维数组……在同一行内输出多列结果。        frq = WorksheetFunction.Transpose(fc) '按纵向垂直数组输出……在同一列内输出多行结果。
    ElseIf k>0 Then
        If k - 1 <= m Then
            frq = fc(k - 1)
        ElseIf k - 1 <= BinRng.Count Then
            frq = "#N/A"
        ElseIf k-1>BinRng.Count Then
            frq = "#REF!"
        End If
    End If


因为工作表函数在进行数组三键的数组区域公式形式返回结果时,
是按照在同一列内输出多行结果的【垂直数组】方式输出,所以需要把结果的一维数组进行Transpose转置。




TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-13 12:54 | 显示全部楼层
kuangben8 发表于 2014-10-13 12:49
第三题:如果是按顺序的不重复排序呢?
抛砖引玉下

之后会有一个夹杂着数字、汉字、空格的提取不重复值,且按原有顺序排序。哈哈

点评

那!!难度杠杠的!  发表于 2014-10-13 13:04

TA的精华主题

TA的得分主题

发表于 2014-10-13 12:57 | 显示全部楼层
本帖最后由 aoe1981 于 2014-10-13 13:14 编辑

排序:
  1. =IFERROR(LARGE(IF(FREQUENCY($B$64:$B$75,-(ROW($1:$100)-101))<>0,-(ROW($1:$100)-101),""),ROW(1:8)),"")
复制代码
(不好编辑,只好倒过来,上面是区域数组公式,奇了怪了,感觉本来可以不用数组公式的……)




求和:
  1. =SUMPRODUCT(IF(FREQUENCY(B64:B75,ROW(1:99))<>0,1,0),ROW(1:100))
复制代码

点评

数据源中有0会出错.  发表于 2014-10-14 14:07
排序的解法,倒合了还没发的第五题的意思~~  发表于 2014-10-13 13:36
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 15:59 , Processed in 0.047866 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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