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