ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

   
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
楼主: WYS67

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-9 09:47 | 显示全部楼层
恳请老师们帮忙扩展原代码数据列数或重新编写新代码!

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 | 显示全部楼层

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鲜花 +2 收起 理由
WYS67 + 2

查看全部评分

TA的精华主题

TA的得分主题

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

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 18:19 | 显示全部楼层
本帖最后由 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, 下载次数: 5)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 20:27 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

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

GMT+8, 2019-6-26 14:32 , Processed in 0.115899 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Wooffice Inc.

   

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

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

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