请教函数:怎样将前20名的列出来?
excel吧
全部回复
仅看楼主
level 5
牧民欢歌 楼主
如下图,“前20名”的数据是从“汇总”里复制过来的,还把排名列拉到了最前面,而在“汇总”表中排名列是在最后的N列,这样,如果“汇总”里有数据变动的话,前20名的表可能又要重新处理。请帮忙在“前20名”A2里写一个公式,把前20名的序号列出来,然后再查找序号对应的人员和各月份的数据。这里还有个问题,排名里,有两个并列第3名,后面可能还会有其他并列排名的,这个不用管他,原表中并列就让他并列着。谢谢。
2024年11月20日 08点11分 1
level 5
牧民欢歌 楼主
并列排名都是极个别的,可以忽略不管。就算出现有并列,手动改一下也没问题。
2024年11月20日 08点11分 2
你的汇总表也没看到有分组的列呀
2024年11月23日 02点11分
level 5
没搞懂这个逻辑,为何不在汇总表最后加一列排名,然后 前20名这张表直接用filter取前20就行了。
2024年11月20日 09点11分 3
因为汇总表不是按排名顺序的,里面好几百人,是按组排序的。filter我又不会用。[吐舌]其实我可能要的就是filter的用法。
2024年11月20日 11点11分
level 7
FILTER(A2:B15,A2:A15<=20,"")
看效果
2024年11月20日 09点11分 4
谢谢哥们,我试了是可以,但是列的顺序不能调,只能按汇总表那里的列顺序,前20名filter完后,把排名那列拉到最前面去会变成空白。这怎样解决?
2024年11月20日 12点11分
能不能在A列先把汇总表中排名那列(即N列)里<=20的数字先查找出来,再按照这个数字lookup出来?我不直接填充1-20是因为需要以后匹配数据的变更,而且还有极个别是并列排名的。
2024年11月20日 12点11分
@牧民欢歌 这个函数可以输出单独一列的内容,我输出两列是因为你没讲其他条件
2024年11月21日 08点11分
level 10
sort函数可以吗,take函数取20行,choosecols函数选择需要的列及顺序
2024年11月20日 09点11分 5
level 5
将数据输入,用Vba构造宏重排一下不就好了?想按各科或总分排都可以。
2024年11月20日 11点11分 6
没看到你前面还有个汇总工作表,有那个更简单,在你这前20这里完全可以用vba同步跟随“汇总”里把排名实时更新。即汇总里数据变化,不需要任何操作,前20名同步更新。
2024年11月20日 11点11分
哥们,我只会几个常用的函数,vba搞不懂。[汗]
2024年11月20日 12点11分
@牧民欢歌 也很简单的,先把你的“汇总”和“前20名”两个表单弄得跟我下面说的一致:汇总表里第一行为表头,依次为“学号(或序号)、姓名、1月、2月、…、12月、总分数”,即从A列到O列。前20名跟你这一样,但把10月补上,你这表缺10月。
2024年11月21日 09点11分
@牧民欢歌 在“选项”里把宏设置启动,右键点击表的功能区,选“自定义功能”找到“开发者选项”,在前面框框打✓。复制我发在贴后的程序,右键点击表单“前20名”的下方的标签,左键点击启动程序(好像是第345哪一个)在光标空白区粘贴。保存,退出。
2024年11月21日 09点11分
level 5
汇总表里有分组排名不影响,加一列 总排名 这列是每个人的总名次,不是按大小排列的。
然后引用在 前20名sheet中: =TAKE(SORTBY(汇总表区域,总排名列,1),20) 就可以了
2024年11月20日 12点11分 7
level 5
Sub 排名()
Dim i As Integer: Dim k As Integer: Dim j As Integer: Dim n As Integer
Dim AA(54) As Integer: Dim AB(54) As Integer: Dim AC() As Variant
AC = Array("B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O")
For j = 1 To 55
AA(j - 1) = Sheets("汇总").Range("O" & j + 1)
AB(j - 1) = j + 1
Next
For j = 1 To 55
For k = j To 54
i = AA(j - 1)
If (AA(k) > i) Then
AA(j - 1) = AA(k): AA(k) = i
n = AB(j - 1): AB(j - 1) = AB(k): AB(k) = n
End If
Next: Next
For k = 1 To 14
For j = 1 To 20
Sheets("前20名").Range(AC(k - 1) & j + 1) = ""
Sheets("前20名").Range(AC(k - 1) & j + 1) = Sheets("汇总").Range(AC(k - 1) & AB(j - 1))
Next: Next
End Sub
2024年11月21日 09点11分 8
可是这是Excel吧,乱加东西很容易导致更多的麻烦。
2024年11月21日 14点11分
啥麻烦?这都是office自带的,只有便利哪有麻烦?
2024年11月22日 00点11分
level 5
上面是55个学生,若是50个改一下55和54为“50和49”即可。若是想把所有学生都排名,把“1 to 20”的20改成前面表单的人数就好了。
2024年11月21日 09点11分 9
谢谢哥们,虽然有点慒,对照着做基本上好了。但汇总表里更新数据后,前20名的表中不会更新数据,可能是我哪一步没做对。待我再认真研究一下。再次感谢。
2024年11月21日 12点11分
这个没法实时更新,每次改一下点一下就好了。
2024年11月21日 12点11分
把程序写在那个“thisworkbook”,再把第一排换成“Private Sub workbook_Open()”,可以在每次文件打开时自动更新排名。
2024年11月21日 12点11分
@牧民欢歌 实时更新要复杂很多。
2024年11月21日 12点11分
level 5
筛选里是不是有个前多少名
2024年11月23日 05点11分 10
level 5
Private Sub Worksheet_Activate()
Dim i As Integer: Dim k As Integer: Dim j As Integer: Dim n As Integer
Dim AA(54) As Integer: Dim AB(54) As Integer: Dim AC() As Variant
AC = Array("B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O")
For j = 1 To 55
AA(j - 1) = Sheets("汇总").Range("O" & j + 1)
AB(j - 1) = j + 1
Next
For j = 1 To 55
For k = j To 54
i = AA(j - 1)
If (AA(k) > i) Then
AA(j - 1) = AA(k): AA(k) = i
n = AB(j - 1): AB(j - 1) = AB(k): AB(k) = n
End If
Next: Next
Sheets("前20名").Unprotect Password = "123"
For k = 1 To 14
For j = 1 To 20
Sheets("前20名").Range(AC(k - 1) & j + 1).Locked = False
If (Sheets("前20名").Range(AC(k - 1) & j + 1) <> Sheets("汇总").Range(AC(k - 1) & AB(j - 1))) Then
Sheets("前20名").Range(AC(k - 1) & j + 1) = Sheets("汇总").Range(AC(k - 1) & AB(j - 1))
End If
Sheets("前20名").Range(AC(k - 1) & j + 1).Locked = True
Next: Next
Sheets("前20名").Protect Password = "123"
End Sub
2024年11月26日 09点11分 11
实测了下,效果还可以。
2024年11月26日 09点11分
不错,建议加强表格赋值数组时边界方面的运用技巧。不要定义数组成员数。
2024年11月28日 01点11分
@QQ47436528 这个没啥吧?动态数组和静态数组各有各的优点吧?动态数组灵活但每次都会进行内存分配影响速度,静态数组虽不灵活但一次分配内存即可会提高代码性能。各有优缺点啊。看实际使用情况吧。
2024年11月28日 12点11分
@QQ47436528 其实我觉得静态数组更好的,如果代码涉及的数组非常多的情况下过度使用动态数组会让代码运行慢一拍的。因为动态数组,每次写入都会重新换一个内存位置来写的,在内存里频繁变动效率不佳。这个情况不仅限于vba。
2024年11月28日 12点11分
level 8
Private Sub Worksheet_Activate()
ThisWorkbook.Sheets("汇总").[a1].CurrentRegion.Resize(, 13).Copy
With ThisWorkbook.Sheets("前20名")
.[b1].PasteSpecial
Selection.Sort Key1:=Range("n1"), Order1:=2, Header:=xlYes
.UsedRange.Offset(21).Delete
End With
End Sub
2024年11月30日 09点11分 13
level 8
2024年11月30日 14点11分 15
1