• 沒有找到結果。

簡易流程控制

N/A
N/A
Protected

Academic year: 2021

Share "簡易流程控制"

Copied!
30
0
0

加載中.... (立即查看全文)

全文

(1)

認識 VBA...1

VBA簡介...1

模組與程序...5

VBA基本程式技巧...5

簡易流程控制...7

巨集開始...8

啟用巨集...8

設定安全性...9

製作格式巨集...10

製作填滿巨集...11

修改填滿巨集...11

間插入列巨集...12

插入指定列數巨集...12

刪除空白資料巨集...13

資料轉換 : 全部自動...13

資料清單...14

自動編號...15

表單...16

結合工具鈕...16

實際案例...17

同工作表的固定插入...17

自動選範圍...18

合併工作表...18

自訂函數 (area)...19

自訂函數 (πr2)...20

負數變正數設計[任意範圍]...20

新增多張工作表...22

工作表排序...23

自動程序設計...24

匯入檔案...24

區域號碼 : 儲存格值的控制 [ 工作表 ]...26

清除全部註解...27

取出註解...27

活頁簿控制...28

(2)

認識VBA VBA 簡介

VBA 為 Visual Basic For Application 的簡稱,在 Microsoft Office 中包括 Excel、Word、PowerPoint、Access、Visio 均提供 VBA 程式的功能。

敘述

VBA 的語法與 Visual Basic 大多數均是相同的,下列這幾行 正確的VBA 敘述

index1=1

index1=index1+1

If index1 > 10 Then

index1=10

value1=0.01:

alpha=0.85*index1 連續行

VBA 連續字元符號是底線( _ ),當程式執行到某一列是以底 線符號結尾時,他會假設有一個連續的行,並將下一行視為目前敘 述的一部份。:

Response = MsgBox("Do you want to continue ?", vbYesNo + vbCritical + vbDefaultButton2, "MsgBox Demonstration", "DEMO.HLP", Ctxt = 1000)

如果程式列包含很長的列,比較好的方法是加一空白字元和底 線符號在該行結束的地方 ,並在下一列繼續此一列敘述。如下所示 Response = MsgBox("Do you want to continue ?", vbYesNo + vbCritical + _vbDefaultButton2, "MsgBox Demonstration", "DEMO.HLP", Ctxt = 1000)

連續行的最末列的最後面不需要加上底線符號,而且底線符號 之後也不可以再加上任何文字或數字,註解也不可以。

註解

註解列可讓程式易被看懂,又如果要讓程式中的某一列不執行,

