500 likes | 845 Views
VBA. 3-1 認識 VBA 及其應用. Visual Basic for Application 又稱 VBA ,是一種程式語言,可隨著不同的應用軟體透過對應的語法來設計,從 Office2000 開始, Office 間應用軟體的 VBA 即可互通了 。 VBA 應用很廣,小則應用它來設計一個 Word 沒提供的 函數, 本書此章節的目的,是要讓使用者對 Word 的 VBA 有一初步概念。. 3-2 VBA 程式語言基本結構. VBA 是一種物件導向程式語言,跟一般語言一樣,其基本架構為 Sub 函數或程序名稱 () ‘ 定義 ( 宣告 ) 函數或程序
E N D
3-1 認識VBA及其應用 • Visual Basic for Application又稱VBA,是一種程式語言,可隨著不同的應用軟體透過對應的語法來設計,從Office2000開始,Office間應用軟體的VBA即可互通了 。 • VBA應用很廣,小則應用它來設計一個Word沒提供的函數,本書此章節的目的,是要讓使用者對Word的VBA有一初步概念。
3-2 VBA程式語言基本結構 • VBA是一種物件導向程式語言,跟一般語言一樣,其基本架構為 • Sub 函數或程序名稱() ‘定義(宣告)函數或程序 • 宣告1 • 宣告2 • ..... • 陳述式1 • 陳述式2 • ..... • End Sub
VBA程式語言基本結構-續 • VBA的程式碼是由許多陳述式集合而成,包含宣告其實也是一種陳述式,陳述式會執行VBA的動作,每一個正確的指令,都會產生對應的動作,例如引發物件啟動、計算或結束程式等。 • 陳述式約分為4類:(1)宣告陳述式(2)指定陳述式及設定物件屬性(3)條件及迴圈陳述式(4)執行物件的方法。 • 剛開始時,我們可藉由前一章所錄的巨集產生的VBA成式碼來學習各種用法,對初學者效果不錯哦! • 先看一個例子感受一下!下面的 Sub 程序當文件開啟時會詢問今日日期若錯誤則離開此應用程式(Word) • Sub Document_Open() • IF InputBox(“請輸入今日日期”) = Day(Now()) Then • MsgBox “歡迎使用此文件” • Else • Application.Quit • End If • End Sub
VBA操作環境 • Word提供了一個很好的VBA操作環境,來讓我們寫程式,我們現在就來看看! • Step1:執行[工具/巨集/Visual Basic編輯器]或按「Alt+F11」快速鍵。
VBA操作環境-續 • Step2:進入VBA操作環境視窗後,會看到左上方的「專案視窗」,左下的「屬性視窗」,以及右邊的「程式視窗」,這時你可以透過「視窗工作列」切換到Word環境或再切換到VBA環境,也可以透過檢視把其他工具列叫出來。
VBA操作環境-續 • Step3:在[專案視窗]上,選取專案名稱(預設為VB Project),按右鍵,叫出快顯功能表,選擇此專案的屬性。
VBA操作環境-續 • Step4:開啟[專案屬性]交談窗,將專案名稱改成「star」(原為Projecct),也可以用密碼保護我們的專案,不讓別人看到專案內容,如程式。
VBA操作環境-續 • Step5:VBA的物件導向式語法,有非常多的方法及屬性,其中各有不同的參數,不用強記,可以在屬性或方法的字上(例如RGB)按右鍵,叫出快顯功能表,選擇「列出屬性或方法」。
VBA操作環境-續 • Step6:就可直接跳到最接近的屬性或方法項下,按一下,就會出現相關的線上說明,可以複製說明檔上面的程式,直接拿過來用哦!
VBA操作環境-續 • Step7:輸入方法或屬性時,若有參數,輸入「(」時會出現參數指引說明。
VBA操作環境-續 • Step8:輸入程式時請用小寫英文即可,它會自動幫你轉成大小寫,以及用顏色區分,藍色為VBA與法的保留字或關鍵字,不可拼錯,黑色為程式的變數、宣告或陳述,而綠色則是註解。如果我輸入「if x1=40」 按[Enter]鍵,立刻會告訴你錯誤訊息,並告訴你怎麼做,而且用紅色的字標示出錯誤的那一列,是不是很方便,剛開始只要沒出現紅色的字,表示程式沒有大錯,就可以執行了。
VBA操作環境-續 • Step9:我們先來看一個設定字型格式變化的程序,都在每一行後面有說明註解(註解以’為開始)。
VBA基本結構-程序或函數 • 一般我們用VBA最多的就是程序或函數了,程序是一連串可執行的指令結合在一起,例如前一章所錄製的巨集,主要目的是讓多個重複的動作在一起執行,減少我們操作的時間;而函數則是根據使用者傳入的參數,做一些運算後傳回一個結果的值。 • Step1:執行[插入/程序]。 • Step2:在[新增程式]交談窗,輸入名稱為「leapyear」,型態為「Sub」表示為一個「程序」程式。 • Step3:按確定後,自動在程式視窗加入了一段定義程序的宣告與結束指令,我們可以開始依據需要在這個程序中間加入我們需要的程式指令了!
VBA基本結構-程序或函數 • Step4:假設寫好了,想試試看如何執行,這裡我們以上一節改變字型格式的程序「font20b」來示範,到Word中,選取一段文字,按「Alt+F8」,開啟巨集交談窗,選取一個巨集名稱來[執行]。 • Step5:若沒有錯誤,就可以看到程式執行的結果。
VBA基本結構-程序或函數 • Step6:現在我們在來看看「函數」程式是怎麼做跟怎麼執行的?在[新增程式]交談窗,輸入名稱為「leapyear1」,型態為「Function」表示為一個「函數」程式。在同一模組下,程序或函數名稱都不可重複。 • Step7:按確定後,一樣自動在程式視窗加入了一段定義函數的宣告與結束指令,所不同的是程序的關鍵字是Sub,而函數是Function,同樣都以End來結束程式。 • Step8:雖然透過[插入/程序]產生了一小小段程式,我們還是可以在程式視窗直接修改它哦!也可以直接複製一段程序或函數來修改,這裡我們就把「leapyear1」改為「slength」,我們想利用畢氏定理來計算三角形的斜邊,而無論是程序或函數都不一定要傳入參數,但宣告程序或函數後的「( )」左右括號一定要存在,在這裡我們需要三角型的兩邊,所以我們就在括號中定義了兩個傳入的參數x1及y1,資料型態都是整數。
VBA基本結構-常數、變數與資料型態 • 通常會使用 Dim陳述式來宣告變數。 • Dim 陳述式的語法為: • Dim 變數名稱 [as 資料型態] . . . ([ ]內的表示可省略) • 在 Dim 陳述式的語法中,Dim 是必備的關鍵字。而唯一必備的元素是變數名稱。 • 變數可以宣告成下列資料型態中的一者:Boolean、Byte、Integer、Long、Currency、Single、Double、Date、String(可變長度字串)、String * length (固定長度字串)、Object 或 Variant。如果您未指定資料型態,則 Variant資料型態會被指定成預設型態。在宣告陳述式中,您不一定要提供變數的資料型態,若省略資料型態的則會將變數設成 Variant 型態。
常數、變數與資料型態 • 變數的命名規則: • (1)必須以字母為開頭。 • (2)不可以包含句號、關鍵字及型態宣告字元。 • (3)不能超過255個字。 • (4)如果這個陳述式出現在程序中,則此變數只可以在此程序中被使用。如果這個陳述式出現在模組中的 宣告 區段,則此變數可以被此模組中所有的程序所使用,但是不能被同一專案中不同的模組所含程序來使用。為了使變數可被專案中所有的程序所使用,則在變數名稱前加上Public陳述式。
常數、變數與資料型態 • 宣告常數 • 我們使用 Const 陳述式宣告部份常用到的文數字設為常數。例如: • ' 常數的預設狀態是 Private。 • Const MyVar = 459 • ' 宣告 Public 常數。 • Public Const MyString = "HELP" • ' 在同一行裏宣告多個常數。 • Const MyStr = "Hello", MyDouble As Double = 3.4567 • 宣告變數 • Dim x1 as Integer, y2 as Object • Sub slength()
VBA基本結構-物件式導向語法-物件 • 物件導向程式中,有四個很重要的元件,(1)物件(2)屬性(3)方法及(4)事件,而當我們把物件相關的屬性,執行的方法,引發的事件,依物件導向語法組合在一起就是所謂的指令或陳述式。 • 物件 • Word中常見的物件有按鈕、範圍、文件等等,在程式中為了使用方便,將某些同型態的物件集合在一起,稱為物件集,其關鍵字為英文的複數型態,如Tables,例如想在第c個表格的Formlength列刪除,可以這樣寫: • Set MyTable = ActiveDocument.Tables(c) • MyTable.Rows(Formlength).Delete
VBA基本結構-物件式導向語法-物件 我們可以在VBA環境的一般工具列上按瀏覽物件,可看到有相當多的物件類型。
VBA基本結構-物件式導向語法-屬性 • 屬性:各種不同的物件,各有其特定的性質,我們稱之為屬性,通常我們利用屬性來控制物件的外觀,如設定儲存格的字型、顏色等,我們常用指定陳述是來達成。 • 物件.屬性=設定值 或 變數=物件.屬性 • Step1:例如在物件Font上,按右鍵,執行快顯功能表中的[說明]。
VBA基本結構-物件式導向語法-屬性 • Step2:會開啟Font的線上說明,亦會介紹其相關的屬性、方法及事件等,樣可以複製到我們的程式視窗。
VBA基本結構-物件式導向語法-方法 • 方法 • 除了用屬性來改變物件外,還可以使用方法來要求物件做一些動作,參下圖,可以看到Tables成員中前半部的屬性都為名詞,而後半部的方法都為動詞。
VBA基本結構-物件式導向語法-事件 • 事件是指要執行或驅動某一物件執行一些動作所發出的訊息,如按一下滑鼠,按一下鍵盤或開啟文件,另外我們也可以透過我們寫的程式碼來驅動或導致某些事件的發生。如下,我們可以看物件可以有哪些事件。 • CommandButton1(按鈕)物件,有Click(按一下),DbClick(按二下)...等等事件。
程式的控制結構-使用 If...Then...Else 陳述式 • If...Then...Else 陳述式會根據條件式的值,而執行指定的陳述式或一個區塊的陳述式。If...Then...Else 陳述式可以依據您的需要而做多階層的巢狀執行。然而,為了可讀性您可能會使用 Select Case 陳述式而不使用多階層的巢狀 • If...Then...Else 語法。下列的範例展示了單行語法,並省略了 Else 關鍵字: • Sub FixDate() • myDate = #2/13/95# • If myDate < Now Then myDate = Now • End Sub
程式的控制結構-使用 If...Then...Else 陳述式 • 若要執行多行程式碼的話,您必須使用多行的語法,而此語法須包含 End If陳述式,如同下面範例所示: • Sub AlertUser(value as Long) • If value = 0 Then • AlertLabel.ForeColor = "Red" • AlertLabel.Font.Bold = True • AlertLabel.Font.Italic = True • End If • End Sub
程式的控制結構-使用 If...Then...Else 陳述式 • 當條件式為 True,執行某些陳述式;條件式為 False,執行其餘的陳述式 • 使用 If...Then...Else 陳述式可以定義兩個可執行的陳述式區塊:其中一個區塊會在條件式為True 時執行;而另一個區塊會在條件式為 False 時執行。 • Sub AlertUser(value as Long) • If value = 0 Then • AlertLabel.ForeColor = vbRed • AlertLabel.Font.Bold = True • AlertLabel.Font.Italic = True • Else • AlertLabel.Forecolor = vbBlack • AlertLabel.Font.Bold = False • AlertLabel.Font.Italic = False • End If • End Sub
程式的控制結構-使用 If...Then...Else 陳述式 • 當第一個條件式為 False 時,測試第二個條件式 • 當第一個條件式為 False 時,您可以在 If...Then...Else 陳述式中加上 ElseIf 陳述式來測試第二個條件式。舉例而言,下列的函數程序根據工作分類來計算獎金。如何所有 If 和 ElseIf 陳述式中條件式都是 False,則會執行緊接在 Else 陳述式之後的陳述式。 • Function Bonus(performance, salary) • If performance = 1 Then • Bonus = salary * 0.1 • ElseIf performance = 2 Then • Bonus = salary * 0.09 • ElseIf performance = 3 Then • Bonus = salary * 0.07 • Else • Bonus = 0 • End If • End Function
程式的控制結構-使用 Select Case 陳述式 • 將一個運算式與數個不同的值比較時,可以使用 Select Case 陳述式來取代在 If...Then...Else 陳述式中使用 ElseIf。If...Then...Else 陳述式會計算每個 ElseIf 陳述式中的運算式,而 Select Case 陳述式只會在控制結構的頂端計算一次運算式。 • 在下面的範例中,Select Case 陳述式會計算傳送給此程序的引數performance。請注意,每一個 Case 陳述式可以含有一個以上的值,一段範圍的值,或是一個組合值以及比較運算子。選擇性的 Case Else 陳述式只有在引數值無法與 Select Case 中所有的 Case 陳述式相符合時才會執行。 • Function Bonus(performance, salary) • Select Case performance • Case 1 • Bonus = salary * 0.1 • Case 2, 3 • Bonus = salary * 0.09 • Case 4 To 6 • Bonus = salary * 0.07 • Case Is > 8 • Bonus = 100 • Case Else • Bonus = 0 • End Select • End Function
程式的控制結構-使用 Do...Loop 陳述式 • 您可以使用 Do...Loop 陳述式去執行一個區塊的陳述式,而它所用掉的時間是不確定的。當條件式為 True 或直到條件式變成 True 之前,此陳述式會一直重複。 • (1)重複陳述式直到條件式為 True • 當使用 While 關鍵字去檢查 Do...Loop 陳述式中的條件式時,可以有兩種不同的方式。您可以在進入迴圈之前檢查條件式,也可以在迴圈至少執行一次之後才檢查條件式。 • 在下面的 ChkFirstWhile 程序中,是在進入迴圈之前檢查條件式。如果 將 myNum 的值由 20 替換成 9,則在迴圈中的陳述式將永遠不會執行。 在ChkLastWhile 程序中,在條件式變成 False 之前迴圈中的陳述式會一直執行。 • Sub ChkFirstWhile() • counter = 0 • myNum = 20 • Do While myNum > 10 • myNum = myNum - 1 • counter = counter + 1 • Loop • MsgBox "The loop made " & counter & " repetitions." • End Sub
程式的控制結構-使用 Do...Loop 陳述式 • (2)從 Do...Loop 陳述式中離開 • 您可以使用 Exit Do 陳述式來離開 Do...Loop 陳述式。舉例而言,為了離開無窮迴圈,可以將 Exit Do 陳述式放在 If...Then...Else 陳述式或是 Select Case 陳述式中的 True 陳述式區塊。如果條件式為 False,則迴圈會像平常一樣執行。可以按下 ESC 或 CTRL+BREAK 來終止無窮迴圈。
程式的控制結構-使用 For...Next 陳述式 • 您可以使用 For...Next 陳述式去執行一個區塊的陳述式,而它所用掉的時間是特定的。For 迴圈使用一個計數變數,當反覆的執行迴圈時它的值會增加或減少。 • 下面的程序會讓電腦發出嗶聲 50 次。For 陳述式會指定計數變數 x 的開始與結束值。Next 陳述式會將計數變數的值加 1。 • Sub Beeps() • For x = 1 To 50 • Beep • Next x • End Sub
程式的控制結構-使用 For...Next 陳述式 • 使用 Step 關鍵字,可以增加或減少計數變數的值,並且增減值可由您指定。在下面的範例中,計數變數 j 會在迴圈重複時加上 2。當迴圈結束時,total 的值為 2、4、6、8 和 10 的總合。 • Sub TwosTotal() • For j = 2 To 10 Step 2 • total = total + j • Next j • MsgBox "The total is " & total • End Sub • 為了減少計數變數的值,您可以使用負的 Step 值。在 Next 陳述式後面可以不用加上計數變數的名稱。在 For...Next 陳述式中您可以在計數變數到達它的結束值之前,使用 Exit For 陳述式來離開。舉例而言,當錯誤發生時可以將 Exit For 陳述式放在 If...Then...Else 陳述式或是 Select Case 陳述式中的 True 陳述式區塊,它是專門用來檢查此錯誤的。如果沒有錯誤發生,If...Then...Else 陳述式的值為 False,則迴圈會像預期一樣的執行。
3-3 VBA應用簡例-以程序來判斷星座 • 我們以今日日期中的「月」和「日」的資料來判斷,因為是程序,必須,輸入如下程式,並將結果已MsgBox顯示出來。 • Step1:輸入程式後,都沒有紅色警戒(錯誤語法),先存檔。
3-3 VBA應用簡例-以函數來判斷閏年 • 判斷閏年的方法如下: • 西元年,被4整除?no->不是閏年 • yes,被100整除?-no->是閏年 yes,被400整除?no->不是閏年 yes->是閏年 • Step1:如果我們關閉了程式視窗,只要在[專案視窗]上按[檢視程式碼]即可。
3-3 VBA應用簡例-以函數來判斷閏年 • Step2:插入一函數,並輸入一參數為日期型態,取參數的「年」資料,按判斷閏年的邏輯來寫出下列程式碼,跟上一題一樣,先檢查是否為有效日期。
3-3 VBA應用簡例-以表單來作表格處理 • 大型的資訊系統開發,通常是讓使用者從主選單執行的,我們就來做一個簡單的主選單。 • Step1:再VBA操作環境下,執行[插入/自訂表單]。 • Step2:在屬性視窗中,將表單的標題(caption)改成「表格處理」。
3-3 VBA應用簡例-以表單來作表格處理 • Step3:按一般工具列上之[工具箱]鈕,叫出[工具箱]工具列。
3-3 VBA應用簡例-以表單來作表格處理 • Step4:選擇[標籤]工具。
3-3 VBA應用簡例-以表單來作表格處理 • Step5:我們依序又做了 4個標籤 4個文字盒 2個按鈕
3-3 VBA應用簡例-以表單來作表格處理 • Step6:並定義了相對的事件程序
3-3 VBA應用簡例-以表單來作表格處理 • Step6:並定義了相對的事件程序
3-3 VBA應用簡例-以表單來作表格處理 • Step7:試試看,重新開啟此文件,按[啟用巨集]鈕。
作業A 請撰寫表格處理的輸入動作之程式 • 須判別列與欄輸入位置是否在範圍內 • 將表格的儲存格內容以資料來取代 • 在列與欄文字盒內填入下一筆資料輸入位置