3.5.5-代码解析:S03_计算¶
该Sub过程的作用是计算出每一个员工的符合率。基本逻辑过程如下:
1)获取小蛋糕重量的标准信息,即公差上下限,超出则该小蛋糕不合格
2)两层循环,分别计算出每个员工生产的小蛋糕的重量的符合率:
2.1)外层循环,对数据缓存工作表的列进行循环,即对每名员工进行循环
2.2)内层循环,一个员工有多个数据,对每一行进行循环,计算该名员工生产小蛋糕的符合率
3)将符合率信息写入操作界面
代码如下
1 Sub S03_计算()
2 Set shtFirst = ThisWorkbook.Worksheets("操作界面")
3 up_tol = shtFirst.Range("K8")
4 down_tol = shtFirst.Range("K9")
5
6 Set shtData = ThisWorkbook.Worksheets("数据缓存")
7
8 maxCol = shtData.Cells(1, Columns.Count).End(xlToLeft).Column
9
10 inputRow = 2
11
12 ' 对数据缓存工作表数据按列遍历,每列按照行遍历
13 For j = 1 To maxCol Step 1
14 maxRow = shtData.Cells(Rows.Count, j).End(xlUp).Row
15 qualifiedCount = 0
16 totalCount = 0
17 employeeName = shtData.Cells(1, j)
18
19 For i = 2 To maxRow Step 1
20 weightValue = shtData.Cells(i, j)
21 If weightValue <= up_tol And weightValue >= down_tol Then
22 qualifiedCount = qualifiedCount + 1
23 End If
24
25 totalCount = totalCount + 1
26 Next i
27
28 qualifiedRate = Round(qualifiedCount / totalCount, 3)
29
30 ' 写入数据
31 shtFirst.Cells(inputRow, "A") = inputRow - 1
32 shtFirst.Cells(inputRow, "B") = employeeName
33 shtFirst.Cells(inputRow, "C") = qualifiedRate
34
35 inputRow = inputRow + 1
36
37 Next j
38
39 shtFirst.Range("K4") = "已点击"
40 End Sub
代码中文解析
1 Sub S03_计算()
2 定义工作表shtFirst,表示操作界面工作表
3 获取公差上限
4 获取公差下限
5
6 定义工作表shtData,表示数据缓存工作表
7
8 获取数据缓存工作表第1行最大非空列maxCol
9
10 初始化inputRow=2,用于向操作界面工作表写入符合率信息,确定行信息
11
12 ' 对数据缓存工作表数据按列遍历,每列按照行遍历
13 循环开始:j从1开始到maxCol,步长为1
14 获取数据缓存表第j列最大行maxRow
15 计数:设置合格蛋糕数为qualifiedCount = 0
16 计数:设置蛋糕总数totalCount = 0
17 获取员工姓名employeeName
18
19 循环开始:i从2开始到maxRow,步长为1
20 获取第j列第i行蛋糕重量weightValue
21 判断开始:如果蛋糕重量小于等于公差上限,且大于等于公差下限,表示重量达标
22 合格蛋糕数+1
23 判断结束
24
25 蛋糕总数+1
26 循环结束
27
28 符合率=合格蛋糕数/蛋糕总数,保留3位小数
29
30 ' 写入数据
31 在操作界面工作表的inputRow行A列写入序号 = inputRow - 1
32 在操作界面工作表的inputRow行B列写入该原工姓名
33 在操作界面工作表的inputRow行C列写入符合率
34
35 inputRow+1
36
37 循环结束
38
39 操作界面的K4单元格赋值已点击
40 End Sub
在本段代码中,有多处寻找位置的代码
例如计算完某员工生产的小蛋糕重量符合率后,如何写入到正确的位置。设置一个变量存储将要写入的行号,从第2行开始写,每写一次,该变量+1,这样就保证了一行一行向下写,不会出现空行或者覆盖上一次写入的情况
其余就是通过最大行最大列来确定位置,进而确认循环范围
关键代码解读
1)第21行:If weightValue <= up_tol And weightValue >= down_tol Then。这里使用了大于等于和小于等于,它们都属于比较运算符。比较运算符返回的结果是布尔数,即False或者True,可以直接用于判断语句,不同的编程语言可能会使用不同的符号表示同一个比较运算符,VBA中使用的比较运算符如下:
1.1)大于:>
1.2)小于:<
1.3)等于:=
1.4)大于等于:>=
1.5)小于等于:<=
1.6)不等于:<>
当有两个条件都必须满足时,可以通过And连接两个条件,同理如果不只2个条件,只需在不同条件间用And连接即可。那么大家自然会问,如果两个条件满足其中任意一个时,怎么写?请看以下示例,输出结果为3
Sub test3()
a = 3
If a > 5 Or a <= 5 Then
Debug.Print (a)
Else
Debug.Print ("不满足条件")
End If
End Sub
2)第28行:qualifiedRate = Round(qualifiedCount / totalCount, 3),该代码的效果是保留几位小数。请看以下示例,输出结果分别为:1.3 ,1.33 ,1.333
Sub test2()
a = 4 / 3
b1 = Round(a, 1)
b2 = Round(a, 2)
b3 = Round(a, 3)
Debug.Print (b1)
Debug.Print (b2)
Debug.Print (b3)
End Sub