只要將這一列標示為註解即可。VBA 中的註解列符號為單引號( ' ),

若是一整列都要作為註解,也可在這列以REM 敘述開頭。

(3)

‘This is a remark demo

MyStr1 = "Hello" : Rem 將註解加在陳述式之後,用冒號隔 開。

MyStr2 = "Goodbye" ' 此亦為註解,且不需要冒號。

常數與變數

常數在程式中只包含固定的數值,您不能在程式進行中更動他,

常數以關鍵字Const 始,例如下一列將 beta 定義為常數,其值為 0.85:

Const beta=0.85

VBA 中已有預先定義了某些常數,例如在 MsgBox 函數中 vbYesNo 代表常數值 4。詳細的常數定義可在 VBA 的編輯器中取得 說明。

變數是指到程式可以儲存值的記憶體位置的代表名稱。變數與

常數不同的是變數可在程式執行期間改變其值。在VBA 中變數可有

不 同 的 內 容 型 態 , 例

如:Byte、Boolean、Integer、Long、Currency、Decimal、Single、

Double、Date、String、Object、Variant ,其中預設的變數型態是 Variant。

以下三列是變數的使用範例:

price=45 ‘數值(integer)變數 Item=”水果” ‘文字(string)變數

Set xlApp = CreateObject("excel.application") ‘物件(object)變數

Option Explicit敘述

這一敘述通知VBA 編譯器找出未宣告即使用的數數。

在預設的情況下VBA 允許變數不經宣告即可使用,但這也造

成程式除錯上的某些困難。您也可在程式的第一行使用 Option

Explicit 敘述,可強制程式在使用變數前先需宣告,這樣有避免拼 錯字母造成程式上邏輯錯誤的問題。

Dim敘述

您可以使用Dim 在程序或函數中明確的定義變數或陣列變數。

(4)

若您使用了 Option Explicit 敘述,則您;所使用的變數皆需使用 Dim 先行宣告才可使用。以下三列皆是正確的變數宣告

Dim text ‘宣告了一個變數

Dim price,Value,sum ‘同時宣告兩個以上的變數 Dim Item(100) ‘宣告了 101 個元素的陣列。

VBA 亦可使用陣列,陣列的第一個元素預設為 0,所以上述最 後一列中宣告了Item(0)至 Item(100)共計 101 個變數。

Public與Private關鍵字

Public 與 Private 關鍵字宣告變數用來限制變數的有效範圍,使 用 Public 陳述式宣告的變數,可以在所有模組裏使用 (除非使用 Option Private Module);變數有效範圍為它們所在的專案裏。

使用 Public 陳述式來宣告變數的資料型態。舉例來說,下列的 陳述式宣告一個變數為 Integer:

Public NumberOfEmployees As Integer

您也可用 Public 陳述式來宣告變數的物件型態。下列的陳述式 宣告一個變數為工作表的新執行個體。

Public X As New Worksheet

Public 陳述式無法在物件類別 模組裏宣告固定長度的字串變數。

Private 用以宣告變數只適用於宣告它們的模組中。Private 陳 述式也可以用來宣告變數的資料型態。舉例來說,下列的陳述式宣告 變數為 Integer:

Private NumberOfEmployees As Integer

您也可使用 Private 陳述式加上空白括號來宣告動態陣列。宣告 之後,在程序裏使用 ReDim 陳述式來定義陣列的維數和元素。變 數的大小已由 Private、Public 或 Dim 陳述式所明確指定,若重新 宣告陣列變數的維數,則會發生錯誤。

變數名稱

如同在Visual Basic 中一般,一個變數名稱最多可使用 255

(5)

1.變數的第一個字元需英文字母。例如 Person1 為有效變數 名,23men 則是不合規則的變數名稱。

2.變數名稱不可包含空白、點、,逗號或其他特殊字元。

3.變數名稱不可為關鍵字,例如 for、next、while、public 等 模組與程序

模組(Module):

 功能:是存放程式碼的視窗,使用:可以建立很多模組,分 別存放不同特性的程式碼,包含:在模組中可以建立各種的程序 (Procedure)、函數(Function)

程序(Procedure)與函數(Function)

程序(Procedure):呼叫這個程序後,會自動執行其內部的程式碼 Sub 程序名稱()

程式內容….

End Sub

函數(Function):在執行這個函數後,會傳回資料到主程式 Function 函數名稱(參數名稱)

程式內容…

函數名稱(參數名稱) = ……

End Function VBA 基本程式技巧

變數的宣告

Dim x as Integer

Dim str1,str2 as String Dim total as Long

Dim t_date as date

變數型態 大小 資料範圍

(6)

Byte 1 位元組 0~255 Boolean 2 位元組 True, False

Integer 整數 2 位元組 -32768~32767

Long 長整數 4 位元組 -2147483648~2147483647 Currency 貨幣 8 位元組 -922337203685477.5808 ~

922337203685477.5807

Decimal 十進位 10 位元組 沒 有 小 數 位 : +-

7922816251426433759354395 0335

有 小 數 28 位 : +-

7.92281625142643375935439 50335

Single 單 精 度 浮 點

4 位元組 -3.402823E38 ~ -1.401298E- 45

Double 倍精度浮 點

8 位元組 -1.79769313486231e308 ~ -4.94065645841247e-324

Date 日期 8 位元組 String 字串 可變動

Object 物件 4 位元組 可引用任何物件

Variant 預設 視型態而定 此具有可彈性的資料型態

使用者自訂型態 不定

運算符號 / 算數運算

加+,減-,乘*,除/,餘數 mod,指數^

a^b a mod b

邏輯運算

符號 說明 範例

And 且 X and y

Or 或 X or y

Not 否 Not x

Eqv 相等 X eqv y

Xor 互斥 X xor y

Imp 包含 X imp y

(7)

關係運算

符號 說明 範例

= 等於 X = y

<> 不等於 X <>y

< 小於 X<y

>

>=

<=

字串運算

符號 說明 範例

+ 連結 X1+x2+x3

& 連結

先轉換成字串後再連結

X1 & x2 & x3

簡易流程控制

If 條件 then 描述式 End If

If 條件 then 描述式 Else 描述式 End If Select case 運算式

Case 測試值 1 描述式 Case 測試值 2 描述式 End Select

Select case x Case 1 to 3

Str=”第一季”

Case 4 to 6

Str=”第二季”

End Select For 變數=初值 to 終值

描述式 next

Sum=0

For I= 1 to 10 step 1 Sum=sum+I

Next Do while 條件

描述式 loop

X=0

Do while x<5 X=x+1 Loop Do

描述式

X=0 Do

(8)

loop while 條件 X=x+1

Loop while x<5 Do until 條件

描述式 loop

X=0

Do until x<5 X=x+1 Loop

Do

描述式

loop until 條件

X=0 Do

X=x+1

Loop until x<5 Do

描述式 loop

X=0 Do

X=x+1 loop 巨集開始

啟用巨集

1. 選取 OFFICE【按鈕】 / EXCEL 選項【清單】

2. 選取 常用 【標籤】/ 勾選 開發人員 索引標籤【項目】

3. 按 確定【按鈕】

(9)

設定安全性

選取開發人員【索引標籤】 / 巨集安全性【項目】

設定 啟用所有巨集【項目】 / 確定【按鈕】

(10)

製作格式巨集

選取開發人員【索引標籤】 / 錄製巨集【項目】

輸入巨集名稱【如:藍色的字】

(11)

選取 確定 鈕

選取常用【索引標籤】 / 字型【項目】 / 設定色彩【如:藍色】

選取開發人員【索引標籤】 / 停止錄製【項目】

製作填滿巨集

選取有數值的任一儲存格【如:B2】

選取開發人員【索引標籤】 / 錄製新巨集【項目】

輸入巨集名稱【如:填滿】 / 選取 確定 鈕

選取常用【索引標籤】 / 填滿【清單】 / 數列【項目】

設定欄 / 設定等差級數 / 設定終止值 【如:50】 / 確定 選取開發人員【索引標籤】 / 停止錄製【項目】

修改填滿巨集

選取開發人員【索引標籤】 / 巨集【項目】

選取巨集名稱【如:填滿】 / 選取 編輯 鈕 修改程式碼

Dim x

x = Range("E2").Value

Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Step:=1, Stop:=x, Trend:=False

(12)

間插入列巨集

選取開發人員【索引標籤】 / 巨集【項目】

輸入巨集名稱【如:插入列】 / 選取 建立 鈕 Sub 插入列()

For X = ActiveCell.Row To 10 Step 2 Rows(X).Select

Selection.Insert Shift:=xlDown Next

End Sub

插入指定列數巨集

選取開發人員【索引標籤】 / 巨集【項目】

選取巨集名稱【如:插入列】 / 選取 編輯 鈕 Sub 插入列()

X1 = ActiveCell.Row

Y = InputBox("請輸入列數") * 2 + X1 For X = ActiveCell.Row To Y Step 2 Rows(X).Select

Selection.Insert Shift:=xlDown Next

End Sub

註 : Selection.Delete Shift:=xlUp 刪除 刪除空白資料巨集

選取開發人員【索引標籤】 / 巨集【項目】

輸入巨集名稱【如:插入列】 / 選取 建立 鈕

(13)

For X = 1 To 100 Step 1

If ActiveCell.Value = "" Then Selection.EntireRow.Delete Else

ActiveCell.Offset(1, 0).Select End If

Next End Sub

資料轉換 : 全部自動 Sub 全部正數() Dim z1, z2

z1 = ActiveCell.Column

Selection.End(xlToRight).Select z2 = ActiveCell.Column

Selection.End(xlToLeft).Select For z = 1 To (z2 - z1 + 1) Step 1 Call 正數

ActiveCell.Offset(0, 1).Select Next

End Sub 資料清單

Sub 清單設計()

With Selection.Validation .Delete

.Add

(14)

Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _

xlBetween, Formula1:="人事,行政,財務,總務"

.IgnoreBlank = True .InCellDropdown = True .InputTitle = ""

.ErrorTitle = ""

.InputMessage = ""

.ErrorMessage = ""

.IMEMode = xlIMEModeNoControl .ShowInput = True

.ShowError = True End With

End Sub End Sub 自動編號

Sub 自動編號() Dim x1, x2, x, y

y = ActiveCell.Address Selection.Copy

Range("A1").Select ActiveSheet.Paste

Selection.End(xlUp).Select x1 = ActiveCell.Row

Selection.End(xlDown).Select

(15)

Range(Selection, Selection.End(xlUp)).Select Selection.ClearContents

Range(y).Select

For x = 1 To (x2 - x1 + 1) Step 1 y = "." & ActiveCell.Value ActiveCell.Value = x & y ActiveCell.Offset(1, 0).Select Next

End Sub 表單

選取 開發人員【索引標籤】 / 選取 VB 編輯器 選取 插入【索引標籤】 / 選取 自訂表單【項目】

設計表單內容 / 確定 結合工具鈕

選取OFFICE【按鈕】 / EXCEL 選項【按鈕】

選取 自訂【項目】 / 巨集 【由此選擇命令】

(16)

選取 巨集命令【項目】/ 選取 新增【按鈕】 / 確定【按鈕】

實際案例

同工作表的固定插入

Sub 插入() ‘ 固定 5 列 做 10 次 Dim i

For i = 0 To 10 Step 1 x = ActiveCell.Row Rows(x + 5).Select

Selection.Insert Shift:=xlDown ActiveCell.Offset(1, 0).Select Next

End Sub 自動選範圍

(17)

合併工作表

Sub 合併工作表()

Dim mySht As Worksheet Dim myRng1 As Range Dim myRng2 As Range Dim i

Set mySht =

Worksheets.Add(After:=Sheets(Sheets.Count)) With mySht

.Name = "new" '設定表名 End With

Worksheets("new").Move AFTER:=Worksheets(Sheets.count)

Set mySht = Worksheets(1) For i = 2 To 4 Step 1

Worksheets(i).Select Range("A2").Select

Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Application.CutCopyMode = False

Selection.Copy mySht.Select

ActiveSheet.Paste Range("A1").Select

Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select Next

(18)

Worksheets(2).Select '加入標題 Rows("1:1").Select

Selection.Copy mySht.Select

Rows("1:1").Select

Selection.Insert Shift:=xlDown Range("a1").Select

End Sub

自訂函數 (area) Function area(l,w) clp=int(w*l)

End

自訂函數 (πr2) Function clp(r)

clp= Application.WorksheetFunction.Round(3.14*r*r,2) End

負數變正數設計[任意範圍]

Sub 負數變正數()

Dim myRng As Range Dim myRng2 As Range Dim mySht As Worksheet Dim x, x1, y, y1, i, j, n

Set mySht = Worksheets(1) '任意的工作表 Set myRng = mySht.UsedRange

(19)

Set myRng = ActiveCell x = ActiveCell.Row

y = ActiveCell.Column

Set myRng2 =

myRng.SpecialCells(xlCellTypeLastCell) Range(myRng2.Address).Select x1 = ActiveCell.Row

y1 = ActiveCell.Column

Range(myRng.Address).Select Set myRng = ActiveCell

ActiveCell.Select n = myRng.Address For j = 0 To (y1 - y) For i = 0 To (x1 - x)

If ActiveCell.Value < 0 Then

ActiveCell.Value = ActiveCell.Value * -1 End If

ActiveCell.Offset(1, 0).Select Next i

For i = 0 To (x1 - x)

ActiveCell.Offset(-1, 0).Select Next i

ActiveCell.Offset(0, 1).Select Next j

Set myRng = Nothing Set myRng2 = Nothing

(20)

Set mySht = Nothing End Sub

新增多張工作表 Sub 方法一() Dim x, y

x = InputBox("請輸入增加工作表的數量", "增加工作表") With Worksheets

.Add Count:=x '指定張數來新增 End With

End Sub

Sub 新增多張工作表()

Dim mySht As Worksheet Dim x, y

x = InputBox("請輸入增加工作表的數量", "增加工作表") For y = 1 To x Step 1

Set mySht =

Worksheets.Add(After:=Sheets(Sheets.Count)) With mySht

.Name = y '設定工作表名稱 End With

Next y

Set mySht = Nothing '物件的釋放 End Sub

工作表排序

Sub 排序工作表()

(21)

Dim myArray() As String Dim i As Long

ReDim myArray(1 To Worksheets.Count, 1 To 1)’工作表陣 列

For Each mySht In Worksheets

myArray(mySht.Index, 1) = mySht.Name Next

With Worksheets.Add.Range("A1").Resize(UBound(myArray), 1)

.Value = myArray .Sort _

Key1:=.Range("A1"), _ Header:=xlNo, _

Orientation:=xlTopToBottom For i = .Cells.Count To 1 Step -1

Worksheets(.Cells(i).Value).Move _ Before:=Worksheets(1)

Next

Application.DisplayAlerts = False .Parent.Delete

Application.DisplayAlerts = True End With

End Sub 自動程序設計

Sub Auto_Open()

Application.OnKey "%{F11}", "SHOW"

(22)

End Sub SUB SHOW()

RANGE(“A1”).VALUE=123 END SUB

組合鍵

組合鍵 符號 組合鍵 符號

ALT % SHIFT +

CTRL ^ ALT+F11 %{F11}

一般鍵

鍵盤 符號 鍵盤 符號 鍵盤 符號

BACKSPAC E

{bs} HOME {HOME} ENTER {ENTER}

-> {RIGHT} {LEFT} {UP} {DOWN}

F1 – F12 {F1} – {F12} ESC {ESC}

匯入檔案

Sub 匯入檔案()

Dim myCnc1 As String Dim myCnc2 As String Dim myFileName As String

myFileName = "F_Data.csv" ' 讀入檔 案

Worksheets.Add '工作表的新增 myCnc1 = "TEXT;"

myCnc2 = ThisWorkbook.Path & "\" & myFileName With

ActiveSheet.QueryTables.Add( Connection:=myCnc1 &

myCnc2,Destination:=Range("A1")) '讀入目標儲存格

.TextFilePlatform = 950 '文字碼的指 定

(23)

'格式的指定(標準)

.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)

