今日代码

vba
Sub 成绩统计器() ' 使用变量、数组、条件语句、循环 End Sub Sub 数据填充器() ' 使用Range、循环 End Sub

今日任务

综合运用前8天所学知识完成以下练习。这类 VBA 练习项目的意义在于把变量、循环、对象、错误处理串成完整程序。

练习题目

练习1:成绩统计器

创建一个程序,统计学生成绩并评级。提示:数组存分数,循环累加,Select Case 评级。

练习2:数据填充器

自动填充指定范围的单元格数据。提示:Cells(行, 列) 配合循环,表头用 With 批量设置格式。

练习3:工作表处理器

遍历所有工作表并进行批量操作。提示:For Each ws In Worksheets。

参考代码结构

vba
Sub 成绩统计器() ' 使用变量、数组、条件语句、循环 End Sub Sub 数据填充器() ' 使用Range、循环 End Sub

成绩统计器的一种完整实现(与 bas 文件一致):

vba
Sub 成绩统计器() Dim scores(1 To 10) As Integer Dim i As Integer, total As Integer Dim avg As Double, grade As String Randomize For i = 1 To 10 scores(i) = Int(Rnd * 41) + 60 ' 60-100之间 Next i For i = 1 To 10 total = total + scores(i) Next i avg = total / 10 Select Case avg Case Is >= 90: grade = "优秀" Case Is >= 70: grade = "中等" Case Else: grade = "不及格" End Select MsgBox "总分: " & total & " 平均分: " & avg & " 评级: " & grade End Sub

练习要求

  1. 编写完整的代码
  2. 添加必要的注释
  3. 添加错误处理
  4. 测试运行结果

参考解答

1. 成绩统计器:使用数组存储分数,循环计算总分和平均分,用If判断评级。 2. 数据填充器:使用双层循环遍历行列,Cells(row, col).Value赋值。 3. 工作表处理器:For Each ws In Worksheets遍历,对每个工作表执行操作。

实战场景

采购部每月要生成 20 个产品的价格清单,价格随机模拟、表头加粗,写一个小程序一次完成:

vba
Sub 生成价格清单() Dim i As Integer On Error GoTo ErrorHandler For i = 1 To 20 Cells(i + 1, 1).Value = i Cells(i + 1, 2).Value = "产品" & i Cells(i + 1, 3).Value = Int(Rnd * 1000) + 100 Next i With Range("A1:C1") .Value = Array("序号", "产品名称", "价格") .Font.Bold = True End With MsgBox "清单生成完成", vbInformation Exit Sub ErrorHandler: MsgBox "生成失败:" & Err.Description, vbCritical End Sub

这个场景把前 8 天的知识串了起来:循环 + Cells 用变量定位行号(Day04、Day06),With 批量设置表头格式(Day06),On Error GoTo 兜底(Day07)。运行后生成一张带表头的清单,出错时给出明确提示。

常见错误与排查

  1. Compile error: Variable not defined——模块顶部有 Option Explicit,新变量没写 Dim,补声明即可。
  2. Run-time error '6': Overflow——Integer 装不下累加结果(上限 32767),求和变量改用 Long。
  3. Run-time error '11': Division by zero——求平均分时人数变量没赋值还是 0,先检查分母。
  4. Array(...) 给区域赋值报 Run-time error '1004'——数组元素个数与区域大小不一致。
  5. Rnd 每次运行出同一组数——开头忘写 Randomize,随机序列被固定了。

延伸练习

  1. 给成绩统计器增加最高分、最低分、不及格人数三个指标。
  2. 把数据填充器改为按 InputBox 输入的行数填充,并校验非数字输入。
  3. 工作表处理器改为:在每张表 A2 写入该表已用区域的行数(UsedRange.Rows.Count)。

由在线工具箱(www.vba.net)整理制作