Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1459|回复: 9

求救,急!

[复制链接]
发表于 2012-5-21 22:54 | 显示全部楼层 |阅读模式
主要功能:
某学校计算机系要对学生进行软件开发能力考核。规定:如果“计算机导论”、“数据库应用”、“C语言”、“数据结构”、“VB程序设计”、“多媒体技术”、“汇编语言”和“计算机网络”这8门课程的考试成绩中,有2门以上(含2门)排在全年级前10%以内,则“软件开发能力”成绩记为A等,不必另行参加考核。
现在要求通过VBA编程列出符合免试条件的学生名单放到结果表中。

免试生筛选.rar

10.51 KB, 下载次数: 5

发表于 2012-5-22 20:45 | 显示全部楼层
本帖最后由 zhubajie 于 2012-5-22 20:48 编辑

这是一个比较典型的数据筛选操作,用VBA编程当然可以解决,不过我给出的解决方案是使用select查询
示例代码如下:
免试生筛选.rar (26.29 KB, 下载次数: 3)
回复

使用道具 举报

发表于 2012-5-22 22:18 | 显示全部楼层
再发一个按成绩数前10%筛选的参考语句,看来感兴趣的人不多呀

  1. select 学号, 姓名 from
  2. (
  3. select 学号,姓名 from [课程1$] where 科学导论 in (select 成绩 from (select a.成绩,count(*) as idx from (select 科学导论 as 成绩 from [课程1$] group by 科学导论) a inner join (select 科学导论 as 成绩 from [课程1$] group by 科学导论) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select 科学导论 from [课程1$] group by 科学导论))<= 0.1 or idx =1 )
  4. union all
  5. select 学号,姓名 from [课程2$] where 数据库 in (select 成绩 from (select a.成绩,count(*) as idx from (select 数据库 as 成绩 from [课程2$] group by 数据库) a inner join (select 数据库 as 成绩 from [课程2$] group by 数据库) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select 数据库 from [课程2$] group by 数据库))<= 0.1 or idx =1 )
  6. union all
  7. select 学号,姓名 from [课程3$] where C语言 in (select 成绩 from (select a.成绩,count(*) as idx from (select C语言 as 成绩 from [课程3$] group by C语言) a inner join (select C语言 as 成绩 from [课程3$] group by C语言) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select C语言 from [课程3$] group by C语言))<= 0.1 or idx =1 )
  8. union all
  9. select 学号,姓名 from [课程4$] where 数据结构 in (select 成绩 from (select a.成绩,count(*) as idx from (select 数据结构 as 成绩 from [课程4$] group by 数据结构) a inner join (select 数据结构 as 成绩 from [课程4$] group by 数据结构) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select 数据结构 from [课程4$] group by 数据结构))<= 0.1 or idx =1 )
  10. union all
  11. select 学号,姓名 from [课程5$] where VB程序设计 in (select 成绩 from (select a.成绩,count(*) as idx from (select VB程序设计 as 成绩 from [课程5$] group by VB程序设计) a inner join (select VB程序设计 as 成绩 from [课程5$] group by VB程序设计) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select VB程序设计 from [课程5$] group by VB程序设计))<= 0.1 or idx =1 )
  12. union all
  13. select 学号,姓名 from [课程6$] where 多媒体技术 in (select 成绩 from (select a.成绩,count(*) as idx from (select 多媒体技术 as 成绩 from [课程6$] group by 多媒体技术) a inner join (select 多媒体技术 as 成绩 from [课程6$] group by 多媒体技术) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select 多媒体技术 from [课程6$] group by 多媒体技术))<= 0.1 or idx =1 )
  14. union all
  15. select 学号,姓名 from [课程7$] where 汇编语言 in (select 成绩 from (select a.成绩,count(*) as idx from (select 汇编语言 as 成绩 from [课程7$] group by 汇编语言) a inner join (select 汇编语言 as 成绩 from [课程7$] group by 汇编语言) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select 汇编语言 from [课程7$] group by 汇编语言))<= 0.1 or idx =1 )
  16. union all
  17. select 学号,姓名 from [课程8$] where 计算机网络 in (select 成绩 from (select a.成绩,count(*) as idx from (select 计算机网络 as 成绩 from [课程8$] group by 计算机网络) a inner join (select 计算机网络 as 成绩 from [课程8$] group by 计算机网络) b on a.成绩 <= b.成绩 group by a.成绩 order by a.成绩 desc ) where idx /(select count(*) from (select 计算机网络 from [课程8$] group by 计算机网络))<= 0.1 or idx =1 )
  18. ) group by 学号, 姓名 having count(*) >= 2
  19. order by 学号, 姓名