'在欄位中指定格式時

'.TextFileColumnDataTypes = Array(2, 1, 9, 9, 9, 9, 9, 1)

.Refresh End With End Sub

區域號碼 : 儲存格值的控制 [ 工作表 ] '工作表模組

Private Sub Worksheet_Change(ByVal Target As Range) Dim x

x = Left(Target.Address, 2) If x = "$A" Then

Select Case Target.Value Case 2

Target.Value = "台北"

Case 3

Target.Value = "桃園"

Case 4

Target.Value = "台中"

Case 5

Target.Value = "嘉義"

Case 6

(24)

Target.Value = "台東"

Case 7

Target.Value = "高雄"

End Select End If

End Sub 清除全部註解

Sub 清除全部註解() Cells.Select

Selection.ClearComments ActiveCell.Select

End Sub 取出註解

Sub 取出註解()

Dim myRng As Range Dim myCmt As Comment Dim i

For i = 0 To 10 Step 1

Set myRng = ActiveCell.Offset(i, 0) '任意的儲存格 With myRng

On Error Resume Next Set myCmt = .Comment On Error GoTo 0

If myCmt Is Nothing Then

(25)

ActiveCell.Offset(i, 1).Value = myCmt.Text End If

End With Next

Set myRng = Nothing '物件的釋放 Set myCmt = Nothing

