16
2014-01-29 EXCEL ADVANCE & VBA Course 3

Excel vba note 3 presentation

Embed Size (px)

DESCRIPTION

教授vba 課程的第三課 :)

Citation preview

Page 1: Excel vba note 3 presentation

2014-01-29

EXCEL ADVANCE & VBACourse 3

Page 2: Excel vba note 3 presentation

“別放了放假. ( 2 / 5 )”

–Hika Iao

Page 3: Excel vba note 3 presentation

!

迴圈- For Next 陳述式 !迴圈作⽤用主要⽤用於重覆動作,是⼗十分常⽤用的陳述式,⽽而可借的運⽤用的迴圈陳述式有For..Next, Do..While...等等,同時迴圈中也常加⼊入流程控制的陳述式以作判斷

For <迴圈變數> = <初值> To <終值> [Step 步⻑⾧長] <程式…> [Exit For] <程式…> Next [迴圈變數]

可省略,預設為 1

可省略

可省略,代表退出迴圈

Page 4: Excel vba note 3 presentation

For i = 1 To 10 Step 1 Debug.Print i Next i

For i = 1 To 10 Debug.Print i Next

Example 1

Example 1 簡式寫法,在⼀一般不聲明的情怳下

Page 5: Excel vba note 3 presentation

練習 1

練習 2

Page 6: Excel vba note 3 presentation

迴圈- Do While , Do Until

Do [While 邏輯運算式] <程式…> [Exit Do] <程式…> Loop

迴圈條件,當為 True 時運⾏行內裡的程式,否則就退出此迴圈,運⾏行Loop 后的程式,while 關鍵

字可省略

類似For 中的Next,回到do 語句處再進⾏行判斷

可省略

Sub do_while_ex2() Dim singular_string As String, plural_string As String, i As Integer singular_string = "I am Singular" plural_string = "I am Plural" i = 1 Do while Cells(i,1) <> "" If i Mod 2 = 1 Then Cells(i, 1) = singular_string ElseIf i Mod 2 = 0 Then Cells(i, 1) = plural_string End If i = i +1 Loop End Sub

判斷儲存格不為空時運⾏行迴圈內的程式

定義初始值為 1

變數於運⾏行⼀一⾏行為加⼀一,在此意即下個迴圈會是下⼀一個格⼦子

運⾏行到此即會返回到Do 處

以下是上節中 ex2,現將她原For 改寫成 Do while 語句

當不能確定迴圈變數的終值時可以採⽤用DO WHILE 迴圈

Page 7: Excel vba note 3 presentation

Do <程式…> [Exit Do] <程式…> Loop [While 邏輯運算式]

另外 判斷的運算式也可以放在結尾,如此的話會⾄至少運⾏行⼀一次再作判斷需要再運⾏行与否

Page 8: Excel vba note 3 presentation

Do [Until 邏輯運算式] <程式…> [Exit Do] <程式…> Loop

迴圈條件,与while 相反,語意為直⾄至。。為真時停⽌止,當為 False 時運⾏行內裡的程式,否則就退出此迴圈,

運⾏行Loop 后的程式,Until 關鍵字可省略

Do <程式…> [Exit Do] <程式…> Loop [Until 邏輯運算式]

如同Do while 也可以在結尾作判斷,即迴圈會⾄至少運⾏行⼀一次

Page 9: Excel vba note 3 presentation

試將 For 章節中 的練習⼀一 改寫成 Do while 及 Do until 語句 !!如若不想將單數的空格顯⽰示已定義的字串該如何改寫?試以 For 中的 ex 1 以 ex 2 作改寫!!

綜合練習!!1.請⽤用學過的知識計算出(overall_ex_course3.xlsm) 中 “綜合練習⼀一” ⼯工作表中儲存格內的平

均分數,并將分數少於60作標⽰示,且如若儲存格有留空則以紅⽰示顯⽰示為“缺席”,最後要求設定按鈕以作運⾏行程式,試以⾄至少2種⽅方式撰寫此題⺫⽬目。!

!2.利⽤用綜合練習2⼯工作表,完成如1題中的任務!!

進階練習!!1.續綜合練習2,現時⽼老師想對學⽣生操⾏行為C 以下(C或D) 或 有缺考 或 有兩科成績不合格 作

提⽰示,以便找出需要⾒見家⻑⾧長的學⽣生,試根據以上條件作判斷,找出需要⾒見家⻑⾧長的學⽣生,并在該學⽣生的名字上填充紅⾊色。(提⽰示:填充紅⾊色 Cells(i, i).Interior.Color = 255)!

!2.續進階練習1,將需要招⾒見家的學⽣生的名字以及原因填充⾄至下⽅方空間處。

Page 10: Excel vba note 3 presentation

陣列

維他奶 (2)