复制代码

回复

使用道具 举报

发表于 2012-5-22 22:23 | 显示全部楼层
  1. Set d = CreateObject("Scripting.Dictionary")
  2. For Each st In Sheets
  3.     If st.Name Like "课程*" Then
  4.         i = Round((st.Range("a1").CurrentRegion.Rows.Count - 1) / 10)
  5.         st.Range("a2").Resize(i, 3).Copy Sheets("结果").Cells(fr + 2, 6)
  6.         fr = i + fr
  7.     End If
  8. Next
  9. Set rng = Sheets("结果").Range("f2").Resize(fr, 3)
  10. arr = rng
  11. For i = 1 To UBound(arr)
  12.     If d.exists(arr(i, 3)) Then
  13.         rng(i, 1).Resize(1, 3).Copy Sheets("结果").Cells(fr + 2, 6)
  14.         fr = fr + 1
  15.     Else
  16.         d(arr(i, 3)) = ""
  17.     End If
  18. Next i
  19. rng.Delete xlShiftUp
  20. End Sub
复制代码

回复

使用道具 举报

发表于 2012-5-22 22:24 | 显示全部楼层
上面的代码放到结果表的代码中

免试生筛选-VBA解答.xls

72 KB, 下载次数: 3

回复

使用道具 举报

发表于 2012-5-22 22:33 | 显示全部楼层
上面有个重复的,重新发个

免试生筛选-VBA解答.xls

72 KB, 下载次数: 11

回复

使用道具 举报

发表于 2012-5-23 09:04 | 显示全部楼层
zhubajie 发表于 2012-5-22 22:18
再发一个按成绩数前10%筛选的参考语句,看来感兴趣的人不多呀

茅台确实好喝,只是太复杂了,楼主的意图很明显,每门课程在表中体现的估计是已经经过处理的了,这些数据都是10%的了,不然的话不会就这么点数据,并且分数都高 你再加个10%那是优中选优了,只能说茅台味太浓了
回复

使用道具 举报

发表于 2012-5-23 09:40 | 显示全部楼层
xpw6061 发表于 2012-5-23 09:04
茅台确实好喝,只是太复杂了,楼主的意图很明显,每门课程在表中体现的估计是已经经过处理的了,这些数据 ...

在下愚钝,受教了。
        我没有去猜测楼主的意图如何,也没有按楼主的要求将最终的结果放在楼主要求的表中,我只想说明用SQL来筛选数据也是一种解决方案。
       至于楼上所说“复杂”二字,人各有志,不敢勉强,也不敢苟同。在下只是觉得有些东西看起来复杂,用起来简单,有些东西看起来简单,用起来复杂。如果楼主的数据表内容有所变化,恐怕有人就会知道哪种更简单,哪种更复杂了。
回复

使用道具 举报

发表于 2012-5-23 10:53 | 显示全部楼层
zhubajie 发表于 2012-5-23 09:40
在下愚钝,受教了。
        我没有去猜测楼主的意图如何,也没有按楼主的要求将最终的结果放在楼主要求 ...

select 学号,班级,姓名,count(姓名) as 出现次数 from (select 学号,班级,姓名 from [课程1$] union all select 学号,班级,姓名 from [课程2$] union all select 学号,班级,姓名 from [课程3$] union all select 学号,班级,姓名 from [课程4$] union all select 学号,班级,姓名 from [课程5$] union all select 学号,班级,姓名 from [课程6$] union all select 学号,班级,姓名 from [课程7$] union all select 学号,班级,姓名 from [课程8$]) group by 学号,班级,姓名"
回复

使用道具 举报

发表于 2012-5-23 11:19 | 显示全部楼层
xpw6061 发表于 2012-5-23 10:53
select 学号,班级,姓名,count(姓名) as 出现次数 from (select 学号,班级,姓名 from [课程1$] union all  ...

楼上是要把出现的次数找出来吧。OK!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-16 05:56 , Processed in 0.984495 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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