ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 按数值从大到小返回前一二三名对应序号的自定义函数

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-9 09:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
恳请老师们帮忙扩展原代码数据列数或重新编写新代码!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-9 19:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-9 21:58 | 显示全部楼层
本帖最后由 WYS67 于 2019-1-10 08:17 编辑

老师:您写的代码完全实现了我想要的统计功能【见下面左图】!
      但是,仅仅只能在数据源刚好是九列的情况下,才能进行前三排位统计,多一列少一列都不行,却又极大地限制了这个代码广阔的使用前途,并且当A4:F4的序号名称发生变化时【就假设如A4:F4的两位数,或者是英文简称,又或者是职工姓名】,不知还能不能返回正确的结果?

     所以,怎样才不局限于当前的九列数据,修改为:当数据源在3~9列时还仍然适用?让公式根据数据区域的列数,返回前三序号名称【不仅仅限于0~8的一位数数字】,如此即可大大提高代码的适用范围和统计功能,真正成为一个万金油的排名函数! 20190110022626.png

20190110081515.png 20190110081529.png


前三排名.zip

32.7 KB, 下载次数: 3

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-9 22:23 | 显示全部楼层


恳请老师们帮忙完善代码,使之能够对3~9列的数据都能进行前三排位。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 08:18 | 显示全部楼层

恳请老师们帮忙完善代码,使之能够对3~9列的数据都能进行前三排位

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 09:36 | 显示全部楼层

恳请老师们帮忙完善代码,使之能够对3~9列的数据都能进行前三的名称进行排位。

TA的精华主题

TA的得分主题

发表于 2019-1-10 12:23 | 显示全部楼层
  1. Option Explicit

  2. Function QSPW(rgData As Range, Optional arrIndex As Variant = 4) As Variant
  3.     Dim arrTitle As Variant, arrData As Variant, rgCur As Range
  4.     Dim lngRow As Long, lngCol As Long, lngCols As Long, intLen As Integer
  5.     Dim lngVal() As Long, strVal() As String
  6.     Dim arrResult As Variant, arrReturn As Variant, lngID As Long
  7.     Dim lngIndex As Long, strTemp(1 To 3) As String, strAll As String
  8.    
  9.     Application.Volatile True
  10.    
  11.     lngCols = rgData.Columns.Count
  12.     If lngCols < 3 Then Exit Function '小于3列退出
  13.    
  14.     ReDim lngVal(1 To lngCols) As Long, strVal(1 To lngCols) As String
  15.    
  16.     arrTitle = rgData.Offset(-1, 0).Resize(1) '标题区域是数据区域的上一行
  17.     arrData = rgData
  18.     lngID = arrIndex
  19.    
  20.     Set rgCur = Application.Caller
  21.     ReDim arrResult(1 To rgCur.Rows.Count, 1 To 4) As String
  22.     Set rgCur = Nothing
  23.    
  24.     For lngRow = LBound(arrData) To UBound(arrData)
  25.         If arrData(lngRow, 1) = "" Then Exit For
  26.         For lngCol = 1 To lngCols
  27.             strVal(lngCol) = arrData(lngRow, lngCol) & strVal(lngCol)
  28.             lngVal(lngCol) = Val(Trim(Mid(strVal(lngCol), 1, 7)) & Format(lngCol, "00"))
  29.         Next
  30.         
  31.         lngIndex = lngIndex + 1: strAll = ""
  32.         For lngCol = 1 To 3
  33.             strTemp(lngCol) = Right(CStr(Application.WorksheetFunction.Large(lngVal, lngCol)), 2)
  34.             strAll = strAll & arrTitle(1, strTemp(lngCol))
  35.             arrResult(lngIndex, lngCol) = arrTitle(1, strTemp(lngCol))
  36.         Next
  37.         arrResult(lngIndex, 4) = strAll
  38.     Next
  39.    
  40.     arrReturn = Application.WorksheetFunction.Index(arrResult, 0, lngID)
  41.     QSPW = arrReturn
  42. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 15:54 | 显示全部楼层

老师:您这次写的代码太好了!完完全全实现了我的初衷!万分感激老师的热心帮忙!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 18:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 WYS67 于 2019-1-10 20:29 编辑

20190110175144.png 20190110181357.png

老师:请看上面左边的截图:A:C列数据源各个单元格里的数字都<=9,所以H:K列的计算结果正确;而N:P列数据源各个单元格里的数字部分>=9【两位数】,所以R:U列的计算结果大部分不正确!我又测试了上面右边截图里数据源为7列,里面的数字在0~1000时的计算结果,发现大部分也存在错误。

恳请老师修改代码:让需要统计的数据源里的数字突破位数限制,对>9的多位数【理论上不限位数】数字仍然能够排名。

数据源数字超过9【一位数】时结果就会出错?.zip (27.11 KB, 下载次数: 6)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 20:27 | 显示全部楼层
恳请老师们帮忙,解决32楼描述的问题。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 00:26 , Processed in 0.039500 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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