!!若想取出⼀一排維他奶中的第⼆二盒維他奶可以這些表⽰示:!!!!!!!陣列可以很⽅方便把同類變數作歸類,如可定義⼀一陣列變數然后把全部學⽣生名字都放進去。!也可以利⽤用索引號去找出內裡的變數。!

陣列其實也是變數,⼀一個可以集合多個同類型的變數集合!!以上 5 盒維他奶就是 5 個變數,因為5個都是維他奶可看成是同⼀一個變數,⽽而他們同在⼀一個“陣列“上,這裡我⽤用“維他奶“作為名稱,“維他奶“就是陣列名,⽽而這裡有五個變數在這個陣列上。

Page 11: Excel vba note 3 presentation

那麼在vb 中⼜又是如何定義陣列以及放置變數呢?

Public | Dim 陣列名稱 (a to b ) As 資料類型

Dim 維他奶 ( 1 to 5 ) As String 維他奶 (1) = " 維他⼀一號" 維他奶 (2) = " 維他⼆二號” 維他奶 (3) = " 維他三號” 維他奶 (4) = " 維他四號” 維他奶 (5) = " 維他五號"

給陣列第⼀一個元素賦值,因該陣列是字串,可以給字串值 " 維他⼀一號"

Public | Dim 陣列名稱 (n) As 資料類型

or!

or

Page 12: Excel vba note 3 presentation

陣列也可以是多維的,如⼀一貨架有三層,分別放上了⼀一排維他奶,每⼀一排各五盒,那麼會是這様:!

第⼀一層

第⼆二層

第三層

如若客上要第⼆二層第四盒維他奶的話,在vb應該是這様表⽰示

維他奶 (2,4)

Dim 維他奶 ( 1to 3, 1 to 5 ) As String 維他奶 (1,1) = " 第⼀一層維他⼀一號" 維他奶 (1,2) = " 第⼀一層維他⼆二號” 維他奶 (1,3) = " 第⼀一層維他三號” 維他奶 (1,4) = " 第⼀一層維他四號” 維他奶 (1,5) = " 第⼀一層維他五號"

Example

其實只要有需要,陣列可以發展成三維,四維以及五維或以上都可以!

Page 13: Excel vba note 3 presentation

動態陣列!!如若無法確定陣列將會有多少個同類元素,可以以在⾸首次定義時將括號內的數字留空,之后再重定義陣列的⼤大⼩小。以下為⼀一實際例⼦子:

Sub dtsz() Dim arr() As string Dim n as Long n = Application.WorkSheetFunction.CountA(Range(“A:A”) ReDim arr(1 to n) As String End Sub

定義陣列

計算A列中有多少個⾮非空集合

重新定義陣列的⼤大⼩小 (定義時參數不能是變數,但重定義是可以)

Page 14: Excel vba note 3 presentation

多種創建陣列的⽅方式

使⽤用Array function

Dim arr As Variant arr = Array (1,2,3,4,5) Debug.print “陣列中第⼆二個元素為:”& arr (1)

使⽤用此⽅方式必須是Variant

⽤用逗號作區隔

1. 使⽤用Split function

使⽤用Split function

Dim arr As Variant arr = Split (“李⼩小明,李⼤大明”, “,”) Debug.print “陣列中第⼆二個元素為:”& arr (1)

使⽤用此⽅方式必須是Variant

設定以逗號作區隔,第⼀一個參數必須是字串,第⼆二個參數為設以何種⽅方式區隔,這裡區分出

來都是字串

Dim arr As Variant arr = Split (“李⼩小明 |李⼤大明”, “|”) Debug.print “陣列中第⼆二個元素為:”& arr (1)

以| 作區隔

Page 15: Excel vba note 3 presentation

利⽤用 Range 物件 讀取 或寫⼊入⾄至陣列

Dim arr As Variant arr = Range(“A1:C3”) Range(“E1:G3”).Value = arr

讀取該區域之值

使⽤用此⽅方式必須是Variant

賦值

Page 16: Excel vba note 3 presentation

其他常⽤用function

UBound(arr) LBound(arr)

UBound(arr) 可以得出該陣列之最⼤大索引數 LBound(arr) 可以得出該陣列之最⼩小索引數

以上兩個function 皆可以加⼊入第⼆二參數以得出相對應的維數下的索引數:

UBound(arr,1) 可以得出該陣列第⼀一維之最⼤大索引數 UBound(arr,2) 可以得出該陣列第⼆二維之最⼤大索引數 LBound(arr,1) 可以得出該陣列第⼀一維之最⼩小索引數 LBound(arr,2) 可以得出該陣列第⼆二維之最⼩小索引數

Join(arr,arg)

Dim arr As Variant arr = Array (1,2,3,4,5) text = Join(arr, “@”) Debug.print text

后⽅方的參數表⽰示⽤用什麼字串把他們連結起來,你可以直接””也可以

1@2@3@4@5