# 流程控制
---
# 用 VBA 寫出判斷式
請下載:[Lecture5 - If Else Exercise](https://drive.google.com/uc?export=download&id=1rOk2jcTg50Idukm6UmJb45JM2eCjJ5_e)
---
# 我們之前學會了 Excel 的 IF 函數
---
# 接下來我們就來看如何用 VBA 做判斷
---
# 運算子: 比較運算子
| 運算子 | 描述 | 範例 | 結果 |
|:-----:|:---:|:---:|:----:|
| = | 相等 | 5 = (4+1) | True |
| <> | 不等於 | 7 <> 5 | True |
| > | 大於 | 7 > 5 | Ture |
| < | 小於 | 5 < 7 | True |
| >= | 大於等於 | 101 >= 101 | True |
| <= | 小於等於 | 4 + 2 <= 7 - 2 | True |
---
# IF...Else 判斷式
```vb
If <比較式> Then
'若比較式成立就做些事情...
Else
'若比較式不成立就做些事情...
End If
```
---
# 範例
假設我們想判斷某一個儲存格的值是否大於 7
用 Excel 公式的寫法就是:
```vb
=IF(A1>7, "x > 7", "x <= 7")
```
---
# 範例
將同樣的邏輯用 VBA 寫出來,就是:
```vb
Dim x as Integer: x = 8
If x > 7 Then
Msgbox("x > 7")
Else
Msgbox("x <= 7")
End If
```
---
# 練習
判斷一個學生是否及格
---
# 巢狀選擇結構
我們來看一個比較複雜的判斷:
```vb
A = 8
B = 9
C = 5
```
我們需要判斷 A > B > C
---
# 巢狀選擇結構
拆解一下邏輯,這題可以分成兩層來看:
- A > B 要成立
而且
- B > C 要成立
因此,我們可以使用**巢狀選擇結構**來實作這段邏輯
---
# 巢狀選擇結構
```vb
Dim a as Integer: a = Range("B3").value
Dim b as Integer: b = Range("B4").value
Dim c as Integer: c = Range("B5").value
If a > b Then
If b > c Then
Range("B8").value = "成立"
Else
Range("B8").value = "不成立"
End If
Else
Range("B8").value = "不成立"
End If
```
---
# 練習:商店結帳程式
1. 輸入消費金額和是否為會員
2. 若是會員,消費滿三千打八折,否則就打九折
3. 若不是會員,消費滿五千打九折,否則就不打折
---
# 練習:商店結帳程式
![](https://drive.google.com/uc?export=download&id=1NxX5gb9ds74zCgzAxICj9ww1ooUkE-6l)
---
# IF...ElseIf...Else 多重選擇
白話文就是指 "否則如果",當可能性/選項超出兩種時,可用 ElseIf
```vb
If <比較式1> Then
'若比較式1成立就做些事情...
ElseIf <比較式2> Then
'若比較式2成立就做些事情...
Else
'若比較式不成立就做些事情...
End If
```
---
# ElseIf 範例
```vb
Dim num As Integer: num = 5
If num > 5 Then
Msgbox("num is greater than 5")
ElseIf num < 5 Then
Msgbox("num is less than 5")
Else
Msgbox("num is equal to 0")
```
---
# BMI 計算機
根據使用者BMI值判斷是否過輕或過重
![](https://drive.google.com/uc?export=download&id=1gsnbyhsSFTIqFd_mSBwn3-8L2ouYtoGu)
[BMI Wiki](https://zh.wikipedia.org/wiki/%E8%BA%AB%E9%AB%98%E9%AB%94%E9%87%8D%E6%8C%87%E6%95%B8)
---
# BMI 計算機
![](https://drive.google.com/uc?export=download&id=1nq3oxmlaiA-JwyY_NXPVYD6hI_B-a6fY)
---
# Select...Case
若條件都是參照到同一個變數做判斷時,可以用 Select Case 做選擇結構
---
# Select...Case
```vb
Select Case <運算式>
Case 條件值1
'若運算式等於條件值1就做些事情...
Case 條件值2
'若運算式等於條件值2就做些事情...
Case Else
'若運算式不等於上述任何條件值就做些事情...
End Select
```
---
# Select...Case 範例
```vb
Dim i as Integer: i = 1
Select Case i
Case 1
Msgbox("i = 1")
Case 2
Msgbox("i = 2")
Case Else
Msgbox("i != 1 or 2")
End Select
```
---
# 練習
用 Select Case 重構 BMI 計算機
---
# 練習解答
```vb
Dim bmi As Double: bmi = 27.69
Select Case bmi
Case Is < 18.5
MsgBox ("體重過低")
Case Is < 23.9
MsgBox ("體重正常")
Case Is < 27.9
MsgBox ("超重")
Case Is >= 27.9
MsgBox ("肥胖")
End Select
```
---
# 練習解答
```vb
Dim bmi As Double: bmi = 22.3
Select Case bmi
Case Is < 18.5
MsgBox ("體重過低")
Case 18.5 To 23.9
MsgBox ("體重正常")
Case 24 To 27.9
MsgBox ("超重")
Case Is > 27.9
MsgBox ("肥胖")
End Select
```
---
# 邏輯運算子
| 運算子 | 描述 | 範例 | 結果 |
|:-----:|:---:|:---:|:----:|
| Not | 非,取反值 | Not True | False |
| And | 而且 | True And True | True |
| Or | 或許 | True Or False | True |
---
# AND truth table(真值表)
| A | B | A And B |
| :----: | :---: | :-----: |
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
---
# OR truth table(真值表)
| A | B | A Or B |
| :----: | :-----: | :---: |
| True | True | True |
| True | False | True |
| False | True | True |
| False | False | False |
---
# 練習:判斷兩支個股走勢是否相同
---
# 迴圈(Loop)
假設今天需要將同樣的程式碼重複執行很多次
請下載:[Lecture 5 - For 迴圈範例](https://drive.google.com/uc?export=download&id=1cB-sCxgnr-3IZ1rxnATivYbXe35m05Eb)
---
# For...Next Loop
```vb
For 計數變數 = 起始值 To 結束值
'重複做些什麽...
Next
```
---
# 範例
寫一支 VBA 程式將 1 到 10 依序印出來
```vb
Dim i as Integer
For i = 1 To 10
Msgbox(x)
Next i
```
---
# Debug.print
將運算的結果顯示在VBA的即使運算視窗,比起 Msgbox 較爲容易 Debug
---
# Dubug.print
![](https://drive.google.com/uc?export=download&id=1H6YsmcSJbuCz2-AcCUBBHVibhd3Q_OrL)
---
![](https://drive.google.com/uc?export=download&id=1wEpIUCNHItEXyTSDtc0vIIN9sc-B6ACG)
---
# 範例
寫一支 VBA 程式將 1 到 10 依序印出來
```vb
Dim i as Integer
For i = 1 To 10
Debug.print i
Next i
```
---
# 範例 2
寫一支 VBA 程式,用迴圈將 1 至 100 的加總算出來
```vb
Dim i as Integer
Dim sum as Integer
sum = 0
For i = 1 To 100
sum = sum + i
Next i
Msgbox(sum)
```
---
# 範例 Excel 檔案
請下載:[Lecture 6 - For 巢狀迴圈範例](https://drive.google.com/uc?export=download&id=1T8_jvUTYSZTkrPrKHlIvuJl3WqgKiBR_)
---
## 範例:計算 FANG(牙尖股)的報酬率
![](https://drive.google.com/uc?export=download&id=10LTu5DqML19xZjJc6qgBxjKvYuoETTxz)
---
# 第一步:計算 FB 的報酬率
---
# 巢狀迴圈(Nested For Loop)
一個 VBA 迴圈一次只能夠遍歷一個方向
由上往下或由左至右迭代
若今天希望能夠同時往兩個方向迭代
就需要巢狀迴圈
---
# 巢狀迴圈(Nested For Loop)
簡單來説,就是在 For 迴圈内再寫一個 For 迴圈
```vb
Dim i as Integer
Dim j as Integer
'外面的迴圈會從 1 到 3
For i = 1 To 3
For j = 6 To 8
'當外面的 For 迭代一次,裏面的 For 會全部都迭代
Debug.print "i = " & i & " j = " & j
Next j
Next i
```
---
# 巢狀迴圈(Nested For Loop)
```sh
i = 1 j = 6
i = 1 j = 7
i = 1 j = 8
i = 2 j = 6
i = 2 j = 7
i = 2 j = 8
i = 3 j = 6
i = 3 j = 7
i = 3 j = 8
```
---
## 巢狀迴圈(Nested For Loop)
接下來我們就可以用巢狀迴圈計算所有股票的報酬率
![](https://drive.google.com/uc?export=download&id=1Mg00fbrochg8ZSDoPxPlD4yuqGs4Jgrv)
---
## 回家作業
根據範例Excel檔的資料,計算第一年的月薪數目
```vb
Sub GetSingleDayAverage()
End Sub
```
---
## 回家作業
根據範例Excel檔的資料,計算每一年的月薪數目
```vb
Sub GetMonthlySalary()
End Sub
```
---
## 回家作業
根據範例Excel檔的資料,計算每一年的年薪數目
```vb
Sub GetYearlySalary()
End Sub
```
---
## 回家作業
根據範例Excel檔的資料,計算一輩子的收入數目
```vb
Sub GetLifeSalary()
End Sub
```