楼主 罗刚君 |
提示:此题目是“VBA入门免费教学群”(群号:30729794)的课后作业 请未参与听课者绕道,谢谢配合。 _____________________________________________________ 第23课作业题三.rar 说明: 请用附件中的数据,通过VBA代码得到上图中的结果-----提取至少三科不及格者的信息。 _____________________________________________________ 请提交作业时 直接贴代码就行了 不要上附件,操作起来方便一些 比较忙 多谢配合 _____________________________________________________ 答案 第23课作业题三.rar |
2楼 静思雨 |
|
3楼 NULL |
Option Explicit Sub 查询至少三科不及格() Dim Arr, Temp As String, Str As String, i As Long, j As Long, Cnt As Byte Arr = Range("a1").CurrentRegion '获取源数据 For i = 2 To UBound(Arr, 1) '遍历每个学生 Temp = Arr(i, 1) & ":" '姓名 Cnt = 0 '记录不及格的科目数 For j = 2 To UBound(Arr, 2) '成绩中遍历 If Arr(i, j) < 60 Then Temp = Temp & Arr(1, j) & Arr(i, j) & vbTab '成绩分数 Cnt = Cnt + 1 End If Next If Cnt >= 3 Then Str = Str & Temp & Chr(10) '符合条件的写入Str End If Next If Str = "" Then Str = "无" 'str为空,查询结果不存在,显示无 MsgBox "至少三科不及格者" & Chr(10) & Str, vbInformation, "查询结果" End Sub |
4楼 NULL |
Option Explicit Sub 查询至少三科不及格() Dim Arr, Temp As String, Str As String, i As Long, j As Long, Cnt As Byte Arr = Range("a1").CurrentRegion '获取源数据 For i = 2 To UBound(Arr, 1) '遍历每个学生 Temp = Arr(i, 1) & ":" '姓名 Cnt = 0 '记录不及格的科目数 For j = 2 To UBound(Arr, 2) '成绩中遍历 If Arr(i, j) < 60 Then Temp = Temp & Arr(1, j) & Arr(i, j) & vbTab '成绩分数 Cnt = Cnt + 1 End If Next If Cnt >= 3 Then Str = Str & Temp & Chr(10) '符合条件的写入Str End If Next If Str = "" Then Str = "无" 'str为空,查询结果不存在,显示无 MsgBox "至少三科不及格者" & Chr(10) & Str, vbInformation, "查询结果" End Sub |
5楼 浮华缠绕指尖 |
super
|
6楼 ynzsvt |
Sub 找当前工作表不及格超过三次的人() Dim r%, c%, Re%, Ce%, Str$, FindCount%, Rng As Range '定义变量 Set Rng = ActiveSheet.UsedRange '表区域 Re = Rng.Rows.Count '总行数 Ce = Rng.Columns.Count '总列数 Str = "至少三科不及格者:" & vbCrLf & vbCrLf '输出信息的头部 With Rng '表区域进行统计 For r = 2 To Re '逐个人进行统计 If Application.WorksheetFunction.CountIf(.Rows(r), "<60") >= 3 Then '对不及格科目数量符合的进行处理 FindCount = FindCount + 1 '统计人数 Str = Str & .Cells(r, 1) & ":" & vbTab '人名 For c = 2 To Ce '逐个科目查看成绩 If .Cells(r, c) < 60 Then Str = Str & .Cells(1, c) & .Cells(r, c) & vbTab '科目和成绩 Next c Str = Str & vbCrLf '人与人之间换行 End If Next r End With Set Rng = Nothing Str = Str & vbCrLf & "共找到" & FindCount & "位符合条件的人" '计数输出 If FindCount > 1 Then MsgBox Str, vbInformation, "查找结果" Else MsgBox "未找到符合条件的", vbCritical, "查找结果" '条件输出 End Sub |
7楼 无言的人 |
无言的人 增加一个人数提示
|
8楼 liaozhifa33 |
占楼。。 |
9楼 wangxf9209 |
江苏-雪峰
|
10楼 wendel |
无心手语
|
11楼 本人号被盗, |
期盼看到罗总的10行完成,比面包同学还多5行呢。呵呵,辛苦了一天,终于出来个结果。别人看不满意,自己看已经很美了。
|
12楼 大猫 |
|
13楼 胖头鱼tx |
作业之三 第23课作业题三.zip |
14楼 dofun |
Sub tt() Dim msg As String Dim i, K As Integer For i = 2 To ActiveSheet.UsedRange.Rows.Count If Application.WorksheetFunction.CountIf(ActiveSheet.Range("b" & i & ":h" & i), "<60") >= 3 Then msg = msg & Cells(i, 1) & ":" For K = 2 To ActiveSheet.UsedRange.Columns.Count If ActiveSheet.Cells(i, K) < 60 Then msg = msg & Cells(1, K) & Cells(i, K) & vbTab End If Next K msg = msg & vbCrLf End If Next i MsgBox "至少三科不合格者:" & vbCrLf & msg, vbDefaultButton3, "查找结果" End Sub |
15楼 天空的雨 |
Sub 查找() Dim M As Integer '用于存放小于60分科目数 Dim N As Integer '用于数据区域的行数循环 Dim N1 As Integer '用于选取数据区域的行循环 Dim N2 As Integer '用于列号循环 Dim ST As String ST = "至少三科不及格:" & Chr(10) With ThisWorkbook.Sheets(1).UsedRange N = .Rows.Count - 1 For N1 = 1 To N M = Application.WorksheetFunction.CountIf(.Offset(N1, 1).Resize(1), "<60") If M > 2 Then ST = ST & Chr(10) & Cells(N1 + 1, 1) & ": " For N2 = 2 To .Columns.Count If .Cells(N1 + 1, N2) < 60 Then ST = ST & .Cells(1, N2) & .Cells(N1 + 1, N2) & Space(8 - Len(Cells(1, N2) & .Cells(N1 + 1, N2))) End If Next N2 ST = ST & Chr(10) End If Next N1 End With MsgBox ST, vbOKOnly + vbInformation, "查找结果" End Sub 免费听课群-天空答:第23课作业题三.rar |
16楼 kcxs |
客城小生通过借鉴ynzsvt的代码终于完成了作业,在此感谢ynzsvt
|
17楼 ′鈊、 |
Sub 至少三科不合格者() '无论当前已用区域偏移多少也能实现查找 If IsEmpty(ActiveSheet.UsedRange) Then MsgBox "工作表不能为空", 16, "温馨提示": Exit Sub '如果当前工作为空则提示用户然后退出程序 Dim 行数 As Long, 成绩 As Byte, 科目 As String, 合并 As String, 部分合并 As String, 最终合并 As String Dim rng As Range, rg As Range '声明变量 For 行数 = 1 To ActiveSheet.UsedRange.Rows.Count '从已用区域的第一行到最后一行开始循环 Set rg = ActiveSheet.UsedRange.Rows(行数) '将已用区域的第几行赋值给变量rg '判断已用区域的第几行是否有3科以上不及格科目,如果满足条件,就执后面代码,否则继续就下一行 If Application.WorksheetFunction.CountIf(rg, "< 60") >= 3 Then 姓名 = rg.Cells(1) '记录名字 For Each rng In rg.Cells '遍历已用区域的第几行里的单元格 If IsNumeric(rng) And rng < 60 Then '如果单元格的值是数值并且小于60,执行下面代码 成绩 = rng '记录成绩 科目 = rng.Offset(-(行数 - 1), 0) '记录科目 合并 = 合并 & vbTab & 科目 & 成绩 '把科目和成绩合并 End If Next rng 部分合并 = 姓名 & ":" & 合并 '把姓名、科目和成绩合并 Else: GoTo 下 '不符合条件就跳到标签处继续执行代码 End If 最终合并 = 最终合并 & Chr(10) & 部分合并 '把所有三科以上不及格的人员的姓名、科目和成绩合并起来 合并 = "" '将变量清空,避免下次使用时产生多余字符 部分合并 = "" '将变量清空,避免下次使用时产生多余字符 下: Next 行数 '设置了一个标签 If Len(最终合并) = 0 Then '变量为0,则代表没找到条件所需的结果 MsgBox "没找到结果", 0, "温馨提示" '提示用户没找到结果 Else MsgBox "至少三科不及格者:" & Chr(13) & 最终合并, 64, "查找结果" '弹出提示框,显示查找结果 End If End Sub |
18楼 lxmgdsdxt |
Sub 找出至少三科不合格者() If IsEmpty(ActiveSheet.UsedRange) Then Exit Sub '如果当前工作为空就退出程序 Dim xm As String, km As String, hs As Long, ls As Integer, cj As Byte, js As Byte '声明变量 Dim hb As String, bfhb As String, zzhb As String, zdh As Long, zdl As Integer '声明变量 zdh = ActiveSheet.Cells(ActiveSheet.Rows.Count, ActiveSheet.UsedRange.Cells(1).Column).End(xlUp).Row '当前活动工作表已用区域的最后的一个非空行位置赋值给变量 zdl = ActiveSheet.Cells(ActiveSheet.UsedRange.Cells(1).Row, ActiveSheet.Columns.Count).End(xlToLeft).Column '当前活动工作表已用区域的最右的一个非空列位置赋值给变量 With ActiveSheet.UsedRange '活动工作表已用区域 For hs = .Cells(1).Row To zdh '按行数开始循环 For ls = .Cells(1).Column To zdl '按列数开始循环 If Cells(hs, ls) < 60 And IsNumeric(Cells(hs, ls)) Then '如果单元格的内容是数值并且小于60 cj = Cells(hs, ls) '记录符合条件的单元格的值 km = Cells(.Cells(1).Row, ls) '记录对应的科目 hb = hb & vbTab & km & cj '把科目和成绩合并 js = js + 1 '用于计算不及格的科目数 End If Next ls If js >= 3 Then '如果不及格的科目超过三科以上 xm = Cells(hs, .Cells(1).Column) '记录不及格者的姓名 bfhb = km & ":" & hb '姓名、科目和成绩合并 js = 0 '将变量清空,用于计数下一行的不及格科目数 Else '如果不及格科目不超过三以上,跳到下一行继续查找 js = 0 '将变量清空,用于计数下一行的不及格科目数 hb = "" '将变量清空,避免下次使用时产生多余字符 GoTo 下一行 End If zzhb = zzhb & Chr(13) & bfhb '把所有三科以上不及格的人员的姓名、科目和成绩合并起来 hb = "" '将变量清空,避免下次使用时产生多余字符 下一行: Next hs End With If Len(最终合并) = 0 Then MsgBox "没找到结果", 0, "温馨提示" '提示用户没找到结果 Else MsgBox "至少三科不及格者:" & Chr(13) & zzhb, 64, "查找结果" '显示查找结果 end if End Sub |
19楼 冰淇林的冬天 |
Sub TT() Dim Hz As String '变量查询信息汇总 Dim Shuchu As String '输出内容 Dim Crng As Range '变量当前使用的区域 Dim Rng1 As Range '变量1用于判断数据是否有问题 Dim Rng2 As Range '变量2用于姓名循环 Dim Rng3 As Range '变量3用于判断分 Dim i As Byte '变量I记录不及格成绩数目 Set Crng = ActiveSheet.Range("A1").CurrentRegion '定义变量,节省输入 For Each Rng1 In Crng If IsNumeric(Rng1.Value) = True Then '判断数据区域是否有异常数据 If Rng1.Value < 0 Then MsgBox "成绩出现负数,请更正", vbOKOnly, "错误" Exit Sub ElseIf Rng1.Value > 100 Then MsgBox "成绩大于100,请更正", vbOKOnly, "错误" Exit Sub ElseIf Rng1.Value = "" Then MsgBox "发现有学生成绩为空,若是缺考,请输入零", vbOKOnly, "提示" Exit Sub End If ElseIf Rng1.Value = "" Then MsgBox "请将数据补充完毕", vbOKOnly, "错误" Exit Sub End If Next For Each Rng2 In Intersect(Crng.Columns(1).Offset(1, 0), Crng) '循环1,在当前使用区域的学生中循环 i = 0 '重置不及格科目数 Hz = Rng2.Value & ":" '重置当前学生成绩汇总 For Each Rng3 In Intersect(Crng, Crng.Rows(Rng2.Row).Offset(0, 1)) '在rng2的学生成绩中循环 If Rng3.Value < 60 Then i = i + 1 '若不及格,i+1 Hz = Hz & Rng3.Offset(-Rng3.Row + 1, 0).Value & Rng3 & " " '汇总不及的的科目及成绩信息 End If Next If i >= 3 Then '若及格科目大于三科,则记到到变量输出中 Shuchu = Shuchu & Hz & Chr(10) End If Next If Len(Shuchu) = 0 Then MsgBox "没有超过3课不及格的学生", vbOKOnly, "查找结果" Else Shuchu = "至少三科不及格者:" & Chr(10) & Shuchu MsgBox Shuchu, vbOKOnly + vbInformation, "差找结果" End If End Sub 冰激凌的冬天 这周太忙,导致作业交晚了,抱歉` |
20楼 mmice |
Sub 提取三科成绩不合格名单1() Dim 姓名 As Byte, 科目 As Byte, msg As String, 计数 As Byte, str As String, Result As String For 姓名 = 2 To Cells(Rows.Count, 1).End(xlUp).Row '按姓名逐行查找 For 科目 = 2 To Cells(1, Columns.Count).End(xlToLeft).Column '按科目逐列查找 If Cells(姓名, 科目) < 60 Then str = str & Cells(1, 科目) & Cells(姓名, 科目) & String(6 - Len(Cells(1, 科目) & Cells(姓名, 科目)), " ") '科目和成绩,外加空格对齐 计数 = 计数 + 1 End If Next If 计数 > 2 Then If 计数 > 2 Then Result = Result & Cells(姓名, 1) & String(3 - Len(Cells(姓名, 1)), " ") & ":" & str & Chr(10)'当列个数大于2,符合至少三科不合格 str = "" '要清空,不然不对 计数 = 0 '要清空,继续下行计数 Next MsgBox Result, 64, "查找结果" End Sub 群名片:鼠小白 |
21楼 manuel442 |
Sub 至少三科不及格() Dim rng As Range Dim erng As Range Dim ecell As Range Dim msg As String Set rng = Sheets(1).UsedRange '获取处理区域 For Each erng In rng.Rows '先对区域按行遍历 If Application.WorksheetFunction.CountIf(erng, "<60") >= 3 Then '按行判断是否符合条件 msg = msg & erng.Cells(1).Value & ":" '对符合条件的先添加姓名 For Each ecell In erng.Cells '对符合条件的行遍历,取出科目分数小于60的科目 If ecell.Value < 60 Then msg = msg & ecell.End(xlUp).Value & ecell & vbTab '将科目分数小于60的依次合并 End If Next msg = msg & Chr(10) '结果换行 End If Next MsgBox "至少三科不及格者:" & Chr(10) & msg, vbInformation, "查找结果" '输出结果 End Sub |