Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1056|回复: 8

[已解决]请教有关统计的自定义函数

[复制链接]
发表于 2021-11-20 22:25 | 显示全部楼层 |阅读模式
请教有关统计的自定义函数,谢谢!
统计.rar (16.28 KB, 下载次数: 5)
发表于 2021-11-21 13:11 | 显示全部楼层
  1. Function COUNTOFDATA(Ind As Double, Optional ByVal Args As Range) As String
  2. Dim rng As Range, d As Object, arrTmp, i&, c, sTmp$
  3. Set d = CreateObject("scripting.dictionary")
  4. For Each rng In Args
  5.   arrTmp = Split(rng.Value, ",")
  6.   For i = 0 To UBound(arrTmp)
  7.     d(arrTmp(i)) = d(arrTmp(i)) + 1
  8.   Next i
  9. Next rng
  10. For Each c In d.keys
  11.   If Len(c) Then If d(c) = Ind Then sTmp = sTmp & "," & c
  12. Next c
  13. If Len(sTmp) Then COUNTOFDATA = Mid(sTmp, 2) Else COUNTOFDATA = "NO DATA"
  14. End Function
复制代码
回复

使用道具 举报

 楼主| 发表于 2021-11-21 17:39 | 显示全部楼层
本帖最后由 yvll 于 2021-11-21 17:45 编辑

非常感谢版主老师!有两个地方请您修改:
1、要统计不连续单元格,这个自定义函数统计的是连续单元格。(也有可能我不会用,请您指教,我这样写=COUNTOFDATA(AL$1,$V9,$Y9,$AB9,$AD9,$AF9,$AG9))不行)
2、统计结果的数字请用升序排列。
10.JPG
回复

使用道具 举报

发表于 2021-11-21 18:18 | 显示全部楼层
=COUNTOFDATA(AL$1,($V9,$Y9,$AB9,$AD9,$AF9,$AG9))
这样就行了,排序没考虑,如果都是两位数的话,建一个0-99的数组代替字典就行了。

评分

参与人数 1学分 +2 收起 理由
AmoKat + 2 学习了

查看全部评分

回复

使用道具 举报

发表于 2021-11-21 18:39 | 显示全部楼层
大灰狼1976 发表于 2021-11-21 18:18
=COUNTOFDATA(AL$1,($V9,$Y9,$AB9,$AD9,$AF9,$AG9))
这样就行了,排序没考虑,如果都是两位数的话,建一个 ...

=COUNTOFDATA(AL$1,($V9,$Y9,$AB9,$AD9,$AF9,$AG9))
自訂函數在儲存格公式上可這樣傳很多不連續性儲存格

請ˋ問在VAB SUB 程式中,這函數要如何傳很多不連續性儲存格。

回复

使用道具 举报

发表于 2021-11-21 18:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 大灰狼1976 于 2021-11-21 19:01 编辑
大灰狼1976 发表于 2021-11-21 18:18
=COUNTOFDATA(AL$1,($V9,$Y9,$AB9,$AD9,$AF9,$AG9))
这样就行了,排序没考虑,如果都是两位数的话,建一个 ...

如果都是0-99范围内的数字,可以用数组快速排序,如下:
Function COUNTOFDATA(Ind As Double, Optional ByVal Args As Range) As String
Dim rng As Range, arr(99) As Long, arrTmp, i&, sTmp$
For Each rng In Args
  arrTmp = Split(rng.Value, ",")
  For i = 0 To UBound(arrTmp)
    If Len(arrTmp(i)) Then arr(arrTmp(i)) = arr(arrTmp(i)) + 1
  Next i
Next rng
For i = 0 To 99
  If arr(i) = Ind Then sTmp = sTmp & "," & i
Next i
If Len(sTmp) Then COUNTOFDATA = Mid(sTmp, 2) Else COUNTOFDATA = "NO DATA"
End Function

评分

参与人数 1学分 +2 收起 理由
yvll + 2 太棒了

查看全部评分

回复

使用道具 举报

发表于 2021-11-21 18:52 | 显示全部楼层
本帖最后由 大灰狼1976 于 2021-11-21 18:53 编辑
AmoKat 发表于 2021-11-21 18:39
=COUNTOFDATA(AL$1,($V9,$Y9,$AB9,$AD9,$AF9,$AG9))
自訂函數在儲存格公式上可這樣傳很多不連續性儲存格 ...

如果要在VBA SUB里面使用此函数,如下方式:
Sub test()
MsgBox COUNTOFDATA(Sheet1.[AL1], Sheet1.[V9,Y9,AB9,AD9,AF9,AG9])
End Sub

评分

参与人数 1学分 +2 收起 理由
AmoKat + 2 学习了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-11-21 20:04 | 显示全部楼层
大灰狼1976 发表于 2021-11-21 18:51
如果都是0-99范围内的数字,可以用数组快速排序,如下:
Function COUNTOFDATA(Ind As Double, Optional ...

太棒了,非常非常好,感谢您!
回复

使用道具 举报

发表于 2021-11-21 20:16 | 显示全部楼层
yvll 发表于 2021-11-21 20:04
太棒了,非常非常好,感谢您!

不必客气!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-24 00:21 , Processed in 0.425853 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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