|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 香川群子 于 2014-10-14 07:45 编辑
aoe1981 发表于 2014-10-12 22:30
只好来个倒过来的:
对Frequency()工作表函数、进行VBA逆向工程破解,得到如下自定义函数:
=frq([统计对象数据区域 DataRng],[分段点数据区域 BinRng],[输出参数k 缺省=0])- Function frq(DataRng, BinRng, Optional k& = 0)
- Dim i&, j&, m&, n&, r, t
-
- '对分段点进行 排除空单元格、去重复、并从小到大排序
- ReDim bin(BinRng.Count) '定义数组
- For Each r In BinRng '遍历分段点数据区域
- t = r.Value
- If IsNumeric(t) Then '排除空单元格或文字
- m = m + 1 '统计非空有效分段点个数m
- For i = 0 To n
- If bin(i) > t Then Exit For Else If bin(i) = t Then n = n - 1: Exit For
- Next
- If bin(n) = "" Then
- For j = n To i + 1 Step -1
- bin(j) = bin(j - 1)
- Next
- bin(j) = t
- End If
- n = n + 1 '统计不重复有效分段点个数n
- End If
- Next
- ReDim Preserve bin(n - 1) '排序完成后、按实际不重复有效分段点个数n 缩小区域(这一步可以不做)
-
- '以下按去重复排序后的分段点区间,对原始数据进行频数个数的统计
- ReDim fq&(n) '定义统计结果数组fq 比分段个数+1 (最后1个需要统计>最大分段值的个数)
- For Each t In DataRng
- For i = 0 To n - 2
- If t <= bin(i) Then Exit For '检查到<=某个分段点值时就可以确定
- Next
- fq(i) = fq(i) + 1 '在该分段值对应位置统计+1
- Next
-
- '以下把完成的频数统计结果,按分段区域个数+1的形式返回
- ReDim fc&(m): m = 0
- For Each r In BinRng '遍历分段值区域 进行检查比对、然后赋值
- t = r.Value
- If t <> "" Then '仅需处理非空单元格
- For i = 0 To n - 1
- If bin(i) = t Then fc(m) = fq(i): fq(i) = 0: m = m + 1: Exit For
- '遍历查找 相同匹配时返回频数统计结果 并修改=0 (确保仅首次出现的分段值有正确统计结果)
- Next
- End If
- Next
- fc(m) = fq(n) '最后一个有效位置放入 >最大分段点的频数统计值
-
- 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"
- End Function
复制代码 输出部分,为大家能明白,在后面的帖子重新做了整理、
各种错误值的设置,是参考实际工作表函数的返回值来设置的。
呵呵。
|
评分
-
2
查看全部评分
-
|