ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 按名次提取数据到新表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-1-23 18:49 | 显示全部楼层 |阅读模式
我有一个表,我想实现按名次一键提取最前和最后三名(或更多)的数据到对应表中,请教各位老师帮我看看怎样写vb代码,谢谢!

按名次提取数据.zip

11.84 KB, 下载次数: 7

按名次提取

TA的精华主题

TA的得分主题

发表于 2018-1-23 19:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub TEST()
Set CN = CreateObject("ADODB.CONNECTION")
CN.Open "PROVIDER=MICROSOFT.JET.OLEDB.4.0;EXTENDED PROPERTIES=EXCEL 8.0;DATA SOURCE=" & ThisWorkbook.FullName
Sql = "SELECT top 3 * FROM [数据源$] ORDER BY 分数 DESC"
Sheets("最前三名").Range("A3").CopyFromRecordset CN.Execute(Sql)
SqlL = "SELECT top 3 * FROM [数据源$] ORDER BY 分数 ASC"
Sheets("最后三名").Range("A3").CopyFromRecordset CN.Execute(SqlL)
End Sub

TA的精华主题

TA的得分主题

发表于 2018-1-23 19:17 | 显示全部楼层
见附件--------

按名次提取数据.zip

19.03 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2018-1-23 19:49 | 显示全部楼层
Sub 前三名()
Dim i As Integer, endrow As Integer
    With Sheet1
        .Range("a:c").Sort key1:=.[c1], order1:=xlAscending, Header:=xlYes
        endrow = .Range("a1").CurrentRegion.Rows.Count
        If .Cells(5, 3).Value = "4" Then
            Sheet2.Range("a7").Resize(3, 3).Value = .Range("a2").Resize(3, 3).Value
        Else
            For i = 6 To endrow
                If Cells(i, 3).Value = 4 Then
                    Sheet2.Range("a7").Resize(i - 2, 3).Value = .Range("a2").Resize(i - 2, 3).Value
                    Exit For
                End If
            Next i
        End If
    End With
Sheet2.Activate
End Sub
Sub 后三名()
Dim i As Integer, endrow As Integer, x
    With Sheet1
        .Range("a:c").Sort key1:=.[c1], order1:=xlDescending, Header:=xlYes
        endrow = .Range("a1").CurrentRegion.Rows.Count
        x = .Cells(2, 3).Value - 3
        If .Cells(5, 3).Value = x Then
            Sheet3.Range("a8").Resize(3, 3).Value = .Range("a2").Resize(3, 3).Value
        Else
            For i = 6 To endrow
                If Cells(i, 3) = x Then
                    Sheet3.Range("a11").Resize(i - 2, 3).Value = .Range("a2").Resize(i - 2, 3).Value
                    Exit For
                End If
            Next i
        End If
    End With
Sheet3.Activate
End Sub

TA的精华主题

TA的得分主题

发表于 2018-1-23 20:54 | 显示全部楼层
Sub test()
    Dim O(2) As Object, Ar, s$, a(), b()
    Application.ScreenUpdating = False
    Set O(0) = CreateObject("htmlfile"): Set O(1) = O(0).parentWindow
    Sheets("数据源").Select
    Ar = Range("a2:c" & Cells(Rows.Count, 1).End(3).Row)
    Set O(2) = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(Ar)
        If Not O(2).exists(Ar(i, 3)) Then
            ReDim a(0)
        Else
            a = O(2)(Ar(i, 3))
            ReDim Preserve a(UBound(a) + 1)
        End If
        a(UBound(a)) = i: O(2)(Ar(i, 3)) = a
    Next
    k = O(2).keys: s = "[""" & Join(k, """,""") & """]"
    O(1).execScript "a=" & s & ";function sortAr(m,n){return m-n};a.sort(sortAr)"
    k = Split(O(1).eval("a"), ",")
    Sheets("最前三名").[a3:c1000] = ""
    r = Sheets("最前三名").Cells(Sheets("最前三名").Rows.Count, 1).End(3).Row + 1
    ReDim a(1 To 100, 1 To UBound(Ar, 2))
    For i = 0 To 2
        For j = 0 To UBound(O(2)(Val(k(i))))
            n = n + 1
            For x = 1 To UBound(Ar, 2)
                a(n, x) = Ar(O(2)(Val(k(i)))(j), x)
            Next
        Next
    Next
    Sheets("最前三名").Range("a" & r).Resize(n, 3) = a
    Sheets("最后三名").[a3:c1000] = ""
    r = Sheets("最后三名").Cells(Sheets("最后三名").Rows.Count, 1).End(3).Row + 1
    ReDim b(1 To 100, 1 To UBound(Ar, 2))
    For i = UBound(k) To UBound(k) - 2 Step -1
        For j = 0 To UBound(O(2)(Val(k(i))))
            m = m + 1
            For x = 1 To UBound(Ar, 2)
                b(m, x) = Ar(O(2)(Val(k(i)))(j), x)
            Next
        Next
    Next
    Sheets("最后三名").Range("a" & r).Resize(m, 3) = b
    Application.ScreenUpdating = True
    MsgBox "ok!"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-23 22:33 | 显示全部楼层
duquancai  任飘渺  曹银强  三位老师的代码都可以,但是只能运行1次,不能重复执行。我要的是可以重复执行,达到可追加数据的效果!另外,我有一个表,麻烦各位老师,顺便帮我改改代码(见附件)谢谢了!

动态显示标签.zip

15.99 KB, 下载次数: 3

状态栏显示

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-23 22:34 | 显示全部楼层
最好是在追加数据的时候,添加上边框线及位置居中更好!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-26 18:44 | 显示全部楼层
今天我有试了一下,三位老师的代码,发现duquancai老师的代码在删除清空工作表区域的代码后,可以满足我的要求!所以我的分给他,也非常感谢其他两位老师的帮助!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 20:29 , Processed in 0.044604 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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