ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: ckh2004

[求助] 一项比较具有挑战性的工作,估计学校上线人数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-3-7 00:05 | 显示全部楼层
ckh2004 发表于 2018-3-6 11:05
老师:我改动了下数据,还有些问题,请再帮我修改下,谢谢!
  1. Public arr As Variant, lr As Integer, 学校数 As Integer
  2. Public Sub 一键生成()
  3. Application.ScreenUpdating = False
  4. Sheet3.Cells.ClearContents
  5. lr = Sheet1.Range("a65536").End(xlUp).Row
  6. Call 排序处理
  7. Call 学校名称处理
  8. Sheet3.[a1:f1] = Array("学校", "定向分配人数", "一线", "定向", "定向外", "合计上线")
  9. For i = 1 To Sheet2.[f2].Value
  10. Set Rng = Sheet3.Range("a2:a" & 学校数).Find(arr(i, 2)).Offset(0, 2)
  11. If Not Rng Is Nothing Then Rng.Value = Rng.Value + 1
  12. Next
  13. Call 定向统计
  14. Application.ScreenUpdating = True
  15. End Sub
  16. Public Sub 排序处理()
  17. Application.ScreenUpdating = False
  18. Sheet1.Select
  19. yrr = Sheet1.Range("a1:c" & lr)
  20. Sheet1.Range("a2:c" & lr).Sort Key1:=Cells(2, 3).Resize(lr - 1), Order1:=xlDescending
  21. arr = Sheet1.Range("a2:c" & lr)
  22. Sheet1.[a1].Resize(lr, 3) = yrr
  23. Sheet3.Select
  24. Application.ScreenUpdating = True
  25. End Sub

  26. Public Sub 学校名称处理()
  27. Application.ScreenUpdating = False
  28. Dim d As Object
  29.   Set d = CreateObject("scripting.dictionary")
  30.   For i = 1 To lr - 1
  31.   d(arr(i, 2)) = ""
  32.   Next
  33.   Sheet3.[a2].Resize(d.Count, 1) = Application.Transpose(d.Keys)
  34.   For i = 2 To Sheet2.[a1000].End(xlUp).Row
  35.    For j = 2 To d.Count + 1
  36.    If Sheet2.Cells(i, 1).Value = Sheet3.Cells(j, 1).Value Then Sheet3.Cells(j, 1).Offset(0, 1) = Sheet2.Cells(i, 1).Offset(0, 1)
  37.    Next
  38.   Next
  39.   学校数 = d.Count
  40. Application.ScreenUpdating = True
  41. End Sub

  42. Public Sub 定向统计()
  43. lw = arr(Sheet2.[f2].Value, 3)
  44. For i = Sheet2.[f2].Value + 1 To Sheet2.[f1].Value
  45. Set Rng = Sheet3.Range("a2:a" & 学校数).Find(arr(i, 2)).Offset(0, 3)
  46. If Not Rng Is Nothing Then
  47. If arr(i, 3) + 40 >= lw And Rng.Value < Rng.Offset(0, -2) Then
  48. Rng.Value = Rng.Value + 1
  49. Else
  50. Rng.Offset(0, 1) = Rng.Offset(0, 1) + 1
  51. End If
  52. End If
  53. Next
  54. Range("F2:F" & 学校数 + 1).FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"
  55. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-3-7 09:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学生上线人数统计.rar (69.15 KB, 下载次数: 8)

TA的精华主题

TA的得分主题

发表于 2018-3-7 10:24 | 显示全部楼层

直接操作单元格,因为没用数组,运行速度可能较慢

上线统计.zip (87.56 KB, 下载次数: 12)

Private Sub CommandButton1_Click()
Range("g3").ClearContents
Range("e2:e65535").ClearContents

Set cnn = CreateObject("adodb.connection")
cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
'一线
Sql2 = "select top " & [g2].Value & " * from [sheet1$a:e] order by 总分 desc"
    Set rst2 = CreateObject("adodb.Recordset")
    rst2.Open Sql2, cnn, 1, 1
    Do While Not rst2.EOF
       Cells(rst2("序号") + 1, 5).Value = "一线"
       k = k + 1
    rst2.movenext
    Loop
    rst2.movelast: [g3].Value = rst2("总分")

