40
1 壹、課程說明 單元名稱 Excel VBA 程式設計 單元摘要 本專題在學生 Visual Basic 的學習基礎上增加 Microsoft Office Excel(以下簡稱 Excel)應用程式中「物件」的觀念,希望學生學習不同的 Visual Basic 程式應 用,並做出一個簡易的應用程式。為了引起學生興趣,本專題實做了氣泡排序 法以及簡單的遊戲。 設計者 邱柏翰 教師(國立羅東高級中學) 學習目標 1. 能夠瞭解 Visual Basic 程式語言的語法 2. 能夠瞭解 Excel VBA 的物件操作方式 3. 能實際設計出小型的 VBA 語言專題作品 課綱範圍 資訊學科與應用專題(選修課程) 教學節數 1. 建置專題所需的環境(1 節課) 2. 複習 Visual Basic 語法(3 節課) 3. 物件、屬性、方法、事件(1 節課) 4. 認識 Excel VBA 常用的物件操作(2 節課) 5. 使用 Excel VBA 將排序的過程視覺化呈現(2 節課) 6. 使用 Excel VBA 設計井字遊戲(2 節課) 7. 使用 Excel VBA 設計生命遊戲(1 節課) 先備知識 1. 學習過 Excel,熟悉軟體操作 2. 學習過程式語言(Visual Basic 尤佳),瞭解程式語言基本語法與原理。 評量方法 1. 口頭問答及課堂觀察 2. 上機實做 3. 專題成果展示 4. 隨堂作業 分享方式 參考資源 1. 立山秀利(2012)。世界第一立即有效的 Excel VBA。。台北市:旗標。 2. 山本櫻子(2010)。辦公室提昇效率必備 Excel VBA 技法 256 招。台北市: 旗標。 3. 伍雲輝等(2008)。Excel VBA 辦供應用開發詳解。台北市:文魁資訊。 4. ANK Co., Ltd 著;博碩文化編譯(2006)。新 VBA 學習繪本。台北縣:博碩 文化。 5. 資訊學科中心出版之「98 教學資源小組研發教材手冊」教學活動設計參考範 -VB 語言(林明璋、毛全良、劉嘉雄教師)」