End Sub 活頁簿控制

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Dim x

x = Left(Target.Address, 2) If x = "$A" Then

Select Case Target.Value Case 2

Target.Value = "台北"

Case 3

Target.Value = "桃園"

Case 4

Target.Value = "台中"

Case 5

Target.Value = "嘉義"

Case 6

Target.Value = "台東"

Case 7

Target.Value = "高雄"

(26)

End select End If End Sub

參考文獻

相關文件

VAB 使用者無法使用 RIDE 提供的 Filter Design 公用程式設計濾波器,但是 使用 VAB 的 Filter 元件時,在元件特性選單可以直接指定此濾波器的規格,使用

在這一節裡會提到,即使沒辦法解得實際的解函數,我們也 可以利用方程式藉由圖形(方向場)或者數值上的計算(歐拉法) 來得到逼近的解。..

使用者甲與使用者乙約定藉由非對稱加密(asymmetric encryption)進行溝通,假設使用者甲先以

sort 函式可將一組資料排序成遞增 (ascending order) 或 遞減順序 (descending order)。. 如果這組資料是一個行或列向量,整組資料會進行排序。

在編輯/偵錯視窗 (Editor) 中,善用 “反白 MATLAB 宣告式. → 按下滑鼠右鍵 → 選取

Shift +a 新增方塊物件→使用 Scale 來調整物 件的大小→Translate 來調整方塊的位置→排 列成樓梯的形狀.. 使用 import 匯入躺椅的

[r]

將繩子折成相等的四小段,已知每一小段都是 x 公分,. 已知繩子的全長為