Application.ScreenUpdating = False
'定向
For i = 2 To [i2].End(xlDown).Row
Sql2 = "select top " & Cells(i, 9).Value & " * from [sheet1$a:e] where 学校='" & Cells(i, 8).Value & "' and 上线否 is null order by 总分 desc"
    Set rst2 = CreateObject("adodb.Recordset")
    rst2.Open Sql2, cnn, 1, 1
    Do While Not rst2.EOF
       If rst2("总分") + 40 >= [g3].Value Then Cells(rst2("序号") + 1, 5).Value = "定向": k = k + 1
    rst2.movenext
    Loop
Next

'定向外
Sql2 = "select top " & [g1].Value - k & " * from [sheet1$a:e] where 上线否 is null order by 总分 desc"
    Set rst2 = CreateObject("adodb.Recordset")
    rst2.Open Sql2, cnn, 1, 1
    Do While Not rst2.EOF
       Cells(rst2("序号") + 1, 5).Value = "定向外"
    rst2.movenext
    Loop

cnn.Close
Set cnn = Nothing

Application.ScreenUpdating = True
End Sub

Private Sub CommandButton2_Click()
Range("j2:m65535").ClearContents

Set cnn = CreateObject("adodb.connection")
cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
For i = 2 To [i2].End(xlDown).Row
Sql2 = "select 上线否,count(*) as 上线人数 from [sheet1$a:e] where 学校='" & Cells(i, 8).Value & "' and 上线否 is not null group by 上线否"
    Set rst2 = CreateObject("adodb.Recordset")
    rst2.Open Sql2, cnn, 1, 1
    Do While Not rst2.EOF
       If rst2("上线否") = "一线" Then
          Cells(i, 10).Value = rst2("上线人数")
       ElseIf rst2("上线否") = "定向" Then
          Cells(i, 11).Value = rst2("上线人数")
       ElseIf rst2("上线否") = "定向外" Then
          Cells(i, 12).Value = rst2("上线人数")
       End If
       Cells(i, 13).Value = Cells(i, 13).Value + rst2("上线人数")
    rst2.movenext
    Loop
Next
cnn.Close
Set cnn = Nothing
End Sub


TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-7 12:39 | 显示全部楼层
非常感谢几位教师的无私奉献,zopey老师和wmqz.130老师的文件测试都完全成功,再次感谢各位老师的辛勤劳动!!!!!!

TA的精华主题

TA的得分主题

发表于 2018-3-7 14:19 | 显示全部楼层
有没有这种可能,某学生的总分 还可以,因为所报学校名额已满的原因,不能上线。
换个说法就是,
如果总共招生 700人,最后上线的一定是总分排前700的那些人吗?

TA的精华主题

TA的得分主题

发表于 2018-3-7 15:06 | 显示全部楼层
zopey 发表于 2018-3-7 14:19
有没有这种可能,某学生的总分 还可以,因为所报学校名额已满的原因,不能上线。
换个说法就是,
如果总 ...

你换了个说法的说法是正确的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-7 17:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zopey 发表于 2018-3-7 14:19
有没有这种可能,某学生的总分 还可以,因为所报学校名额已满的原因,不能上线。
换个说法就是,
如果总 ...

分数完全相同的话是可以被录取的,在这种情况下实际招生人数可以多出一两个人。

TA的精华主题

TA的得分主题

发表于 2018-3-8 08:29 | 显示全部楼层
ckh2004 发表于 2018-3-7 17:46
分数完全相同的话是可以被录取的,在这种情况下实际招生人数可以多出一两个人。

假设一种极端情况,当 “一线”+“定向” 人数超过招生总数,这时“定向外“人数 为0或负值,
就会出现因为学校别的原因,分数高的 不能上线,分数低的反而上线。

TA的精华主题

TA的得分主题

发表于 2018-6-26 11:11 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 05:43 , Processed in 0.044767 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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