壹、課程說明 - icerc.tnssh.tn.edu.twicerc.tnssh.tn.edu.tw/download/tm/102-2.pdf · 貳、教學活動計畫 一、建置專題所需的環境 1節課 教學活動名稱: 1.引起動機

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

  • 1

    壹、課程說明

    單元名稱 Excel VBA程式設計

    單元摘要

    本專題在學生 Visual Basic 的學習基礎上增加 Microsoft Office Excel(以下簡稱

    Excel)應用程式中「物件」的觀念,希望學生學習不同的 Visual Basic 程式應

    用,並做出一個簡易的應用程式。為了引起學生興趣,本專題實做了氣泡排序

    法以及簡單的遊戲。

    設計者 邱柏翰 教師(國立羅東高級中學)

    學習目標

    1. 能夠瞭解 Visual Basic 程式語言的語法

    2. 能夠瞭解 Excel VBA的物件操作方式

    3. 能實際設計出小型的 VBA語言專題作品

    課綱範圍 資訊學科與應用專題(選修課程)

    教學節數

    1. 建置專題所需的環境(1節課)

    2. 複習 Visual Basic語法(3節課)

    3. 物件、屬性、方法、事件(1節課)

    4. 認識 Excel VBA常用的物件操作(2節課)

    5. 使用 Excel VBA將排序的過程視覺化呈現(2節課)

    6. 使用 Excel VBA設計井字遊戲(2節課)

    7. 使用 Excel VBA設計生命遊戲(1節課)

    先備知識 1. 學習過 Excel,熟悉軟體操作

    2. 學習過程式語言(Visual Basic 尤佳),瞭解程式語言基本語法與原理。

    評量方法

    1. 口頭問答及課堂觀察

    2. 上機實做

    3. 專題成果展示

    4. 隨堂作業

    分享方式

    參考資源

    1. 立山秀利(2012)。世界第一立即有效的 Excel VBA。。台北市:旗標。

    2. 山本櫻子(2010)。辦公室提昇效率必備 Excel VBA 技法 256招。台北市:

    旗標。

    3. 伍雲輝等(2008)。Excel VBA 辦供應用開發詳解。台北市:文魁資訊。

    4. ANK Co., Ltd 著;博碩文化編譯(2006)。新 VBA學習繪本。台北縣:博碩

    文化。

    5. 資訊學科中心出版之「98 教學資源小組研發教材手冊」教學活動設計參考範

    例-VB語言(林明璋、毛全良、劉嘉雄教師)」

  • 參考資源

    1. 由於 Microsoft Office 軟體版本各校不一,本範例採用的語法盡量以 Excel

    2003、2007、2010都能夠執行的為主。畫面截圖以 Excel 2007 為主。

    2. Excel 物件模型、事件內容眾多,本教材並未全部提及,可留作教師自行補

    充。

    3. 軟體開發環境請教師先行準備

  • 貳、教學活動計畫

    一、建置專題所需的環境(1節課)

    教學活動名稱:

    1.引起動機(10分)

    2.Excel VBA工作原理、運作的流程(15分)

    3.本專題所使用的程式語言與開發工具(15分)

    4.上機實做(10分)

    時間:50分鐘

    教學活動說明: 1.1引起動機

    1.1.1序言

    本專題所學習的 VBA程式語言,對於已經學過 VB的同學應該有學習遷移的效果,不至

    於感到太陌生。

    而 Excel VBA開發環境(Visual Basic Editor)於 Office軟體安裝時一同被安裝,對於環

    境準備時算是滿方便的。

    Excel VBA可以將操作自動化,初學時學生可以發現透過錄製巨集的功能,將剛剛做過

    的操作重複播放執行,或是略加修改參數做成不同的功能,也許學生不會對程式碼感到太過

    排斥。

    由於 Excel VBA 除了可以用工作表呈現程式執行結果,常見的元件,如按鈕、下拉式選

    單都可以在 Excel VBA 中實現,因此學生會覺得很像是寫出一個可以實用的軟體。

    建議授課教師可以展示一些 Excel VBA 的程式專題成果,引起學生學習動機。

    1.1.2專題展示引起動機

    用 Excel VBA設計的「氣泡排序法」動畫

    用 Excel VBA設計的「井字遊戲」

    用 Excel VBA設計的「生命遊戲」

    用 Excel VBA設計的「俄羅斯方塊」(未列入教學)

    用 Excel VBA設計的「貪食蛇」(未列入教學)

    1.2 Excel VBA工作原理、運作的流程

    1.2.1 VBA介紹

    巨集:先記錄使用者的操作,後續再自動執行操作過程的功能。巨集並不僅止於單一的操作,

    而是記錄或執行一連串的操作過程,同時也是一種能夠代替使用者手動操作,自動執行命令

    的功能。

    微軟 Office軟體中,巨集的指令使用 Basic語言(語法)來表示,所以稱為 Visual Basic for

    Application(VBA),也就是本專題所學習的程式語言,而非純粹的 Visual Basic。

    VBA可以說是目前非常受歡迎的通用程式語言 Visual Basic(簡稱 VB)的一種「方言」。

  • Microsoft的設想是在一些他出產的應用軟體上,附加專門針對這應用軟體的一個程式語言,

    以擴張此軟體的功能,尤其是簡化頻繁重複的工作。

    所以說,VBA是使巨集語言發展更高功能的東西。VBA 的角色定位如下圖所示:

    Windows

    Office產品

    VBA程式

    VB程式

    本專題所學習的 VBA 程式,以 VBA操控 Office軟體(例如 Excel)達到程式的目的,

    程式碼和 Excel 文件儲存在同一個檔案當中,並且不能夠獨立編譯成執行檔,若他人打開包

    含巨集的 Excel 檔案也需要經過安全性設定才能夠執行。

    1.3本專題所使用的程式語言與開發工具

    1.3.1環境準備,讓工能區顯示相關按鈕

    按一下 Excel 2007 最左上的按鈕 —「Excel 選項」--「在功能區顯示開發人員索引標籤」

    (打勾)

    命令

    命令

  • 1.3.2錄製巨集,見識第一個 VBA程式

    在 A1儲存格裡隨意輸入一段文字之後按下「Enter」鍵

    再次選取儲存格 A1。此時直接點選左下角的錄製巨集按鈕

  • 接著就會開啟錄製巨集交談視窗。巨集名稱預設值是 Macro1。請直接按下確定按鈕即可。如

    此一來就開始錄製巨集。

    將 A1儲存格的文字設定為紅色粗體字,然後停止巨集錄製

    執行剛剛記錄的巨集

    請在 C5儲存格輸入一段文字之後,按下 Enter鍵,再用滑鼠點選儲存格 C5

  • 接著切換至檢視標籤頁,點選巨集按鈕

    接著將開啟巨集交談窗。從巨集清單裡點選剛剛記錄的巨集 Macro1,再點選執行按鈕

    這個操作請師生共同注意:A1儲存格在呈現點選擇狀態時,才能開始錄製巨集。C5儲存格

    在呈現選擇狀態時,才能套用巨集。

  • 並請注意:

    如上圖,假設 A1在儲存格正在輸入的時候,邊框會比較細,此時選單、工具列或是錄製巨

    集的按鈕都暫時失效,請師生注意。

    A1儲存格輸入完成後,按下 Enter(此時會移動到下方儲存格 A2,或是滑鼠按一下其他儲存

    格)再點回去 A1,此時儲存格的狀態呈現選取狀態,邊框比較粗,此時才可以使用選單、工

    具列等按鈕來工作。

    1.3.3剛剛錄製的巨集

    切換至檢視標籤頁,點選巨集按鈕

    接著將開啟巨集交談窗。從巨集清單裡點選剛剛記錄的巨集 Macro1,再點選編輯按鈕

    這是第一次見到 VBE 環境,剛剛錄製的巨集程式碼便是展現在右方視窗當中,本段程式碼功

    能如下:

    正被選擇到的儲存格字型設為粗體

    正被選擇到的儲存格字體顏色改為紅色

    至於詳細程式碼的設計,待下一章節詳述。

  • 1.4上機實做

    1.4.1請學生錄製一個巨集,並且執行

    請學生錄製一個「可以把儲存格的文字設定為 20點標楷體」的巨集,並且執行之。

  • 貳、教學活動計畫

    二、複習 Visual Basic語法(3節課)

    教學活動名稱:

    1.基本的程式(15分)

    2.變數、資料型態、函數設計(20分)

    3.上機實做(15分)

    4.運算子(複習)( 20分)

    5.流程敘述(複習)(50)

    6.上機實做 (30分)

    時間:150分鐘

    2.1基本的程式

    2.1.1VBE環境

    如果要發揮 VBA 的功能,光靠錄製巨集是不夠的,必須錄製之後加以修改,或是開發自

    己所需的功能,所以接下來的教學以自行開發 VBA 為主,同學必須要切換到 VBE 編輯器的

    環境。

    呼叫 VBE編輯器

    切換至開發人員標籤頁,點選 Visual Basic按鈕就能夠叫出 VBE編輯器

    Visual Basic Editor

    仔細觀察,如果剛剛有錄製巨集的話,此時的專案視窗會有一個「模組」(資料夾的圖示),

    其下有一個Module1(錄製巨集時,您替巨集取的名字)

    屬性視窗

    專案總管

  • 如果剛剛沒有錄製巨集的話,此時的專案就沒有「模組」(資料夾的圖示)

    2.1.2環境準備

    建立自己的Module

    若您之前已經錄製過巨集,或是開啟已經有巨集的檔案,此時的專案總管會有一個模組

    資料夾,建議您移除之後,再做一個新的模組出來。

    若您要開始寫程式,發現有一個模組的話,建議您刪掉,做一個新的

  • 在Module1 身上按滑鼠右鍵—移除Module1

    主選單—插入—模組

    2.1.3第一個程式

    建立自己的模組之後,在右手邊會出現一個空白的程式編輯區

  • 這時候請寫出如下的程式碼,三行都必須撰寫

    Sub test()

    MsgBox "第一個 VBA程式" End Sub

    這三行程式碼解釋如下:

    Sub test(),建立一個名為 test 的副程式

    MsgBox "第一個 VBA 程式",用內建的對話盒視窗顯示一句話

    End Sub,副函式結束

    2.1.4執行程式

    按下工具列的執行按鈕 ,本程式執行之後會產生一個對話窗

    2.1.5存檔

    在 Excel 2007 的規定中,帶有巨集的 Excel 檔,並不能以普通的活頁簿 xlsx 檔儲存,會出現

    如下對話窗:

    此時存檔請用下拉式選單,選擇「Excel 啟用巨集的活頁簿」,而存檔的副檔名將會改成*.xlsm

  • 2.1.6開啟有巨集的活頁簿

    若滑鼠直接 double-click *.xlsm 檔案,雖然 Excel 2007 依舊會把檔案開啟,但是將不會執行巨

    集程式,並且在標籤頁下方會出現安全性警告。若不注意觀察也許會忽略掉。

    請按「選項」按鈕,將出現「安全性警告—巨集」的對話窗,請選擇「啟用這個內容」,然後

    按「確定」關閉這個視窗,這樣一來,就可以正常的編輯、執行您的巨集程式了。

    2.2變數、資料型態、函數設計

    2.2.1Visual Basic語言的基礎

    關於 Visual Basic 語法,請各位老師參考坊間 Visual Basic 相關書籍有更詳細的解說,或

    是參考資訊學科中心出版之「98教學資源小組研發教材手冊」教學活動設計參考範例-VB語

    言(林明璋、毛全良、劉嘉雄教師),本節只做重點摘錄。

    強制變數宣告 Option Explicit

    建議變數宣告,其好處例如:避免在程式中誤用重複的變數名稱而不自知,或是變數名稱輸

    入錯誤,而難以找到錯誤發生的原因。可請教師事情況講解。

    變數

    Dim 變數名稱 [AS 資料型別]

    常見的資料型例如

    資料型別 資料型別名稱

    位元組 Byte

    整數 Integer

    長整數 Long

    單精度浮點數 Single

    倍精度浮點數 Double

    布林值 Boolean

  • 字串 String

    日期 Date

    陣列

    定義一維陣列

    Dim 陣列名稱(上界) As 資料類型

    陣列索引號碼從 0到上界

    定義二維陣列

    Dim 陣列名稱(第 1 維上界, 第 2維上界) As 資料類型

    定義 Sub 程序

    [Private|Public|Friend|Static] Sub 程序名稱[(參數列表)]

    (程式碼) End Sub

    呼叫 Sub 程序

    Call 程序名稱(程序參數列表)

    可以將 Sub 程序作為一個巨集來呼叫

    (畫一個按鈕連到這個程序)

    定義函數

    [Private|Public|Friend|Static] Function 函數名稱[(參數列表)] [As 返回類型]

    (程式碼)

    End Function

    調用函數

    1.在程式碼中呼叫您寫的函數 Call My_Function

    若是有參數,如下

    Call My_Function(2, 6)

    2.在工作表當中調用函數

    您可以在 VBE的環境當中設計一個函數,然後在前台工作表的地方呼叫他,方式如下:

    在 VBE開發環境之中,假設您撰寫一個輸入底、高,求三角形面積的公式 Function My_Function(a As Integer, b As Integer)

    My_Function = (a * b) / 2

    End Function

    之後便可以在工作表儲存格當中使用這個函數,就像內建的 SUM、AVERAGE 一樣,請見下

  • 3.在 VBA程式碼中,指定儲存格的公式 Cells(1, 4).Formula = "=SUM(A1:A3)"

    4.在 VBA程式碼中,使用工作表的函數

    Dim a As Integer

    a = WorksheetFunction.Sum(Range("A1:A4"))

    2.3上機實做

    2.3.1教師示範

    寫一個程序 homework_1,用 MsgBox 函數顯示一句話,另外在 Sheet1 工作表當中繪製一個

    按鈕,用這個按鈕來呼叫 homework_1程序

    請注意程式碼寫在「模組」--「Module1」當中,程式碼為

    Sub homework_1()

    MsgBox "第一個程式"

    End Sub

    回到前台,第一個工作表的地方

    1.切換工具列到「開發人員」頁

    2.插入--表單控制項

    3.畫一個按鈕在工作表上

  • 當你畫完按鈕的瞬間,Excel 就會顯示「指定巨集」的視窗,這時請點選「homework_1」,這

    樣當你按下按鈕的時候,就會呼叫 homework_1 這個程序。

    2.3.2請學生練習

    2.4運算子(複習)

    2.4.1算數運算子

    ^運算子 用來進行次方運算

    *運算字 用來將兩數相乘

    /運算子 用來進行兩個數的除法運算,並返回一個浮點數。

    \運算子 用來對兩個數進行整除運算,商數不取小數

    Mod 運算子 用來對兩個數做除法並且只傳回餘數

    +運算子 用來求兩數之和

    -運算子 用來求兩數之差或表示數值運算式的負值

    2.4.2比較運算子

    比較運算子用來表示兩個或多個值或運算式之間的關係。這些運算子包括小於(=)、不等於()和等於(=)

    2.4.3字串連結運算子&

  • 2.4.4邏輯運算子

    邏輯運算子是指連接運算式進行邏輯運算的運算子,其運算結果為 True 或 False 兩種可能,

    列舉如下:

    Not運算子

    And運算子

    Or運算子

    Xor運算子

    Eqv運算子

    Imp 運算子

    2.5流程敘述(複習)

    2.5.1 If Then Else

    If … Then 敘述

    If 條件 Then

    處理 1 End If

    If…Then…Else敘述

    If 條件 Then

    處理 1 Else

    處理 2

    End If

    If…Then….ElseIf敘述

    If 條件 1 Then

    處理 1

    ElseIf 條件 2 Then

    處理 2

    ElseIf 條件 3 Then

    處理 3 Else

    處理 4 End If

    2.5.2 Select

    Select Case敘述

    Select Case 算式

    Case 值 1

    處理 1

    Case 值 2

    處理 2 Case Else

    其他狀況時的處理 End Select

    2.5.3 While

    Do…Loop 迴圈

  • Do While…Loop

    Do While 條件

    處理 Loop

    Do…Loop While

    Do

    處理

    Loop While 條件

    Do Until…Loop

    Do Until 條件

    處理 Loop

    Do…Loop Until

    Do

    處理

    Loop Until 條件 While…Wend

    While 條件

    處理 Wend

    2.5.4 For Next

    For…Next 敘述

    For Counter變數=起始值 To 終止值

    處理

    Next

    For Each…Next 敘述

    For Each 物件變數 In 物件集合

    處理

    Next

    2.6上機實做

    2.6.1猜數字程式

    撰寫一個程式,由電腦亂數選出一個 1~100 的數字,然後讓使用者來猜,假如使用者猜錯了,

    程式會提醒範圍變更。

    使用者透過 InputBox 函數輸入,例如:

    a = InputBox("請猜數字", "遊戲開始")

    執行時會跳出如下對話窗:

  • 使用者輸入的數字之後,這個數字會指定給 a變數

    亂數的使用

    Rnd 函數會傳回小於 1,但大於或等於零的值。

    所以要產生 1~100的亂數數字,就將這個亂數放大 100倍之後取整數再加 1。

    例如:

    原本的數字

    0.000000~0.999999

    放大 100倍

    0.000000~99.999999

    取整數

    0~99

    加 1

    1~100

    參考程式碼如下: Sub homework_2()

    Dim a As Integer

    Dim answer As Integer

    Dim lower_bound As Integer

    Dim upper_bound As Integer

    answer = Int(Rnd * 100) + 1

    lower_bound = 1

    upper_bound = 100

    a = InputBox("請猜數字", "遊戲開始")

    While a answer

    If a > answer Then

    upper_bound = a

    Else

    lower_bound = a

    End If

  • MsgBox "從" & lower_bound & "到" & upper_bound

    a = InputBox("請猜數字", "再接再厲")

    Wend

    MsgBox "猜對了"

    End Sub

  • 貳、教學活動計畫

    三、物件、屬性、方法、事件(1節課)

    教學活動名稱:

    1.物件、屬性( 10分)

    2.方法(10分)

    3.事件(20分)

    4.上機實做(10分)

    時間:50分鐘

    3.1物件、屬性

    本章節物件、屬性、方法、事件為概論,各物件常用的處理留待第四章,教師也可將第三、

    第四章綜合之後進行教學

    3.1.1物件

    物件構成 Excel 的各種元素,儲存格、工作表、活頁簿、統計圖表、圖案……等「東西」都

    是物件。

    所以只要在 VBE裡能將物件名稱寫成程式碼,再加以操作,就是撰寫 VBA程式了。

    3.1.2屬性

    屬性(Property)是指物件的狀態

    屬性的值

    屬性可以取得、設定。但卻也有可以取得值卻無法設定的屬性

    屬性的取得

    參照物件或集合的屬性時,使用「.(句號)」來取得屬性,例如: Dim str As String

    str = Application.Name

    本行程式碼的作用:取得應用程式的名稱代入變數 str

    Dim cnt As Integer

    cnt = Worksheets.Count

    本行程式碼的作用:取得 Worksheets 集合中包含的工作表數量,代入 cnt 變數

    屬性的設定 ActiveWindow.Width = 250

    本行程式碼的作用:將目前開啟作用中的工作表視窗的寬度設定為 250 point

    3.1.3使用 VBE的程式碼輔助功能

    撰寫程式碼的過程中,當您寫了一個物件,例如本例 Range("A1"),當您繼續寫上「.」要來

    存取屬性時,VBE就會提供輔助的功能,將 Range物件所能使用的屬性以及方法以清單的方

    式顯示,我們只要點選其中的屬性及方法就能直接輸入在程式碼裡面。這樣就不需要背誦,

    也不用擔心拼字錯誤了。

  • 3.2方法

    3.2.1方法

    方法是為了操作物件,使其動作的介面(Interface)。和函數或屬性相同,有可以指定引述的

    東西,可以取得傳回值的東西

    VBA執行物件方法的語法如下:

    物件名稱.方法名稱

    在物件名稱與方法名稱的中間以半形的「.」句點連結,這個方式很像是存取屬性的語法。

    3.2.2參數

    用來指定方法在執行時的條件。有些時候利用方法執行動作時,要進一步設定,進一步設定

    的條件就是「參數」,語法如下:

    方法名稱 參數名稱:=設定值

    方法名稱 參數名稱 1:=設定值 1, 參數名稱 2:=設定值 2, 參數名稱 3:=設定值 3,……

    執行無參數的方法 Worksheets("Sheet3").Activate

    執行有參數的方法

    Workbooks("Book1").Close False

    傳入多個參數時,利用「,(逗號)」分隔 Worksheets.Add after:=Worksheets(2), Count:=3

    在編號 2的工作表後面增加 3個工作表

    3.3事件

    3.3.1事件

    事件是對物件進行操作或處理時發生的東西。例如,點選滑鼠時發生 Click 事件,物件作用

    時發生 Activate事件。

    VBA中,發生特定的事件時,會產生被執行的程序。像這樣的程序稱為事件程序。

    3.3.2工作表的事件

    示範如何針對工作表的事件撰寫程式碼

    切換到 VBE 的環境,這次寫程式的地方比較特別,請在 Sheet1 上面滑鼠 double-click

  • 中間下拉式選單選擇「worksheet1」,然後在其右方的下拉式選單選擇「SelectionChange」事

    這時候程式碼的地方會幫使用者填上 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    End Sub

    現在,您可以針對「第一張工作表」、「儲存格選擇變動」這個事件寫上您想要做的處理,若

    您寫上

    MsgBox "您選到(" & Target.Row & "," & Target.Column & ")"

    這行程式碼,回到前台工作表的地方,當您滑鼠點到不同的儲存格,就會有一個對話視窗跳

    出來。

  • 這個事件我們在「井字遊戲」的專題中會用到,請大家注意。

    3.3.3活頁簿的事件

    若要撰寫活頁簿事件的程式,在 VBE環境中

    1.選「ThisWorkbook」

    2.中間下拉選單「Workbook」

    3.Workbook 事件相當多,本次示範 Open、WindowResize 兩個事件,請分別下拉、選擇事件

    之後,撰寫程式。

    Private Sub Workbook_Open()

    MsgBox "歡迎使用這個程式"

    End Sub

    Private Sub Workbook_WindowResize(ByVal Wn As Window)

    MsgBox "視窗的大小已變更"

    End Sub

    要測試Workbook_Open 事件必須把檔案存檔、關閉之後,再打開檔案才會生效,請同學注意

    3.4上機實做

    3.4.1請同學練習撰寫 Worksheet_SelectionChange

    Worksheet_Activate

    事件的程式

  • 貳、教學活動計畫

    四、認識 Excel VBA常用的物件操作(2節課)

    教學活動名稱:

    1.物件和集合( 10分)

    2.儲存格(30分

    3.上機實做(10分)

    4.工作表(20分)

    5.應用程式、活頁簿(20分)

    5.上機實做(10分)

    時間:100分鐘

    4.1物件和集合

    4.4.1Excel 常用物件

    物件 VBA的物件、集合

    應用程式 Application 物件

    使用者表單 UserForm物件

    活頁簿 Workbook物件

    Workboos 集合

    圖表工作表 Chart物件

    Charts 集合

    工作表 Worksheet 物件

    Worksheets 集合

    表 Sheet 物件

    Sheets 集合

    儲存格 Cell 物件

    Cells 集合

    Range物件

    Application 物件

    Application 物件代表整個 Excel 應用程式

    Worbook物件

    Worbook 代表一個 Excel 活頁簿。Workbook 物件是 Workbooks 集合的成員。Workbooks 集合

    包含 Excel 中目前打開的所有 Workbook 物件。

    Worksheet 物件

    Worksheet 物件代表一個工作表。Worksheet 物件是Worksheets 集合的成員。

    Range物件

    Range物件代表某一儲存格、某一行、某一列、某一選定區域

    相關書籍對於 Range使用著墨甚多,但如果將儲存格以 Cells 也是很方便的,就看授課教師安

    排。

  • 4.2儲存格

    4.2.1使用 Cells

    選取第 5列第 3行的儲存格 Cells(5, 3).Select

    選取全部儲存格 Cells.Select

    參照 1個的儲存格時,例如: Cells(1, 1).Value =10

    第一個數字是儲存格的列編號

    第二個數字是儲存格的欄編號

    Value屬性(取得或設定儲存格的值)

    本行程式碼的作用:A1儲存格的值設定 10

    設定儲存格的公式

    利用 VBA取得、設定算式時,要使用 Formula屬性,例如: Cells(3, 2).Formula = "=B1+B2"

    本行程式碼的作用:B3儲存格的公式設定為 B1+B2

    設定儲存格的格式設定

    Cells(1, 1).Font.Color = RGB(255, 0, 0)

    本行程式碼的作用:將 A1儲存格的文字顏色設定為紅色

    Cells(1, 1).Font.Size = 8

    本行程式碼的作用:將 A1儲存格的文字大小設定為 8

    4.2.2Range的使用

    Cells 屬性能參照的僅有「單一儲存格」及「所有儲存格」,Range 屬性可自由選取複數儲存格

    使用 Range屬性選取儲存格 Range(“C5”).Select

    Range(“A1”).Value=10

    A1表示儲存格的字串

    本行程式碼的作用:A1儲存格的值設定 10

    選取連續的範圍 Range("A1:B2").Select

    或 Range("A1", "B2").Select

    本行程式碼的作用:A1到 B2儲存格被選取(如滑鼠從 A1拖曳至 B2的樣子,那些儲存格呈

    現反白)

    選取整行/整列

    語法 作用

    Range("1:1").Select 選取第一列

  • Range("A:A").Select 選取 A欄

    Range("1:3").Select 選取第一列到第三列

    Range("A:C").Select 選取 A欄到 C 欄

    Range("1:3,6:6").Select 選取第一列到第三列,以及第六列

    Range("A:C,F:F").Select 選取 A欄到 C 欄,以及 F欄

    清除儲存格內容 Range("A1:Z20").Select

    Selection.ClearContents

    本行程式碼的作用:A1到 Z20的儲存格選取之後,類似按下 Delete 按鈕清除內容

    4.2.3Cells 和 Range合併使用

    將 Cells 屬性作為 Range屬性引數 Range(Cells(1, 2), Cells(5, 4)).Select

    本行程式碼的作用:B1到 D5儲存格被選取

    Cells 和 Range 哪一種比較好用?就看程式需求,另外 Cells 有個優點是引數的值可以使用變

    數,例如下圖:

    假如要從左上到右下填入數字

    此時操作 Cells 是比較方便的,程式碼如下:

    Sub test()

    For i = 1 To 10

    Cells(i, i) = i

    Next

    End Sub

    4.3上機實做

    4.3.1上機實做

    請在儲存格當中,參考上一節程式,由左上到右下的方式填入數字

    也可以試試看在儲存格中利用迴圈填入其他數字,例如 1到 100

  • 4.4工作表

    4.4.1工作表的使用

    參照工作表時,要使用 Worksheets 屬性

    各位若對工作表的操作想知道更多的話,可以錄製巨集,就知道新增、刪除、修改……的動

    作該怎麼用程式碼撰寫。

    Worksheets("Sheet2").Activate

    本行程式碼的作用:切換到工作表「Sheet2」,效果類似滑鼠點了第二張工作表

    Worksheets("Sheet2").Delete

    本行程式碼的作用:工作表刪除

    Worksheets("Sheet2").Copy

    本行程式碼的作用:將「Sheet2」工作表複製,會另外開啟一個檔案

    Worksheets("Sheet2").Copy Before:=Worksheets(1)

    本行程式碼的作用:將「Sheet2」工作表複製到 1號工作表之前,不會另外開一個檔案

    新增一個工作表 Worksheets.Add

    4.5應用程式、活頁簿

    整合 1個表以上的東西稱為活頁簿

    活頁簿大概可以想像是「該 Excel 檔」,工作表或圖表等物件集合稱為活頁簿。以圖形所示為:

    4.5.1活頁簿的操作

    新增活頁簿 Workbooks.Add

    本行程式碼的作用:就像是用選單「開新檔案」--「空白活頁簿」,會產生一個空白檔案。

    開啟活頁簿 Workbooks.Open Filename:="D:\book4.xlsx"

    本行程式碼的作用:開啟一個 xlsx 檔案

    關閉所有活頁簿 Workbooks.Close

    記得存檔

  • 關閉使用中的活頁簿

    ActiveWorkbook.Close

    關閉特定的活頁簿 Workbooks("Book2.xlsm").Close

    存檔後關閉活頁簿 Workbooks("Book2.xlsm").Close SaveChanges:=True

    特定活頁簿存檔 Workbooks("Book2.xlsm").Save

    作用中的活頁簿存檔

    ActiveWorkbook.Save

    要參照活頁簿時,要使用 Workbooks 屬性 MsgBox Workbooks(1).Name

    本行程式碼的作用:將 1號活頁簿的名稱顯示在訊息方塊

    Workbooks("Book1").Activate

    本行程式碼的作用:切換至活頁簿「Book1」

    應用程式

    Application.Quit

    本行程式碼的作用:結束 Excel 程式

    4.6上機實做

    4.6.1上機實做

    請練習本節所講述的語法

  • 貳、教學活動計畫

    五、使用 Excel VBA將排序的過程視覺化呈現(2節課)

    教學活動名稱:

    1.複習氣泡排序法(20分)

    2.氣泡排序法以 VB實做( 30分)

    3.完成專題(30分)

    4.進階學習(20分)

    時間:100分鐘

    5.1複習氣泡排序法

    5.1.1氣泡排序

    它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。

    走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演

    算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

    5.1.2氣泡排序法的步驟

    1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

    2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的

    元素應該會是最大的數。

    3. 針對所有的元素重複以上的步驟,除了最後一個。

    4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

    5.1.3氣泡排序法的虛擬碼

    請老師注意學生陣列邊界的處理,氣泡排序法的寫法很多,請老師以學生熟知的方式為主 function bubblesort (A : list[1..n]) {

    var int i, j;

    for i from n downto 1 {

    for j from 1 to i-1 {

    if (A[j] > A[j+1])

    swap(A[j], A[j+1])

    }

    }

    }

    5.2氣泡排序法以 VB 實做

    5.2.1以 Excel VBA語法撰寫氣泡排序法

    5.2.1.1在畫面上安排兩個按鈕「亂數資料」、「資料由大到小」

    5.2.1.2設計「亂數資料」按鈕的程式

    產生 1 到 100 不重複的亂數,依序填入儲存格,若您的方法是「產生亂數、檢查是否重複、

    重複就再抽一個數字、不重複就填入」,方法雖然可行,但會花費太多次的檢查,所以這邊提

    供的方法是:

    先在 A1到 A100依序置入 1到 100的整數,然後再亂數取兩個儲存格,數字兩兩交換,多次

    之後就能將 1到 100 的數字打亂。

    Sub CommandButton1_Click()

  • '1到 100,依序填入儲存格 For i = 1 To 100

    Cells(i, 1) = i

    Next

    Randomize

    '取兩個儲存格,數字兩兩交換,做 100次 For i = 1 To 100

    a = Rnd() * 1000 Mod 100 + 1

    b = Rnd() * 1000 Mod 100 + 1

    'MsgBox a & b

    temp = Cells(a, 1)

    Cells(a, 1) = Cells(b, 1)

    Cells(b, 1) = temp

    Next

    MsgBox "排序開始"

    Call Bubble_Sort

    End Sub

    5.2.1.3設計「資料由大到小」按鈕的程式

    氣泡排序法在數字呈現「由大到小」排列的時候,效率最差,所以要讓學生觀察到這種狀況,

    因此做了這個按鈕。 Sub CommandButton2_Click()

    '由大到小 For i = 1 To 100

    Cells(i, 1) = 101 - i

    Next

    MsgBox "排序開始"

    Call Bubble_Sort

    End Sub

    5.2.1.4以 A1到 A100 的資料繪製「散佈圖」

    選擇散佈圖,以利看出資料從散佈到歸位的過程

  • 一開始呈現散佈狀態

    大約 A90到 A100的數字已經排上正確的數字

    數字已經排好,也就是 A1是最小的,A2 是第二小

    5.2.1.5設計氣泡排序法主程式 For i = 100 To 2 Step -1

    For j = 1 To i - 1

    If Cells(j, 1) > Cells(j + 1, 1) Then

    temp = Cells(j, 1)

    Cells(j, 1) = Cells(j + 1, 1)

    Cells(j + 1, 1) = temp

    End If

  • Next

    Range("B1").Select

    Call sleep

    Next

    5.3完成專題

    5.3.1請完成本節內容

    成果請從網路下載:

    5.4進階學習

    5.4.1修改 5.3.1所設計的程式,改成其他排序法

    老師可以提供或是講述插入、選擇排序法的程式碼,讓學生修改後使用在本專題

  • 貳、教學活動計畫

    六、使用 Excel VBA設計井字遊戲(2節課)

    教學活動名稱:

    1.井字遊戲流程(50分)

    2.完成專題 (50分)

    時間:100分鐘

    6.1井字遊戲流程

    本專題將設計一個井字遊戲(英文:Tic-tac-toe或是口語的圈圈叉叉)

    本程式只能自己一個人玩,遊戲開始之後,電腦先攻,畫叉叉;使用者畫圈圈,電腦出手的

    方式以亂數進行(註:教師可以針對電腦出手的方式另闢專題講解遊戲樹、人工智慧等課題)

    6.1.1畫面設計

    6.1.1.1選定 9個格子當作棋盤

    本專題以 E2到 G4為範圍,同學可以自行選定,然後畫上格線以資辨認

    6.1.1.2畫上一個「遊戲重開」的按鈕

    這個按鈕的程式就是本專題的全部,容後敘述

    6.1.2程式設計

    6.1.2.1程式構想

    以 3X3的儲存格為盤面

    設定狀態:玩家階段、電腦階段

    把盤面的資料讀入一個 3X3的二維陣列,方便處理

    當使用者滑鼠點到某個儲存格,觸發 Worksheet_SelectionChange 事件,代表「下棋」

    用 3X3的陣列儲存盤面資料,以-1代表╳;1代表○。好處是可以將陣列內容相加得知勝負

    狀況,例如:

    ○ ╳

    ╳ ○ ╳

    轉成二維陣列

    0 1 0

    0 1 -1

    -1 1 -1

  • 檢查所有「三格連線」的可能

    可以發現圈連成一線的話,其儲存格的值相加為 3

    叉連成一線的話,其儲存格的值相加為-3

    6.1.2.2遊戲流程

    盤面清空……等初始動作

    電腦下棋

    判斷勝負

    是否有人獲勝?

    使用者輸入

    判斷勝負

    是否有人獲勝?

    6.1.2.2程式碼解說

    清空盤面 Worksheets(1).Range("e2:g4").ClearContents

    清空二維陣列 For i = 1 To 3

    For j = 1 To 3

    Table(i, j) = 0

    Next

    Next

    電腦先攻 Call Computer_Choose

    1 2 3

    1 0 1 0

    2 0 1 -1

    3 -1 1 -1

  • 電腦亂數選一格 While Not Selected

    i = Int((3 * Rnd) + 2)

    j = Int((3 * Rnd) + 5)

    If Cells(i, j) = "" Then

    Table(i - 1, j - 4) = -1

    Selected = True

    Cells(i, j) = "╳"

    End If

    Wend

    判斷勝負 a = Table(1, 1) + Table(1, 2) + Table(1, 3)

    b = Table(2, 1) + Table(2, 2) + Table(2, 3)

    c = Table(3, 1) + Table(3, 2) + Table(3, 3)

    d = Table(1, 1) + Table(2, 1) + Table(3, 1)

    e = Table(1, 2) + Table(2, 2) + Table(3, 2)

    f = Table(1, 3) + Table(2, 3) + Table(3, 3)

    g = Table(1, 1) + Table(2, 2) + Table(3, 3)

    h = Table(1, 3) + Table(2, 2) + Table(3, 1)

    若變數相加為 3,就是圈贏;變數相加為為-3,就是叉贏,其他都不能決定輸贏。

    使用者輸入

    本程式當「使用者點到盤面時」就視為下棋,所以要先針對「儲存格選擇改變」事件撰寫程

    式 Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    由於「儲存格選擇改變」事件也可能在「電腦下棋」時觸發,所以程式需要檢查「目前是否

    為玩家階段」,以及「是否下在盤面內」才有相對應的處理 If Turn = user And ActiveCell.Value = "" And (2

  • 貳、教學活動計畫

    七、使用 Excel VBA設計生命遊戲(1節課)

    教學活動名稱:

    1.介紹生命遊戲(20分)

    2.完成專題 (30分)

    時間:50分鐘

    7.1介紹生命遊戲

    7.1.1生命遊戲簡介(摘錄自維基百科)

    生命遊戲,又稱生命棋,是英國數學家約翰·何頓·康威在 1970 年發明的細胞自動機。

    它最初於 1970年 10 月在《科學美國人》雜誌上馬丁·葛登能的「數學遊戲」專欄出現。

    生命遊戲中,對於任意位置,規則只有三條:

    當周圍有 3個細胞時,該位置產生細胞

    當周圍有 2個細胞時,該位置維持原樣

    其他情況,該位置變為無細胞

    生命遊戲其實是一個零玩家遊戲。它包括一個二維矩形世界,這個世界中的每個方格居

    住著一個活著的或死了的細胞。一個細胞在下一個時刻生死取決於相鄰八個方格中活著的或

    死了的細胞的數量。如果相鄰方格活著的細胞數量過多,這個細胞會因為資源匱乏而在下一

    個時刻死去;相反,如果周圍活細胞過少,這個細胞會因太孤單而死去。實際中,玩家可以

    設定周圍活細胞的數目怎樣時才適宜該細胞的生存。如果這個數目設定過高,世界中的大部

    分細胞會因為找不到太多的活的鄰居而死去,直到整個世界都沒有生命;如果這個數目設定

    過低,世界中又會被生命充滿而沒有什麼變化。

    7.1.2本專題程式構想

    定義「盤面」的範圍?Excel 儲存格有 65535列,16384行,程式如何定義細胞活動的範

    圍? →在處理盤面之前記得條件判斷

    如何讓使用者安排「細胞」在盤面上? →仿照上一個專題,偵測滑鼠點到某個儲存格

    的事件

    如何判斷細胞周圍的狀況? →找到儲存格的座標,X座標增加代表向下;Y座標增加

    代表向右,總共八個方位,請同學想想看

    計算的方式

    如何判斷盤面上已經沒有細胞,顯示遊戲結束? →由於細胞的有無,已經以數字表示,

    所以可以用內建的函數計算

    7.1.3本專題實作過程

    7.1.3.1定義盤面

    本專題限定細胞的活動範圍從 A1到 AD20

    請同學在盤面外繪製兩個按鈕,功能分別是:「清空」和「執行」

    按鈕「清空」的程式碼如下:

    Sub 按鈕 1_Click() Range("A1:AD20").Select

    With Selection

  • .ClearContents

    End With

    Cells(1, 1).Select

    End Sub

    上面的程式碼是透過錄製巨集的方式得知,同學也可以寫的精簡一點

    Sub 按鈕 1_Click() Range("A1:AD20").ClearContents

    Cells(1, 1).Select

    End Sub

    至於按鈕「執行」的程式碼則是本專題的重頭戲,容後敘述。

    7.1.3.2使用者輸入

    本專題在 A1到 AD20 的儲存格中運作,清空內容代表沒有「細胞」,若使用者需要放置

    細胞,請在儲存格當中輸入 1,為了方便呈現,使用「設定格式化的條件」,把值為 1的儲存

    格設定填滿顏色,看起來就像是有個細胞。也就是說,把「塗色」的工作交給 Excel 自動處

    理。程式只要填上 1 或是清空就好。

    由於設定了格式化的條件,只要您填上 1,Excel 就自動幫您塗滿藍色

    7.1.3.3判斷細胞周圍的狀況

    以儲存格 C2為例,周圍 8格的細胞數量可以用 SUM(B1:D3)計算得知,也可以用程式語言把

    附近 8個格子的值相加,兩個方法都可以,不過為了學習 VBA,我們還是學習使用內建的函

    數。

    A B C D E

    1

    2 1 1

    3 1

    4

    如果您要在巨集當中使用工作表函數,必須這樣寫

    WorksheetFunction.Sum(Range("B1:C3"))

    注意 Sum 的裡面不能直接寫 B1:C3,而是要傳一個 Range物件

    由於 Sum 函數會傳回一個結果,建議可以使用一個變數記錄它,例如: Dim a As Integer

  • a = WorksheetFunction.Sum(Range("B1:C3"))

    MsgBox a

    同學可以發現用 B1:C3 的方式去設定儲存格範圍似乎不是那麼的靈活,因此要多學會一招「使

    用儲存格建立範圍」,再把範圍傳給函數的方法。 Dim a As Integer

    a = WorksheetFunction.Sum(Range(Cells(1, 2), Cells(3, 4)))

    MsgBox a

    用列、行指定儲存格的時候,要先說列,再說行,所以 B1儲存格是 Cells(1,2),而這個數字

    可以用迴圈變數替換

    7.1.3.4變動細胞的方式

    程式將替每一個格子計算附近細胞的狀況,但請注意計算的結果都不該「立刻就畫上去」,以

    免影響附近的細胞,舉例如下:

    A B C

    D E F

    如上圖,假如計算順序是由上而下,由左而右,D儲存格附近只有 1個細胞,所以 D儲存格

    的細胞會消失,如果您就直接消掉 D儲存格然後計算 E、F儲存格的話,將會計算錯誤,如

    下圖左。

    錯誤 正確

    7.1.3.5細胞都消失的判斷 If WorksheetFunction.Sum(Range("A1:AD20")) = 0 Then

    MsgBox "細胞都死光了"

    End If

    這個專題不建議將細胞生活的過程做成 While迴圈,因為有些盤面的結果不會結束,細胞一

    直生生不息。這樣迴圈就停不下來了。

    A B C

    D E F

    A B C

    D E F

    7.2完成專題

    7.2.1請完成本節內容

    成果請從網路下載: