2014年9月12日 星期五

資料庫的概念

所謂資料庫就是由許多記載不同資料的表格組成的一組資料, 例如學校裡的老師, 學生, 課程, 學生成績可以組成學校資料庫. 資料庫加上一些規定, 原則就可以組成一個管理系統, 例如60分及格, 學科一半不及格留級, 留級三次退學.

以下內容, 請配合免費企業資訊系統分享暨設計內容說明來了解.

資料表格則由一組相關的資料組成, 例如學生資料表, 有學生姓名, 學號, 姓別, 入學日期, 家長姓名. 然後學生成績表, 有學生, 科目, 表試別, 成績.

沒有電腦以前, 資料庫就是一張一張的資料表格, 查資料或統計時, 就一張一張翻. 有了電腦以後, 這些紙張轉變成電子表格, 並增加了許多檢查資料正確性的功能, 讓資料快速轉變成正確有用的資訊.

在MS Office的套件中, Access是資料庫軟體, 對每一個表格的每一個欄位都有資料型態的嚴格管理, 並可以建立索引, 提供快速查詢. 表格間可以進行關聯設定, 組成另一個較多資料的虛擬資料表. 還有預存程序可以對資料庫資料進行增刪.

當然還有更高階的資料庫系統, 如 MS SQL SERVER, 免費的MySQL, Oracle等等, 具有更強大的功能, 但需要投入很多的人力物力來操作維護, 是不適合一般小企業或個人的.

Excel 是一個由表格組成的計算工具, 因為是表格, 而且可以有很多表格記錄各種資料, 也可以依規定原則進行運算得到各種結果, 所以也具有資料庫, 管理系統的功能. 只是Excel對資料的限制很少, 做為資料庫, 安全性就低了一些.

Access的資料庫功能在Excel中都是比較薄弱的. 但Access對大多數人來說是陌生的, 也因功能較強, 所以需要比較多的專業知識, 這也造成一般人使用上的困難. 雖然Excel在資料庫上功能不強, 但其簡易的使用性與普及性, 反而使得一般人進入資料庫應用變得容易, 而且操作資料庫的基礎工具, 在Excel中都有, 因此選擇Excel做為資料庫系統, 對一般人是一項不錯的選擇.

但不管你選用什麼工具, 資料庫的基本關念都是一樣的, 就是有效率的建立收集統計資料, 以產生有用的資訊.

在開始一個資料庫系統前, 當然已經有了一個主題, 例如上述的學校管理, 或是士農工商都會有的庫存管理, 人員管理. 然後針對管理主題, 開始列出必要的相關資料, 規劃資料表格, 建立資料表, 收集輸入持續產生的資料.

以本站分享的系統為例, 主題是貨品的買進, 加工, 銷售, 盤點的管理, 包含數量, 金額, 時間及未來變化情況的掌握. 所以是以貨品為中心的管理系統. 需要有貨品表, 買進, 銷售記錄表, 加工的庫存異動調整表, 庫存月結表等等.

資料表在設計時, 有一個很重要的觀念就是唯一性, 例如, 姓名會重複, 但身份證號, 學號不能重複, 這不能重複的欄位, 就可以做為唯一性的指標, 避免找錯人. 還有另一種唯一性, 它的達成是由幾個欄位組成的. 例如月考成績表, 唯一性是由學生+日期+科目的組合來達成的.

在Access中, 設了唯一性的欄位, 若輸入相同的資料時會出現錯誤訊息而無法完成, 保證了資料的唯一性, 但在Excel中, 如果要達成唯一性這個功能, 就要另外用寫巨集程式去檢查. 這種防呆的工作會讓系統變得有點笨重, 所以使用者要學著了解, 自我進行檢查.

例如不同的東西不該有相同貨號, 同一種東西因為包裝, 顏色而有不同貨號倒是可以的. 像同一種泡麵, 有袋裝, 碗裝, 5包裝, 箱裝的, 都可以給不同的貨號, 重點是貨號的唯一性.

另外, 資料表的設計, 需要有精簡的概念. 所謂的精簡, 是指有絕對相關性的資料才放在同一個表格. 例如進貨表格, 只需記錄跟那個廠商在何時買了多少量的什麼東西, 而不必記錄廠商的電話號碼. 若在進貨表格中記錄電話號碼, 你會看到電話號碼一直重複跟隨廠商出現, 形成多餘的浪費. 廠商的電話號碼只需記錄在廠商表中, 經由連結或查詢就可以找到了, 不必一直重複記錄.

唯一與精簡是設計資料庫每一個表格的要項, 掌握了, 就掌握了資料庫的核心了.

設計好了各個資料表格, 在Excel 中是以工作表來表現的, 工作表的名稱就是表格名稱, 寫在第一列的就是欄位名稱, 原則上, 欄位名稱都要不一樣, 這樣查詢時才能明確知道查那一欄資料. 表格與欄位名稱關係到資料的運作, 一但設定了, 儘量不要改, 否則巨集程式也要跟著改, 會很麻煩, 且易出錯. 因為這些東西都直接與使用者會接觸到, 所以使用者也要了解, 不要隨意更改. 當然, 你也可以用保護工作表的方式保護起來.

現在可以開始填入資料了.

有了資料, 資料的運用變成資訊才是重點, 否則收集資料是沒有用的. 這個資料的運用會因每一個企業, 個人而有不同, 這個不同的運用, 就形成了企業原則. 一般系統的設計, 使用者不會直接看到資料庫, 只會看到資料輸入, 查詢, 修改/刪除的畫面, 這個畫面會有一些按鈕, 使用者按了按鈕, 按鈕就會啟動對應的企業原則, 或是更新相關的資料庫, 或是產生報表.

 這些資料庫, 企業原則, 操作畫面, 就形成了管理系統的三個層面. 在網路的環境, 可以把這系統放在不同的電腦中, 例如資料庫與企業原則放在一台伺服器上, 操作畫面就放在各個有需求的電腦上再連到伺服器作資料作業. 當然依系統大小, 可能資料庫很多台, 企業原則又獨立一台伺服器.

Excel也有做畫面的工具, 只是能用的工具很少. Excel工作表其實也具有畫面的工能, 資料的輸入, 查詢, 修改, 刪除功能都有了, 也具有一些可以在工作表使用的畫面工具, 只是之前說過了, 彈性非常大, 安全性低些. 但這是使用者要小心的, 熟悉了, 也沒有太大的問題. 所以工作表除了作為資料表格, 也可以用來作為資料操作的介面. 當然在Excel也可以把表格與資料操作分開, 但這好像違背了選用Excel簡單的初衷了. 因此用Excel來做管理系統, 就是把資料庫, 企業原則, 操作畫面集中在一起, 甚至是一個檔案中.


2014年9月11日 星期四

工作自動化要角: 變數與迴圈

  了解了如何操縱EXCEL活頁簿內工作表及儲存格的物件, 就可以用巨集把要填的資料寫好, 重複執行, 節省時間. 這是工作自動化的第一階段, 重覆執行. 例如在活頁簿workbook的程式區段寫

Sub WirteNo()
    Cells(1, 1) = "編號"
    Cells(2, 1) = 1
    Cells(3, 1) = 2
    Cells(4, 1) = 3
    Cells(5, 1) = 4
    Cells(6, 1) = 5
End Sub

然後分別在sheet1 ~ sheet10執行巨集 WriteNo, 則每個工作表的A欄都會變成如下圖


你在重覆執行的過程, 可能會有很多想法跑出來, 例如

這個工作用自動填滿, 複製/貼上就可以了, 可能還快些!
如果要填到100, 甚至到1000, 那一開始的程式撰寫不是把手給打字打斷了嗎?
如果有一百張工作表, 重複100次巨集執行也很煩, 這不能自動執行嗎?

這些問題, 就讓我們的自動化的技巧進入第二階段了, 變數與迴圈.

首先說明一下變數. 變數就是跟VBA申請一個儲存位置, 這個儲存位置可以存入不同的數值. 當然, 這個儲存位置必須有一個名字, 以便跟別的儲存位置作區別. 這些儲存位置及其名稱就是變數. 申請的方式如下

Dim 變數名稱 As 資料型態

變數名稱你可以英數中組合來命名, 但第一個字不能為數字, 一般會以資料型態當啟始加上有意義的英文字, 例如整數資料的指標 iIndex, i 是 integer , Index是指標. 所以宣告寫成

Dim iIndex As Integer

但常用 Dim i As Integer 來簡化, 因為可能同時有好幾個指標變數, 就簡化成 i, j, k, l, m, n了. 而資料型態除了整數, 常用的還有文字, String, 等等, 詳細內容請自行參閱VBA說明, 例如查詢 Dim, 然後連結到各相關的說明來增強基本知識, 能力.

現在你可以在程式區段寫入

Dim i As Integer

i=1
Cells(i,1)=i

這相當於

Cells(1,1)=1, 

就是告訴電腦把i用1取代. 如果 i=2, Cells(i,1)=i就變成了 Cells(2,1)=2. 你可能會想, 需要的程式是Cells(2,1)=1, Cells(3,1)=2, 而且用三行取代一行, 好像變複雜了. 

先來解決第一個問題, 把Cells(i,1)=i改成 Cells(i+1,1)=i 就可以了. 也就是說變數在程式碼中是可以做各種數學運算的. 程式編譯(解讀)器會先把運算做完再執行填入動作.

然後我們要進入迴圈的說明, 來解決第二個程式簡化的問題.

首先說明 For - Next 迴圈, 寫法是

For 變數 = 起始值 to 結束值 step 變化值
  程式碼
Next

意思是說, 請VBA把變數從起始值開始, 每次調整變化值一直到結束值, 每調整一次, 就把程式碼執行一次. 導入上面的例子, 填寫1 ~5, 我們的For - Next寫成

For i = 1 to 5 step 1
Next

程式碼的部份就是Cells(i+1,1)=i, 把兩者組合起來

For i = 1 to 5 step 1
  Cells(i+1,1)=i
Next

意思是執行5次 Cells(i+1,1)=i, 其中i 會是 1,2,3,4,5. 這隱含了 i 會自動加1的功能. 如果是 step 2, 就會自動加2了, 而i只會是1,3,5. 當是step 1時, 是可以省略不寫的.

這樣, 程式碼原本5行就變成了3行了. 把全部重新整理一下, 就成了

Sub WirteNo()
 Dim i As Integer

    Cells(1, 1) = "編號"
    For i = 1 to 5 step 1
  Cells(i+1,1)=i
 Next
End Sub

如果要做到1000, 就把5改成1000就好了, 這樣效果就來了吧!

其他的迴圈還有For Each - Next,  Do - Loop. 請自行詳細參考VBA說明.

在做迴圈時要注意不要變成了無窮迴圈, 也就是離不開迴圈而造成當機現象, 這時就必須強制中斷, 可能造成資料損失, 程式碼無儲存結果. 一個解救方式是在迴圈中加入 DoEvents 陳述式, 讓程式暫時停止, 去看看有沒有插入的命令, 如停止命令.

一般For - Next已經設了上下限值, 比較不會出現無窮迴圈的現象, 但還是有可能, 例如在自動加1的迴圈中先行減1, 如下

For i = 1 to 5
 i=i-1
Next

這樣 i在每次迴圈時會永遠是1, 就沒完沒了了. 而 Do - Loop 必須配合 While,  Until 關鍵字 或 Exit Do 陳述式來控制跳出迴圈. 而Exit Do還要另外配合 If - Then - Else 或 Select Case 等陳述式做判斷.

有很多時候都是要判斷各種情況才能決定下一個步驟要做什麼, 例如上述 For 迴圈, 如果i > 5的時候就跳出迴圈. 但這個判斷是屬於 For - Next 的一部份. 平常程序中的判斷就用 If - Then - Else, 當一個運算式有多種值的判斷時, 就用 Select Case.

例如一個活動的報名表, 如下

  A  B  C  D
1編號    姓名 姓別    出席
2 1 陳大 先生  V
3 2 梁二 女士  V
4 3 張三 先生  X
5 4 李四 女士  V
6 5 王五 先生  X

要向出席的人員打招呼, 在螢幕中秀出早安可以這樣寫

Sub GoodMorning()
    Dim i As Integer

    For i = 2 To 6
        If Cells(i, 4) = "V" Then
            MsgBox "早安! " & Cells(i, 2) & Cells(i, 3)
        End If
    Next
End Sub

其中用For 從第二行到第六行進行掃瞄, 用If判斷出席欄是否打"V", 有出席就用 Msgbox 秀出打招呼, 共有三個人, 例如

早安! 陳大先生

程式中 "&" 的功能提把文字串連起來, 是文字運算子.

我們還有一個問題, 就是每一頁A欄都要自動填入編號1到5, 而不用重複換頁並執行WriteNo巨集, 這要怎做? 很簡單, 就用巢狀迴圈, 如下

Sub WirteNo()
 Dim i As Integer
 Dim j As Integer

    For j = 1 to 10
        Sheets(j).Cells(1, 1) = "編號"
        For i = 1 to 5
      Sheets(j).Cells(i+1,1)=i
     Next
    Next
End Sub

在執行前, 要先確保有10個工作表哦. 我們用了j變數來控制工作表的轉變, 同時明確指出是那一個工作表的儲存格要填入資料. 這樣就可以看出效率來了.

巢狀寫法可以任意組合, 只要確保一組陳述式是包在另一組陳述式裡面而不是交叉即可. 例如以下的交叉寫法

    Dim i As Integer
 
    For i = 1 To 10
        Do
            Msgbox i
    Next
        Loop Until i > 5

就會造成邏輯不明的情況, 是錯誤的.

另外在變數的部份, 有時候會因為打字錯誤不自知, 造成程式結果錯誤而又不容易查出來的狀況, 這時候可以在程式區段的最上方輸入

Option Explicit

請VBA自動幫我們檢查, 沒有用 Dim宣告的變數都不可以出現在程式中.

只是你遇到的問題一定會比上面的例子還要複雜, 你得用這些工具來分解對應你的問題並用程序把它們組合起來, 這就需要你自行多多練習, 並加強邏輯觀念了.

學會了使用變數, 迴圈, 還有判斷式, 對工作自動化就能事半功倍了, 文中提到但沒有示範的部份, 請一定要自行參考說明, 並加以練習以提昇自己的功力.


開始用巨集來操縱EXCEL的物件

現代的程式撰寫主要是以物件導向, 事件驅動的觀念來作. 物件導向是指用程式來摸擬我們的物質世界, 例如一個人. 物件有屬性, 例如人的身高, 體重; 物件有功能或稱為方法, 例如人會工作. 我們可以用程式模擬建造一個人的物件, 它有身高與體重的屬性及工作的方法. 事件驅動是指程式的執行是由發生了一件事才開始, 例如按了滑鼠一下. EXCEL也是由這個觀念建造的, 所以我們也必需學習EXCEL中的物件及事件.
 EXCEL的工作畫面主要是填滿儲存格的工作表, 我們在儲存格內可以任意填入各種鍵盤打的出來的文字組合. 接下來我們要用程式在儲存格內填入文字來摸擬輸入, 透過這個例子來熟悉常用的物件的關係.

請建立一個巨集, 執行以下的程式:

Cells(1,1)=”Hi, 我的EXCEL物件程式

如果一切順利, 調整在sheet1A1儲存格欄寬, 會出現如下圖變化



Cells(1,1)=”Hi, 我的EXCEL物件程式, Cells代表所有的儲存格, 如果要指定個別的儲存格,  要在Cells的後面要加上(列序, 欄序)來指定, 本範例是(1,1), 代表A1儲存格. 程式碼中的=”Hi, 我的EXCEL物件程式”, 是告訴EXCEL Cells(1,1)中填入””內的文字, 如果要填入數字, 就不必使用””號了. = 號在程式中有兩個意思, 在這邊是指定的意思, ”Hi, 我的EXCEL物件程式指定給Cells(1,1).
        如果不順利, 請把下面的程式碼複製到sheet1的程式碼區段中, 然後再執行一次.

Sub MyObjSub()
    Cells(1, 1) = "Hi, 我的EXCEL物件程式"
End Sub

如果還不順利, 請重讀開始第一個VBA程式”.


現在請把工作表畫面轉換到sheet2, 再重新執行一次上面的巨集程式. Sheet2A1儲存格並不會出現"Hi, 我的EXCEL物件程式"這幾個字, 這是因為程式碼是在sheet1物件的程式區段中寫的

sheet2的程式區段打開, 把上述的程式碼複製到sheet2物件的程式區段, 如下圖


VBE中直接執行sheet2的程式碼, 回到EXCEL, sheet2就可以得到相同的結果了

  按巨集工具打開巨集選用視窗


可以看到二個巨集, 名稱都是MyObjSub, 分別放在sheet1 sheet2. EXCEL會依指定的巨集在相關的sheet中的A1儲存格填上文字. 由此類推, 如果在sheet3中也複製程式碼, 這個巨集也會出現在上述視窗中, 執行後讓sheet3A1儲存格出現文字.

當然你會開始抱怨, 這麼麻煩, 相同的事情要一直重複的做, 跟不寫程式一樣費事. 完全正確, 但這個範例只是要說明如何操作EXCEL的主角: 儲存格(Cells), 而你的抱怨是有解的

把程式碼複製到Thisworkbook的程式碼視窗中, 其他sheet中的程式碼都刪除, 如下圖. 注意, 是刪除程式碼, 不是按右上方的[X]把視窗關閉.


回到EXCEL, 在各個sheet中把A1清乾淨, 然後讓EXCEL執行 Thisworkbook.MyObjSub巨集,


你會發現, 不管在那個sheet中執行這個巨集, A1儲存格會出現文字了

  為什麼呢? 我們先來說明EXCEL的物件結構. EXCEL主要的物件結構如下圖


最上層的物件ApplicationEXCEL環境本身. 打開EXCEL的一個檔案後就是活頁簿Workbook, 可以同時開很多檔案, 所以加上(s); Workbook是包含在EXCEL環境中, Application的子物件.一個活頁簿內有多張工作表Sheets, 所以SheetWorkbook的子物件. Sheet是由許多儲存格Cells組成, 但也可以看成是由許多列Rows或是許多欄Columns組成, 所以用了行列Range這個名稱來代表, Sheet的子物件. Cells, RowsColumns都是Range類的物件.

  我們可以用大樓來比喻說明這個觀念, Application想像成一個城市, Workbooks是城市中的一個區域, sheets是區域中的大樓, 大樓中有樓層(Range, row, column)或辦公室(Cells). 要指出某一間辦公室就用城市.區域.大樓.辦公室城市.區域.大樓.樓層.辦公室等階層的方式來定位, 每一層間用”.”號來連結區隔. EXCEL中也是同樣的方法來指出一儲存格: Application.Workbook.sheet.cell, 但因為ApplicationEXCEL本身, 一般都省略不必特別標示.

        回到我們的問題點, 為什麼上述的程式寫在ThisWorkbook區段就可以適用在所有的Sheet, 而寫在Sheet區段中就只適用在自己呢? 這是因為ThisWorkbook包含多個sheet, 在沒有指明的情況下, EXCEL會自動以作用中的sheet為對象來執行程式. EXCEL這個自動的方式有好處也有壞處, 好處是節省寫程式的時間跟彈性大, 壞處是容易出錯, 怕會覆蓋了其他的資料而不易查覺. 以實際的經驗來說, 建議要明確的指出變更要作用在那個工作表中, 而不要利用EXCEL的這個自動功能.

所以, 如果只跟某個sheet有關的程式碼, 可以寫在該sheet的程式視窗中, 如果跟整個Workbook有關的程式碼, 就可以寫在ThisWorkbook的程式視窗中

另外還有一個地方也可以寫程式碼 : 模組. VBA功能列, 按插入à模組


在專案總管的視窗中會出現模組物件, 並打開程式視窗.


一般模組會寫一些各個sheet程序會呼叫的副程式或函數. 另外, 用錄製巨集所得到的程式碼也會出現在這裡, 原因無他, 預設是這些程式碼是要各個sheet都適用的. 

  了解了Excel的物件結構, 想要在那裡填入什麼資料就很容易了. 例如在任何程式區段中執行

sheet1.cells(1,1)="Hi, 你好嗎?"
sheet2.cells(2,1)=4

明確指定了工作表, 不管巨集在寫在那, 都不會產生問題了. 

  但要明確的指定工作表, 首先要了解Excel的工作表名稱規則. 在VBE的左邊上方的專案視窗中收集了這個活頁簿中所有的物件, 如下圖


可以看到有一個活頁簿及3個工作表. 活頁簿的名稱為ThisWorkbook, 第一個工作表的名稱為sheet1(sheet1), 以下第二, 第三類似, 是Excel預設的. 你會覺得奇怪, 為什麼要多"(sheet1)"? 其實刮號外的sheet1是工作表的真實名稱, 是供巨集程式辨識用的, 而刮號裡的sheet1是我們在工作表頁籤中重新命名時所改變的, 可以想作是這工作表的別名. 這兩個名稱都可以修改, 只是刮號外的真實名稱只能在VBE中修改, 修改的位置在專案視窗下方的屬性視窗. 在專案視窗中選取sheet1, 會看到如下圖


你可以看到有一個(Name) 及 Name, 就是改名稱的地方, 只是跟專案視窗中的剛好相反, (Name)是修改真實名稱, 而Name是修改頁籤名稱(別名)的地方. 把(Name) 右邊的"sheet1"改成 "Test" , 而Name 右邊的"sheet1"改成"測試頁" 就可以了解了. 因為專案視窗會依名稱排序, 所以改過的Test會出現到第三個位置, 如下圖.



  這兩種名稱都可以用來指定工作表, 但寫法不同. 例如要show出Test工作表的名稱, 可以這樣寫

直接指名法 : Msgbox Test.Name 或
集合指名法1 : Msgbox Sheets("測試頁").Name

都會出現相同的"測試頁"的訊息視窗. 集合指名法還有另一個方法是指出集合中的順序, 如

集合指名法2 : Msgbox Sheets(1).Name

順序是依工作表中從左到右的順序為準, 注意, 不是專案視窗中物件的順序. 另外, 集合指名法中的物件集合 Sheets 也可以寫成 Worksheets, 它有兩個名稱, 大概是VBA前後版相容性的結果吧.

  一般程式中大都用直接指名法, 因為只有一個名稱, 真實名稱, 是程式設計師所設定的名稱. 但在VBA的巨集中反而使用集合指名法會多一些, 因為我們會較熟悉工作表的別名, 且在工作自動化的過程中, 可能會用到順序指名, 而在VBA中把物件的陣列功能拿掉了, 就喪失了自動化的能力了.

2014年7月11日 星期五

開始第一個VBA程式

大部份的程式入門教學, 都會以一個視窗秀出 Hello World作為第一個程式的撰寫. 我們沿襲這個傳統但稍加修改來開始我們的第一個VBA程式.

在剛才打開的程式撰寫視窗中游標的位置輸入

sub My1stSub

後按下[enter], 會看到如下的畫面


系統自動把sub 變成 Sub, 隔了一行後, 又自動的加上了 End Sub; My1stSub的後面也自動加上了括號(). 這個

Sub 巨集名稱()
End Sub

是巨集頭尾的標準格式, 所以VBE自動幫忙完成了. 其實巨集是一個可以被呼叫的副程式, 所以用Sub做開頭來標示, 意指Subroutine. 後面的巨集名稱是可以指定的, 通常設定成有意義的字串, My1stSub (我的第一個副程式), 但開頭不能是數字. 結尾用End Sub來標示這個副程式的結束. 程式碼就寫在這兩行的中間.

接下來在游標處按下[tab], 游標會跳過4個字的寬度, 然後輸入

Msgbox ”Hi, 我的第一個巨集程式

整個程式看起來如下圖



按下[tab]鍵讓游標跳過4個字的寬度的目的是讓整個程式碼容易閱讀, 稱為縮排, 可以在編輯工具列中找到相同功能的工具. Msgbox 是讓EXCEL秀出一個訊息視窗的指令, 後面接著用雙引號刮起來的文字, 就是要秀出來的訊息.

        怎麼讓EXCEL執行這段程式呢? VBE環境中, 首先把游標用滑鼠移動到要執行的Sub區段中的任何位置, 如本例的My1stSub, 然後按功能表[執行]或工具列的[u]工具或鍵盤[F5]都可以啟動執行.




執行的結果如下圖示, EXCEL會出現一個視窗, 顯示剛才所設定的訊息文字, 等著使用者按[確定]來結束這個Msgbox指令. 注意, 使用者一定要回應, EXCEL才會繼續下一個動作.


Msgbox 作為我們的第一個程式, 只是一個顯示訊息的介面. 在稍後的資料庫程式中, 也會運用來作為跟使用者溝通的介面.

        EXCEL環境中也可以來執行巨集. 回到EXCEL環境, [開發人員]工能表或[檢視]功能表按下[巨集]工具, 會出現巨集選取視窗, 如下圖


只有一個巨集: Sheet1.My1stSub, 系統已經自動選取, 按下[執行], 會得到跟上面相同的結果. 奇怪的是巨集名稱為何在My1stSub前面多了一個Sheet1.? 因為我們剛才是在Sheet1的程式區段內寫下My1stSub巨集, 所以My1stSub是屬於Sheet1的子程式, 為了標示並區分來自Sheet1My1stSub, 所以在My1stSub前面加了一個Sheet1, 並用”.”來分隔 Sheet1My1stSub的從屬關係.


在開始下一個階段前, 建議你自己多練習幾次, 直到你記得了SubMsgbox.