Excel 與 VBA 財務應用 第五課 (336)

Eugene Chang (張佑成)

November 30th 2024

# 流程控制 --- # 用 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 ```

Thanks for Watching

Contact: yuyueugene84@gmail.com

Download PDF