You are on page 1of 52

 連續符號是底線(_)

 命名規則: 第 1 個字必須是英文子母

Msgbox (“文字內容”) 顯示視窗指令


Inputbox 有輸入框指令

物件指定處理對像
Application Excel 相關設定各指令
Workbooks 活頁簿
Worksheets 工作表
Range 儲存格
AutoFilter 篩選
ChartObject 圖表
Window Excel 視窗
Interior 儲存格格式
ListObject 列表功能
PivotTable
Debug VBE 即時運算視窗

指定物件屬性
Value 儲存格的值
Address 儲存格位置
Font 儲存格字型
ClearContents 清除儲存格
Add 新增
Delete 刪除儲存格後向上移動
Delete Shift: 刪除儲存格後向某
 xl ShiftToLeft 往左移勳
 xl ShiftUp 往上移勳
 xlUp 刪除多列資料
 EntireRow.Delect 刪除整列資料, 下方資料向上移
 EntireColumn.Delect 刪除整欄資料, 右方資料向左移
 InsertShift 插入儲存格
 EntireRow.Insert 插入整列
 EntireColumn. Insert 插入整欄
Select 選取儲存格
Name 帶名稱的儲存格範圍
Border 格線
Field 執行篩選的欄位數字
最左是 1
Criteria1 篩選的值
vbCrLf 換行

Font 字型
Range object.Font
Font object.Size = “點數”
Font object.Name = “字型名稱”F
Font object.Bold =True
Font object.Italic =True
Range.Interior.color =  塗滿儲存格

Name 名稱
Size 大小
Strikethrough 刪除線
Superscipt 上標文字
Subscript 下標文字
Shadow
Color 顏色

With Range("B1:C6").Font
.Name = "MS PGothic"
.FontStyle = "斜體"
.Size = 16
.Color = RGB(0, 115, 190)
設定儲存格格式
Range object.NumberFormatLocal = 格式 顯示固定字串: ”XX”,
Range object.NumberFormat = 格式 @ 指在儲存格上輸入的字串

Range("A5:A9").NumberFormatLocal = "mm/dd"
Range("B5:B9").NumberFormatLocal = "h:mm AM/PM"
Range("C3").NumberFormatLocal = """受理:""@"
Range("A13:C13").NumberFormatLocal = "#,##0;[紅色]-#,##0"
1. 陳述式
1.1 – Dim
1.2 Public and Private
1.3 Const
1.4 Set (將物件指定該變數)
1.5 改工作表名稱
物件 屬性 方法
VBA 可對 Excel 的活頁簿, 工作表,儲存格下達操作指令, 而可利用 VAB 操控的對象稱為物件。

具代表性的物件
Range 操控儲存格的物件
Worksheet 操控工作表的物件
Workbook 操控活頁簿的物件
Name 操控設定了名稱的儲存格範圍的物件

各種物件都有管理外觀與特徵的屬性以及可命令物件的方法

操控儲存格的 Range - 屬性及方法


屬性 Value 取得/設定儲存格的字串
Address 取得/設定”A1” 儲存格編號
End 取得目標儲存格最後一格
方法 Clear 清除儲存格內容
Select 將目標儲存格切換成選取狀態
AutoFit 依照內容調整儲存格大小

格式: 可用 1) 物件. 屬性
2) 物件. 方法

参數:
取得執行必要資訊的種類, 使用参數可在屬性名稱/ 方法名稱後插入一格空白, 再撰寫要傳遞的資
訊。

指定参數/ 帶有名稱的参數: 可利用 ”参數名稱: = 值” 格式指定,

E.g: 刪除儲存格 B2 及向上移動 (有指定参數)


Range (“B2”).Delete Shift:=xlShiftUp

刪除儲存格 B2 及向上移動 ()
Range (“B2”).Delete xlShiftUp

集合
- 需要操作多個活頁薄, 多張工作表, 多個儲存格, 多處已命名的儲存格範圍等物件
- 格式為”物件名稱+S”
Worksheets 統一操控工作表
Workbooks 統一操控活頁簿
Names 統一操控已命名的儲存格範圍

利用 VBA 指定操作物件時, 會使用”指定集合內某個成員”的方法指定物件


1. 使用索引編號  Worksheets(1). Delete
2. 使用物件名稱  Worksheets(“Sheet 1”). Delete

變數的使用
VBA 可使用儲存臨時值/ 物件参照的變數,而使用變數之前, 必須要用 Din 敘述句宣告。

值的指定 –指定給變數
1. 指定數值, 字串, 日期資料等,  變數 = 值
2. 將儲存格, 工作表, 活頁簿等物件指定給變數,  必須便用 Set 敘述句
˙ Set 變數 = 物件

Dim bar As range


Set bar = Range(“A1”)
bar. Value = “Apple”

操控啟用中的 XX
VBA 建立”先選取畫面裹要處理的範圍, 再對該範圍進行操作”

ActiveWorkbook 屬性 操控啟用中的活頁簿
ActiveSheet 屬性 操控啟用中的工作表
ActiveCell 屬性 操控啟用中的單一儲存格
ThisWorkbook 屬性 操控巨集裡的活頁簿
Selection 屬性 操控目前選取的物件

事件處理:
VBA 內建很多事件, 可在”對活頁簿/ 工作表進行 XX 處理”
Workbook Open 開啟活頁簿時執行
BeforeClose 關閉活頁簿時執行
BeforeSave 儲存活頁簿前執行
WorkSheet Activate 工作表被啟用時執行
Change 變更儲存格內容時執行
SelectionChange 變更選取的儲存格時執行
BeforeDoubleClick 雙擊儲存格時執行
-儲存格
- 利用 VBA 選取儲存格有 2 種:

1. Range
˙ Range(儲存格編號)
˙ Range(起點儲存格, 終點儲存格)

 表示儲存格區域, 用不同屬性及方法定義物件, 以位址表示對應儲存格


 以”A1”格式描述儲存格, 容易讀出程式碼,但不適合配搭 For ~Next 使用
 指定儲存格範圍比較好用

2. Cells  Cells(列號, 欄號)


 不儲存所選區域的資訊
 Range 透過名稱存取儲存格, Cells 透過列欄號存取儲存格
 由於利用數值指定儲存格範圍, 很適合配搭 For ~Next
`
選取特定儲存格: 使用 Select
˙ Range(儲存格編號) .Select
˙ Cells(列號, 欄號) .Select

使用 Cells 屬性指定儲存格範圍
 無法獨力指定儲存格範圍, 要與 Range 配搭

E.g:
Range (Cells (5,2) , Cells(5,6)). Select

ActiveSheet.Cells(3, 4).Value = 20  第 3 列,4 欄的儲存格輸入 20


Range 物件屬性
Object. Column 指定儲存格區域第 1 欄
Object. Row 指定儲存格區域第 1 列
Object. Value 代表儲存格的值
Object. Columns 指定儲存格區域的欄數
Object. Rows 指定儲存格區域的列數
Object. Count 計算儲存格區域所跨越的欄列/數
Object. offset 指定儲存格區域偏移區域

儲存格操作方式
Object. Select 選取
Object. Copy 複製
Object. Cut 剪下
Object. Paste 貼上
Object. Delete 刪除
Object. Merge 合併
E.g:
Range(“B2”).value = “Hello!” .  “~的”意思
Range(“A1:C5”).value = “Hello!” Value  “值”意思
Range(Range(“A1”),Range(“C5”)).Select

輸入
Range(“B2”).value = “Hello!”
清除資料
Range(“A1:C5”).value = “Hello!”
Range(“B2”).ClearContents / Range(“B2”).Clear

選擇儲存格

Range 物件.Activate  讓儲存格變成作用儲存格


Range 物件.Select 選擇儲存格/ 儲存格範圍

Sub 選擇儲存格()
Range("A3:B11").Select
Selection.Borders.LineStyle = xlContinuous
Range("B11").Activate
ActiveCell.Formula = "=SUM(B4:B10)"
End Sub

以 B11 為作用儲存格,
設定公式
方向:
1. xlUp 上
End 屬性(方向)
2. xlDown 下
 以特定儲存格為起點, 取得任意方向的終點儲存格,
3.ToLeft 左
能指定選取任何一列紀錄
4. ToRight 右

格式: 起點儲存.End (方向)

ActivSheet.Range(“A1”).End(xlUp).Offset(1,0).Value = “Apple"

Range(“A1”). Delete Shift: = xl ShiftToLeft


刪除整列, 下方資料向上移
Range(“A1”). EntireRow.Delect

刪除多列資料
Row(“A1:B2”). Delete Shift: = xlUp

Range(“A1”). InsertShift: = xl ToRight 插入儲存格,資料加右移


Range(“A1”). EntireRow. Insert

Range(“A1:B2”).Copy
Range(“B1”).Select 複製, 貼上
ActiveSheet.Paste

Range(“A1”).Select 選 A1 儲存格
Selection.Copy 複製選中儲存格
Range(“C1”).Select 選中 C1 儲存格
ActiveSheet.Paste 貼上

Range(“A1”).Cut Range(“G6”) 將 A1 剪貼上 G6

Range("A3", "G7").Font.Italic = True 1. 斜體


Range("A3:G7").HorizontalAlignment = xlCenter 2. 置中對齊
Range("表").Borders.LineStyle = xlContinuous 3. “表”範圍畫上框線
Range("A1").Font.Bold = True 4. 粗體

為儲存格範圍定義名稱
Range object.Name = “名稱”
Range(“A2”).CurrentRegion.Name = “名稱 1”
Range(“名稱 1”).Select

Offset 屬性
 利用參數指定列/欄, 就能傳回指定距離的儲存格
 指定從某儲存格開始, 移動第幾列幾欄到某儲存格

格式: 儲存格範圍.Offset ((列方向移動, 欄方向移動)


 正值往下/ 右移動, 負值則往上/左移動, 0 則不移動

Range (“A1”).Offset (4 ,0).Value= 500 A1 下 4 個儲存格輸入 500

Range("A3").Offset(7, 0).Select 選取 A3 格再往下移動 7 格, 在儲存格輸入”合計”


Selection.Value = "合計"
Selection.Offset(0, 1).Formula = "=SUM(B4:B9)" 再往右移動 1 格, 設定 SUM
Selection.Offset(0, 2).Formula = "=B10/E1"
Range(Selection, Selection.Offset(0, 2)).Interior.ColorIndex = 36

結合多個儲存格範圍
Application.Union(儲存格範圍 1, 儲存格範圍 2….)
 可以將所指定的多個儲存格範圍結合,用於將多個表格整理復製,或選取多個範圍做祚圖表
 將多個 Range 物件組合在一起

Application.Union(Range(“A1:A10”), Range(“D1:D5”)).Select 同時選 2 個區域

Range object.CurrentRegion
 選取表格全部區域, 包括指定儲存格內,由空白欄/列所框住的四邊形範圍(=Ctrl+shift+*)
 可將表格左上角的儲存格當成起點而取得啟用範圍

指定儲存格範圍的列/欄
Range object.Rows(列)
Range object.Columns(欄)

整列/整欄
Range object.EntireRow(列)
Range object. EntireColumn(欄)

Dim allRange As Range


Set allRange = Range("A3").CurrentRegion

allRange.Columns("A:B").HorizontalAlignment = xlCenter Column AB 置中


allRange.Rows(1).Select All range 範圍 - Row(1) 置中
Selection.HorizontalAlignment = xlCenter
Selection.Interior.ColorIndex = 38
Set allRange = Nothing

建立彈性表格範圍
Dim myRow As Integer, myCol As Integer
取得 B 欄最後一列
myRow = Cells(Rows.Count, “B”).End(xlUp).Row
myCol = Range(“B3”).End(xlToRight).Column 取得欄位標題最後一欄
Names(“商品表格”).RefersTo =Range(Range(“B3”), Cells(myRow, myCol))
重新定義表格範圍

新増表格
Names.Add “表格 1”, Range(“B3:F11”)

指定目前物件
ActiveCell 目前使用的儲存格
ActiveSheet 目前的工作表
ActiveWorkbook 目前的活頁簿
Selection 目前選取範圍
ThisWorkbook VBE 目前開始的活頁簿
Sub Worksheets
˙ VBA . = “的”, e.g :我的衣服 =我.衣服
“sheet2 工作表的 A2 儲存格的字體顏色
Worksheets(“Sheet2”).Range(“A2”).Font.Color

Workbook 屬性
Object .Name 活頁簿名稱
Object .Path 活頁簿路徑
Object .FileFormat 活頁簿檔案格式/類型
Object .Sheet 活頁簿中工作表

活頁簿操作
Workbooks.Item(1) 傅回第一個活頁簿
Workbooks(myworkbook).Activate 啟動指定活頁簿
Workbooks.SaveAs() 儲存活頁簿

Worksheets vs Sheets
˙ Sheets = 活頁簿所有類型的工作表
˙ Worksheets = 普通工作表

工作表 1 的 A1

Workbooks(1).Worksheets(“Sheet1”).Range(“A1”).value= “VBA”

Sheets.Add 新增工作表
Worksheets .Add before:= Worksheets(2)
Worksheets .Add After:= Worksheets(2)
Worksheets .Add Count:= 3 ‘插入 3 張

Sheets.Add.Name = “新工作表” 目前工作表名稱改新工作名稱表


ActiveSheet .Name = “新工作表”
Worksheets .Add (before:= Worksheets(1)).name = “新工作表”

選取工作表
Sheets(“工作表名稱”).Select
Sheets(Array(“工作表 1”, “工作表 2”)).Select → 選多個
Worksheets(1).Activate

隱藏工作表
Sheets(“工作表名稱”).Visible = False

ActiveCell .value = “VBA” 選取範圍值=VBA


Selection .value = “VBA”

新增檔案
Workbooks.Add
ActiveWorkbook.SaveAs Filename:= “C:\path\Filename.xls”

開始活頁簿
Workbooks.Open Filename:= “C:\path\Filename.xls”
Application.Run “Filename.xls!Sheet1”

跳到指定儲存格
Application.Goto__________
Application.Goto Reference:= 目標儲存格, Scroll:=True/False
 Goto 可以選取任意的儲存格/儲存格範圍
 Scroll:=True 儲存格範圍自動捲到畫面左上方
Application.Goto Range(“A8:F12”)

Application.Goto Reference:= Worksheets(“5 月” ).Range(“A8”), Scroll:=True

WorksheetFunction
使用工作表函數

Application. WorksheetFunction.工作表函數名 (引數)

Dim total As Long


Total = Application. WorksheetFunction.Sum(Range (“B2:D4”))

Worksheet 物件的 UsedRange


 傅回工作表已經使用的儲存格圍成的區域

ActiveSheet.UsedRange.Select
篩選
Sub Filter
Range (“A1:C5”).AutoFilter Field: =3, Criteria1: = “男”
指定活頁簿篩選
ThisWorkbook. Worksheets (“客戶資料”).Range (“A1:C5”)._
AutoFilter Field: =3, Criterial: = “男”

1.陳述式
1.1 宣告變數 (只在同一 Module 有效) Dim a, b, c
 Dim 變數名稱 As 資料類型 a =”item1”
b =”item2”
 防止變數忘記宣告 c =”item3”
 Option Explicit
 Model 開頭輸入

String $ 交字類型
Integer/ Long %/ & 數字 (整數/ 長整數)
Single/ Double !/ # 小數點
Date 日期
Currency @ 貨幣
Object/ Variant 物件可引用/ 物件或值可引用
Byte 0-255 的數字
Boolean True/ False

E.g.:
Sub test01()
Dim a, b As Integer

a = InputBox("Please input the first number")


b = InputBox("Please input the first number")

MsgBox (“Result:” & a + b)

End Sub

1.1.1 Public and Private (限制變數的有效範圍)


 Public: 所有 Model 能使用
 Public Number Of Employees As integer

 Private: 只能用於自己 Model


 Private Number Of Employees As integer

1.2 使用常數
 常數是固定數值, 不能改動 (不想讓值任意被取代)
 Const 常數名稱 As 資料型態 = 值

Const TAX = 0.08


MsgBox “金額:” &1000 * TAX & “元”

Const oneMinute As Integer = 60


Dim m As Integer

m = InputBox("Please input minute")


MsgBox (m & "分鐘 = " & m * oneMinute & "秒")

End Sub

1.3 Set (儲存物件的變數)


 Set 變數名 = 物件 → Set xx = nothing → clear

Dim 單價 As Long, 數量 As Long, 金額 As Range


單價 = 50
數量 = 50
Set 金額 = Range (“A1”)
金額.Value =單價 *數量
Dim num As Long
num = Range(“A1”).Value

Range(“A2).Value = Range(“B2”).Value * num


Range(“A3).Value = Range(“B3”).Value * num

1.4 改工作表名稱
Dim tmpsheet As Worksheet
Set tmpsheet = Worksheets(1)
tmpsheet.Name = "customer Name"

1.5 字串轉整數 CInt(var)/ 轉日期 (CDate)


 CInt(資料)
 CDate (日期)

Dim myInt As String


Dim myDate As String
myInt = "42.195"
myDate = "20 年 1 月 1 日"
MsgBox "轉整數" & myInt & CInt(myInt) & Chr(10) & _
"轉日期 " & myDate & " " & CDate(myDate)

1.6 Split(分割的字串 ( , 分隔符號)


 將逗號/冒號當作分隔符號

Dim myArray() As String


Dim i As Integer, j As Integer
For j = 1 To 4
myArray = Split(Cells(j, 1), ",")
For i = 0 To UBound(myArray)
Cells(j, 3 + i).Value = myArray(i)
Next i myArray(i): i 值指定給
Next j 第 3+i 欄 j 列的儲存格
將一個儲存格資料放到多列中

Dim myArray() As String


Dim i As Integer
myArray = Split(Range("A1"), Chr(10))
For i = 0 To UBound(myArray)
Cells(i + 3, 1).Value = myArray(i)
Next i

1.7 將各儲存格連結
 Join(Array, 分隔符號)

Dim myArray1(1) As String, myArray2(2) As String


myArray1:連結 BC
Dim i As Integer
myArray2:連結 DEF
Worksheets("Sheet1").Select
For i = 2 To 6
myArray1(0) = Cells(i, 2).Value
myArray1(1) = Cells(i, 3).Value
myArray2(0) = Cells(i, 4).Value
myArray2(1) = Cells(i, 5).Value
myArray2(2) = Cells(i, 6).Value “” = 不使用分隔符號
Worksheets("Sheet2").Cells(i, 2).Value = Join(myArray1)
Worksheets("Sheet2").Cells(i, 3).Value = Join(myArray2, "")
Next i
1. With 陳述式

 同一物件連續處理
 With 共通部分
程式處理
End With

With Worksheets(2) .Range(“B2:D10”)


.AutoFilter Field: =3, Criteria1: = “brand”
.Copy Destination := Range(“F2”)
.AutoFilter
End With

If 要大階
3. If 陳述式
 If 條件式 End if
 If…than… 滿足條件式時執行
 If….elself…. and (複數條件式)
 If….else…. 沒滿足條件式時執行

等於 =
不等於 <>
比較是否相同 Is

檢索 Like
 任意 1 個文字  ?  “Excel” like “?xcel”
 任意 1 個數值  #  “Excel2016” like “Excel##”
 [] 內其中一個文字  [abc]  “d” Like “[abc] ”
 [] 內其中一個文字  [!abc]  “d” Like “[!abc]”
 範圍指定  [a-z]  “d” Like “[a-z]”
條件式 A B True And
條件式 A Or B Or
否定 A Not

Sub 打招呼()
Dim t As String

t = InputBox("早,午,晚?")
If t = "早" Then
MsgBox ("早安")
ElseIf t = "午" Then MsgBox ("您好")
ElseIf t = "晚" Or t = "夜" Then MsgBox ("晚安")

Else: MsgBox ("用戶:" & t)


End If
End Sub

Dim score As Long


score = Range("B3").Value

If score >= 80 Then MsgBox "very good"


ElseIf score >= 60 Then MsgBox "good"
Else MsgBox "fail"
End If

4. Select Case 陳述式


 以判斷值範圍處理
 Select Case 判斷
Case 1, 3, 5 1,3,5 其中之一
Case 範圍 1 
Case is < 5 小於 5
Case 範圍 2 
Case 1 To 5 1--5
Case Else 
End Select

4.1 Select Case 同 IF 分別

IF Select Case
If x = 1 Or x = 30 Or x = 5 Then Select Case x
MsgBox ("奇數") Case 1, 3, 5
Else MsgBox ("奇數")
MsgBox ("偶數") 用 OR Else
MsgBox ("偶數") 利用逗號分隔
If x >= 5 Then Select Case x
MsgBox ("5 以上") Case Is >= 5
利用< >判斷數值 使用 IS
If 2 <= x And x <= 5 Then Select Case x
MsgBox ("2~5") Case 2 To 5
用 And 使用 To

5. 反覆處理工作
For…Next 陳述式 有指定次數 重複 XX 次 由 10 行到 20 行
For…Each…Next 陳述式 特定範圍 (只能在一個集合/ 陣列進行迴圈
己決定反覆次數
不能確應迴圈次數  Do 語句
Do…..loop 陳述式 滿足某個條件 做到 XX 為止 (無法確定反覆次數)
 While  滿足條件後繼續
 Until  繼續直到滿足條件
 Do Until/ While…..loop  先判斷後執行 (第一條件”假”不會執行
 Do....loop Until/ While  先執行後判斷 (執行敘述內容後才判斷條件

反覆處理 跳出迥圈
For…Next Exit For
Do Until/ While…..loop Exit Do

5.1 For…Next 陳述式


 For 迥圈變數 = 初值 To 終值 Step 變化量 (可 Skip)
敘述
Next 迥圈變數名
變數以+2 方式増加
Dim total, i As Long
For i = 2 To 100 Step 2
total = total + i
Next

MsgBox "偶數合計: " & total

E.g: A 每分鐘跑 220 米, B 每分鐘跑 200 米, B 在 1000 米開始, A 要多少分鐘才追趕上?


Dim i, A, B As Long
B = 1000

For i = 1 To 60
A = A + 220
B = B + 200
If A >= B Then
MsgBox "追趕上" & i & "分鐘後"

Exit For 跳出迥圈,否則會繼續執行至 60


End If
Next

第一次用 1 代入 i (代 5 次)

Dim i As Long
For i = 1 To 5
Cells(i, 1).Value = “第” & i & “次處理”
Next

九九乘法表
For i = 1 To 9
For j = 1 To 9
Cells(i, j) = I *J
Next J
Next i

成績分等級
`Dim i As Byte
Dim Irow As Byte
Irow =2 第一條紀錄在第 2 行,初值=2

For i = 1 To 10 Step 1 “B” & Irow = B2 儲存格


Select Case Range (“B” & Irow).Value
Case is >= 80
Range (”C” & Irow).Value = “Good”
Case is >= 60
Range (”C” & Irow).Value = “Pass”
Case Else
Range (”C” & Irow).Value = “Fail”
End Select
Irow = Irow +1

Next I

5.2 For…Each…Next 陳述式


 For Each 變數 in 區域
迴圈
Next
 Using for same “Object” of variable, e.g: Same handling for Range of cells/ worksheets/ workbooks

E.g: 儲存格 B2:D7 中, 如果儲存格沒有值, 自動輸入”未提出”, 然後轉綠色


Dim myRange As Range

For Each myRange In Range("B2", "D7")


If myRange.Value = "" Then
myRange.Value = "未提出"
myRange.Interior.ColorIndex = 35
End If
Next
5.3 Do…..loop 陳述式
 Do Until 條件式
敘述
Loop

Dim total, i As Long


Do While (total < 1000) Total 小於 1000 前一直反覆執行

i=i+1 i 以 1,2 3..在迴圈一直增加


total = total + i
Loop

MsgBox "第" & i & "次為" & total

Do 重複處理
Loop
 Offset 指定 Row and column 的位置

6. 陣列
 Dim 陣列名 (數量) As 資料型態 (Variant)
 變數 = Array (item1, item2,…)
 Debug.Print 表示變數和陣列內容的指令

Dim arr As Variant


arr = Array (“apple”, “banana”, “orange”)
Debug.Print arr(0), arr(1), arr(2)
Dim nameList (2) As string/ Dim nameList (0 To 2) As string
nameList (0) = “a” a
nameList (1) = “b” b
nameList (2) = “c” Cell (0 +1) = (1,1) c
= A1 cell
Dim i As Long
For i = 0 to 2
Cells(i + 1, 1).Value = nameList (i)
Next

例子
6.1 有 EXCEL 值背景填紅色
Dim rng As Range
For Each rng In Range("B2:D6")
If rng.Value = "Excel" Then
rng.Interior.Color = rgbRed
End If
Next

6.2. 儲存格有 3 填紅色


Dim rng As Range
For Each rng In Range("B2:D6") For Len = 函數指定對象
If Len(rng.Value) = 3 Then 儲存格並確應文字數
rng.Interior.Color = rgbRed
End If
Next

Split (將一個字串按指定的分隔符號分拆且將各部分結果存到一個陣列中)
Dim arr As Variant
arr = Split(“蘋果, 橙, 香蕉”, “,”) 按逗號分拆

Join (將陣列合併成字串)
Dim arr As Variant, txt As String
arr = Array(0, 1, 2)
txt = Join (arr, “@”) 省略會以空格分隔
VBA 函數
計算文字數量
Len Len(“VBA”) 3
取出任意字串
1. Right 從字申右方取出指定文字 Right(“ExcelVBA”, 3) VBA
2. Left 從字申左方取出指定文字 Left(“ExcelVBA”, 5) Excel
3. Mid 從指定位置開始, 取出指定文字 Mid (“ExcelVBA”, 3, 3) cel
計算任意字串的位置
1. InStr 計算指定的字串, 在第?位置出現 InStr(“神奈”,” 奈”) 2
2. InStrRev 反方向計算在第?位置出現 InStrRev(“192.168.1.13”, “.”) 10
取代任意字串
Replace 部分字串取代成另一個字串 Replace(“ExcelVBA”, “VBA”, “2016”) Excel2016
去除多餘的空白
1. Trim 去除左右多餘的空白
2. LTrim 去除左
3. Rtrim 去除右
統一字串的形式
StrCorrv 統一大小寫, 全半形 StrCorrv(“XeCel”,vbUpperCase+vb EXCEL
Wide)
 vbUpperCase  轉大寫
 vbLowerCase  轉小寫
 vbProperCase  開頭字母轉大寫
 vbWide  轉全形
 vbNarrow  轉半形
替代指定的表示格式
Format 將字串以任意指定的格式傳回 Format(2000, #,###元”) 2,000 元
使用與陣列的組合
1. Join 將陣列連成字串傳回 Join(Array(“a”, “b”, “c”), “:”) A:b:c
2. Split 將字串製成陣列 Split(“a”, “b”, “c”, “:”)
處理數值的函數
1. Int 無條件捨去 Int(10.5) 10
2. Round 四捨五入 Round(11.5) 12
Val(10.55,1) 10.6
3. Val 從開頭部分取出數值 Val(“100 元”) 100

Dim str As String, StrLength As Long


Str = “ExcelVBA”
StrLength = Len(str)
處理日期和時間的函數
從日期取出一部分的值
Year 取出”年” Year(tmpDate) 2016
Month 取出”月” Month(tmpDate) 2
Day 取出”日” Day(tmpDate) 10
Hour 取出”時” Hour(tmpDate) 10
Minute 取出”分” Minute(tmpDate) 25
Weekday 表示星期的數值 Weekday(tmpDate) 4
WeedayName 對應星期幾 WeedayName(Weekday 星期三
(tmpDate))
日期計算
DateAdd 特定日期+指定日期 DateAdd(“d”, 20, tmpDate) 2016/3/1 10:25
(tmpDate=2016/2/10) DateDiff(“m”, 20, tmpDate) 2017/10/10 10:25
DateDiff 兩個日期之差 DateDiff 51
(“d”,DateValue(“2016/2/10”),
DateValue(“2016/4/1”))
現在日期
Now
Date
Time

日期時間寫法
 #日期#
 DateValue / TimeValue
 Range(“A1”). Value: = #1/10/2016#
 Range(“A2”). Value: = #10:30:00 AM#
 Range(“A1”). Value: = DateValue (“1/10/2016”)
 Range(“A2”). Value: = TimeValue (“10:30”)

建立活頁簿
`
Dim Wb As Workbook, sht As Worksheet
Set Wb = Workbook.Add ‘ 建立活頁簿, 指定變數 Wb
Set sht = Wb.Worksheets(1)
With sht
.Name = “名冊” ‘修改第 1 張工作表名稱
.Range(“A1:C1”) = Array(“No”, “Nmae”, “Gender”)
End With
Wb.SaveAs ThisWorkbook.Path & “\員工名冊.xlsx”
ActiveWorkbook.Close

批次改工作表名稱
Dim i As Integer, sht As Worksheet
i=2 '儲存第 1 個工作表名稱的儲存格在第 2 列
Set sht = Worksheets("資料") '儲存工作表名稱的工作表 = sht
Do While sht.Cells(i, "A") <> "" '直到 A 欄儲存格空時退出迴圈
Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = sht.Cells(i, "A").Value '更改工作表名稱
i=i+1 '列號?加 1
Loop

批次將資料分類,並儲存到不同的工作表中
˙ 由同一張儲存所有一年級不同多個班別的成績記錄, 根據郝屬班別進行分類, 儲存到結構相同的
成績表

Dim i As Long, bj As String, rng As Range


i=2
bj = Worksheets("成績").Cells(i, "C").Value
Do While bj <> "" '直到 C 欄儲存格空時退出迴圈
Set rng = Worksheets(bj).Range("A1000").End(x1Up).Offset(1, 0)
'確定班別工作表中 A 欄第 1 個空儲存格, 作為寫入成績的目的地區域
Worksheets("成績").Cells(i, "A").Resize(1, 7).Copy rng '將成績複製到相應工作
表中

i=i+1
bj = Worksheets("成績").Cells(i, "c").Valve
Loop

將多張工作表的資料合併到一張
Dim sht As Worksheet
Set sht = Worksheets("成績")
sht.`("2:65536").Clear ‘刪除成績表原有記錄

Dim wt As Worksheet, xrow As Integer, rng As Range


For Each wt In Worksheets ‘迴圈處理每張工作表
If wt.Name <> "成績" Then
Set rng = sht.Range("A10000").End(xlUp).Offset(1, 0)
xrow = wt.Range("A1").CurrentRegion.Rows.Count - 1
wt.Range("A2").Resize(xrow, 6).Copy rng
End If
Next

將每張工作表儲存為單獨活頁檔案
Dim folder As String
folder = ThisWorkbook.Path & "\班級成績表" ‘儲存到活頁簿檔案的目錄
If Len(Dir(folder, vbDirectory)) = 0 Then MkDir folder ‘選擇是否新增該資料夾

Dim sht As Worksheet


For Each sht In Worksheets
sht.Copy ‘複製工作表到活頁簿
ActiveWorkbook.SaveAs folder & "\" & sht.Name & ".xlsx" ‘儲存到活頁簿及命名
ActiveWorkbook.Close
Next
Application.ScreenUpdating = True
將多個活頁簿資料合併到一張工作表
Dim bt As Range, r As Long, c As Long
r=1 '硎數
c=7 '欄數
Dim wt As Worksheet '將匯總表指定為 Wt
Set wt = ThisWorkbook.Worksheets(1) '清除總表原有資料,只保留 Title
wt.Rows(r + 1 & ":1000").ClearContents
Application.ScreenUpdating = False

Dim FileName As String, sht As Worksheet, wb As Workbook


Dim Erow As Long, fn As String, arr As Variant
FileName = Dir(ThisWorkbook.Path & "\*.xlsx")

Do While FileName <> ""


If FileName <> ThisWorkbook.Name Then '判斷檔案是否為匯總資料的活頁薄
Erow = wt.Range("A1").CurrentRegion.Rows.Count + 1 '取得匯總表第一空列列號
fn = ThisWorkbook.Path & "\" & FileName '將第 1 個匯總活頁薄名稱指定為 fn

Set wb = GetObject(fn) '將變數代表的活頁薄物件指定為 wb


Set sht = wb.Worksheets(1) '將要匯聚二作表指定為 sht`

arr = sht.Range(sht.Cells(r + 1, "A"), sht.Cells(1000, "B").End(xlUp).Offset(0, 5)) '將工作表中要匯總的記


錄保存在陣欄 arr 中
wt.Cells(Erow, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr '將陣欄 arr 中的資料寫入工作表
wb.Close Fasle
End If
FileName = Dir '用 Dir 取得其他檔案名, 並指定為變數
Loop
FileName = Dir
Loop
幫活貢薄中所有工作表建立目標
Dim wt As Worksheet
Set wt = Worksheets(“工作表目錄”)
Wt.Row(“2:1000”).ClearContents '清除總表原有資料
Dim sht As worksheet, irow As Integer
Irow =2
For Each sht in worksheets
Wt.Cells(irow, “A”).Vaulue = irow – 1 ‘寫入序號
Wt.Hyperlinks.Add Anchor:=wt.Cells(irow, “B”), Address:=””, _ ‘寫入工作表名, 建立超連結
SubAddress:= “;” & sht.Name & “;!A1”, TexToDisplay:=sht.Name
Irow = irow +1 ‘列號加 1
Next

*Anchor = 超連結位置
SubAddress: =超連結子位址
TexToDisplay = 超連結內文

禁用事件
Sub Worksheet
Target.Offset(0, 1).Value = “Apple”

用批註記錄儲存格中資料修改情況
Dim rngValue As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count <> 1 Then Exit Sub
If Target.Formula = "" Then
rngValue = "空"
Else
rngValue = Target.Text
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)


If Target.Cells.Count <> 1 Then Exit Sub
Dim Cvalue As String
If Target.Formula = "" Then
Cvalue = "空"
Else
Cvalue = Traget.Formula
End If

If rngValue = Cvalue Then Exit Sub


Dim RngCom As Comment
Dim ComStr As String
Set RngCom = Target.Comment
If RngCom Is Nothing Then Target.AddComment
ComStr = Target.Comment.Text
Target.Comment.Text Text:=ComStr & _
Format(Now(), "yyyy-mm-ddhh:mm") & _
"原內容:" & rngValue & _
"修改為:" & Cvalue
Target.Comment.Shape.TextFrame.AutoSize = True
OnTime – 指定時間自動執行指定程序`
Application.OnTime TimeValue(“17:00:00”), “Procedure1” 要執行的名稱

Application.OnTime DateSerial(2021, 01, 01) + TimeValue(“17:00:00”), “Procedure2”

每 5 分鐘自動保存一次
Sub Otime()
Application.OnTime Now() + TimeValue(“00:05:00”), “Wbsave
End Sub
Sub wbSave()
ThisWorkbook.Save
Call Otime
End Sub
圖形介面 –
1. Option Button

Private Sub xb1_Click()


If xb1.Value = True Then '如果 xb1 已選取則執行 if 與之間的程式碼
Range("D2").Value = "Male"
xb2.Value = Flase '更改 xb2 為未選取狀態
End If
End Sub

Private Sub xb2_Click()


If xb2.Value = True Then
Range("D2").Value = "Female"
xb1.Value = Flase
End If
End Sub

2. inputBox – 新増可輸入資料的對話盒
Dim c As –Variant
C = inputBox(“你要在 A1 輸入什麼內容?”)
Range(‘A1”).Value = c

3. ShowForm

Initialize – 對表單進行初始化設定
Sub UserForm()
Load InputForm
InputForm.Show
End Sub

利用 Index 取得指定列/ 欄的值


 傳回特定的儲存格範圍裡的特定列/ 欄編號,
 適合想顯示特定位置的記錄

Index (儲存格範圍, 列編號, 欄編號)

利用 Match 取得值的位置

利用 Match 搜尋含有特定值的記錄

使用工作表函數
Application.WorksheetFunction.工作表函數名稱 (參數)

Dim myMatch As Integer, myTable As Range, myField As Range


Set myTable = Range(“B3:H53”)
Set myField = myTable.Column(2).Cells 用 Match 尋找,將結果儲存在變數裡
myMatch = Application.WorksheetFunction.Match(“小町”, myField, 0)
MsgBox “負責人的姓名是: “& myTable.Cells(myMatch, 3).Value & “先生”

Table 第 3 欄是負責人姓名
= A1 cell

透過 VBA 控制表格
每一張工作表由 ListObjects 集合統一管理, 每一個表格是 ListObjects 物件

格式
表格. ListRow s(記錄編號)
表格. ListColumns(欄位名稱/ 索引編號)

屬性 說明
ListRows Range 所有紀錄的儲存格範圍
Index 索引編號
ListColumns Range 所有紀錄的儲存格範圍
DataBodyRange 不含標題的儲存格範圍
Index 索引編號
Name 欄位名稱

取得表格紀錄
Dim myTable As ListObject
Set myTable = Worksheets(“表格”). ListObject(“表格 1)
選取表格第 2 行資料
myTable. ListRows(2). Range.Select

取得表格欄位
Dim myTable As ListObject
Set myTable = Worksheets(“表格”). ListObject(“表格 1)
選取商品名稱欄位的資料
myTable. ListColumns(“商品名稱”). DataBodyRange.Select

指定篩選條件 AutoFilter
格式
儲存格範圍. AutoFilter
[欄位編號], [條件式 1], [條件式種類]
[條件式 2], [下拉式選單]

Array(條件式 1, 條件式 2)

篩選方式
xlAnd 同時滿足 條件 1 & 條件 2
xlOr 滿足 條件 1 Or 條件 2
xlTop10Items 依照條件 1 指定前 10 名
xlBottom10Items 依照條件 1 指定最後 10 名
xlTop10Percent 依照條件 1 前百分比
xlBottom10Percent 依照條件 1 後百分比
xlFilterValues 符合多重條件紀錄
xlFilterCellColor 背景色
xlFilterFontColor 文字色
xlFilterDynamic 指定以日期/ 數值 篩選的條件

Range(“顧客表格”). AutoFilter 6, “郁文”, xlOr, “羽晨”


Range(“顧客表格”). AutoFilter _
Field:=6, _
Criterial:=Array(““郁文”, “羽晨”)
Operator:=xlFilterValues

Range(“顧客表格”). AutoFilter 5, “<20” 第 5 欄為 20 以下的紀錄

篩選某個日期之後的紀錄 DateAdd
可根據種類參數指定的間隔, 從基準日參數拍指定日計算參數指定天數的日期

格式
DateAdd(計算種類, 值, 基準日)

Dim myDate1 As Date, myDate2 As Date


myDate1 = InputBox (“請輸入日期”)
myDate2 = DateAdd (“d”, 10, myDate1) 將計算方法設定為 d(日),在基準日加 10,取得需要日子
Range(“顧客表格”). AutoFilter 7, “>=” & myDate1, xlAnd “<=” meDate2

篩選當月的紀錄 DateSerial
想篩選整個月紀錄昤, 可將篩選條件設定為”這個月的第一天”

DateSerial(Year(Now), Month(Now), 1) 取得當月第一天日期


 每個月 1 的第一天一定是”1 號”, 所以日= 1
 用 DateAdd 將 m(月)的間隔加 1, 就取得”下個月的第一天”日期

Dim myDate1 As Date, myDate2 As Date


myDate1 = DateSerial(Year(Now), Month(Now), 1) 將當月第一天指定為 1
固定下個月第一天日期為 1
myDate2 = DateAdd (“m”, 1 , myDate1)
Range(“顧客表格”). AutoFilter 7, “>=” & myDate1, xlAnd “<=” meDate2

取得月底紀錄
Dim myDate1 As Date, myDate2 As Date
myDate = DateSerial(Year(Now), Month(Now), 1)
myDate = DateAdd (“m”, 1 , myDate) - 1 下月第一天減 1= 月底
MsgBox “月底日期:” & Format (myDate, “m 月 d 日”

**
以顏色篩選
Range(“顧客表格”). AutoFilter _
Field:=5, _
Criterial:=rgb(255,192,0), Operator:=xlFilterCellrColor

利用記載在儲存格的條件式篩選
vba1 P99-103

貼上選項
xlPasteAll 貼上全部內容
xlPasteFormulas 貼上公式
xlPasteFormulasAndNumberFormats 貼上公式+數字
xlPasteValues 貼上值
xlPasteValuesAndNumberFormats 貼上值+公式

轉寫記錄
1.欄位
格式:
儲存格範圍.Copy
轉寫目標位置 PatsteSpecial 貼上方式

Range (“表格 1”).Rows(2).Copy


Worksheets(“轉寫目標位置”).Range(“B3).PatsteSpecial xlPasteValues

*解除 Copy 模式(冇虛線)


Appkication.CutCopyMode = False

2.欄列一同轉寫
Range (“B2:D3”).Copy
Range (“F2”). PatsteSpecial xlPasteAll
轉寫欄列
Range (“F2”). PatsteSpecial xlPasteColumnWidths

3.同時轉寫多筆記錄
Dim myTable As Range, targetRange As Range
Set myTable = Worksheets(“sheet1”).Range(“表格”) 1 設定表格範圍
Set targetRange = Worksheets(“轉寫目標位置”).Range(“B2”) 2 設定轉寫目標位置
myTable.Rows(“2:6”).Copy targetRange
3 Copy 及轉寫第 2-6 列記錄

Worksheets(“轉寫目標位置”).Range(“B2:F6”).Value = Range (“表格”). Rows(“2:6”).Value

直接轉寫儲存格的值

轉寫搜尋到的紀錄 – Find
 建立[搜尋 轉寫]
 可以搜尋儲存格的及搜尋格式

Sub 搜尋()
Dim myTable As Range, myStr As String, myRange As Range
Set myTable = Range("B3:D7") '設定為搜尋範圍
myStr = Range("C2").Value
Set myRange = myTable.Find(myStr, lookat:=xlPart) '根據儲存格 C2 值, 以 Find 方法開始搜尋
If Not myRange Is Nothing Then
Application.Goto myRange, True '如果找到符合記錄, 利用 Goto 方法移到該記錄的儲存格,讓畫面捲到適當位置
End If
Sub 下一筆 k()
Dim myTable As Range, myRange As Range
Set myTable = Range("B3:D7") '設定為搜尋範圍
If Application.Intersect(ActiveCell, myTable) Is Nothing Then '確認搜尋起點
MsgBox "請選擇儲存格"
Else
Set myRange = myTable.FindNext(ActiveCell) '搜尋下一個儲存格
If Not myRange Is Nothing Then
Application.Goto myRange, True '找到"下一個儲存格"後,移動至該儲存格
End If
End If
Sub 轉寫()
Dim myTable As Range, myRecord As Range, targetRange As Range
Set myTable = Range("B3:D7") '設定表格
Set myRecord = Application.Intersect(myTable, Rows(ActiveCell.Row)) '取得目標記錄
Set targetRange = Range("F" & Rows.Count).End(xlUp).Offset(1) '取得 F 欄最後一格儲存格 (轉寫目標位
置)

myRecord.Copy targetRange '轉寫目標記錄


Application.Goto Cells(targetRange.Row, 1), True
Range(Cells(targetRange.Row, "F"), Cells(targetRange.Row, "H")).Select

Intersect – 取得啟用中記錄的儲存格範圍, 再將 F 欄最後一個位置視為轉寫起點

只轉寫篩選的結果
 Copy 篩選結果, 利用 PasteSpecial 方法, 轉寫篩選的結果的值
Dim myTable As Range, targetRange As Range
Set myTable = Worksheets(“資料”).Range(“顧客表格”) '設定表格
Set targetRange = Worksheets(“轉寫”).Range(“B3”) '設定表格轉寫位置
With myTable
.AutoFilter 4, “女” '套用篩選
.Copy
targetRange.PasteSpecial xlPasteValues 'Copy 篩選結果後,只轉寫值
.AutoFilter '解除篩選
End With
轉寫進階篩選的結果
AdvancedFilter: 將参數 Action 指定為常數 xlFilterCopy, 参數 Criteriarange 指定為表格範圍,
参數 CopyToRange 指定為篩選條件範圍

AdvancedFilter
格式:
表格範圍. AdvancedFilter xlFilterCopy, 篩選條件範圍, 轉寫目標位置儲存格範圍

利用 AdvancedFilter 方法轉寫
Dim myTable As Range, myQuery As Range, targetRange As Range
Set myTable = Worksheets(“資料”).Range(“顧客表格”) '設定表格範圍
Set myQuery = Worksheets(“條件式”).Range(“Q_篩選條件”) '設定篩選條件範圍
Set myTable = Worksheets(“轉寫用”).Range(“B2”) '設定轉寫位置目標

myTable. AdvancedFilter xlFilterCopy, myQuery, targetRange ‘利用 AdvancedFilter 方法轉寫


targetRange.CurrentRegion.EntireColumn.AutoFit ‘自動調整欄寬

重復搜尋與篩選
使用 Find 配搭 FindNext 重復進行搜尋, 直到滿足搜尋條件為止。FindNext 可繼續前次搜尋條件[Find]
持續重復搜尋資料

利用相同條件重復搜尋
Dim myTable As Range, firstRange As Range, myRange As Range
Dim myStr As String, myColor As Long
myStr = “李” ‘設定搜尋關鍵字
my Color = RGB(&HFF, &HCC, 0) ‘設定背景色
Set myTable = Worksheets(“資料”).Range(“顧客表格”) ‘設定表格
Set firstRange = myTable.Find(myStr, LookAt: =xlParty) ‘搜尋”第一個儲存格”
If firstRange Is Nothing Then
MsgBox “Cannot find the info” ‘如果找不到”第一個儲存格”則結束迴圈
Exit Sub
End if
Set myRange = firstRange ‘將”第一個儲存格”設定為搜尋下個儲存格的起點
Do
Set myRange = myTable.FindNext(myRange) ‘以上個找到的儲存格為搜尋下個儲存格的起點
myRange.Interior.Color = myColor ‘指定背景色
Loop Until (myRange.Address = firstRange.Address) ‘反覆搜尋, 直到”第一個儲存格” =” ”下個儲存格”

重點: 以 Find 找到的儲存格紀錄在變數裹, 再將 FindNext 結果指定為”與第一個找到的儲存格”一致,


以 Do~ Loop until 迴圈的條件式
能從頭搜尋一遍儲存格範圍,回到資料開頭之後,結束迴圈

利用陣列達成多重搜尋關鍵字的搜尋處理

陣列重複處理
Dim 陣列變數(), 計數器變數
陣列變數 =Array(值 1, 值 2.)
For 陣列變數 = 0 to UBound (陣列變數)

*以陣列變數(計數器變數)格式撰寫處理每個陣列的值的處理
Next

UBound: 可傳回陣列最後一個元素的索引編號, 編號將成為重複處理的次數, 能針對陣列裹每個元素


處理。

以多個關鍵字搜尋
搜尋許, 王, 張 3 個值,將搜尋到的儲存格設定背景色
Dim myTable As Range, firstRange As Range, myRange As Range
Dim myColor As Long
Dim myArray(), i As Long ‘建立陣列變數及計數器變數
myArray = Array(“許”, “王”, “張”) ‘利用陣列指定多個搜尋關鍵字
my Color = RGB(&HFF, &HCC, 0)

Set myTable = Worksheets(“資料”).Range(“顧客表格”)


For i = 0 To UBound(myArray) ‘依照陣列的元素數量決定重複處理次數
Set firstRange = myTable.Find(myArray(i), LookAt:=xlPart) ‘在迴圈便用陣列,對每個元素進行處理

If Not firstRange Is Nothing Then


Set myRange = firstRange
Do
Set myRange = myTable.FindNext(myRange)
myRange.Interior.Color = myColor ‘指定背景色
Loop Until (myRange.Address = firstRange.Address)
End If
Next

重複篩選, 再將篩選結果分別轉寫至不同的工作表
1. 使用 Worksheets 集合的 Add 方法新增工作表, 然後將篩選結果轉寫至新增的工作表
2. Add 方法 - 參數: After – 可在指定的工作表之後新增工作表,
3. 將參數指定為”Sheets(sheets.Count)” – 代表在所有工作表之後新增工作表

利用 Add 新增工作表
Dim 物件變數
Set 物件變數 = Worksheets.Add(after:=Sheets(sheets.Count))

*可撰寫以物件變數對新增工作表處理的程式碼

將每位負責人的篩選結果轉寫至新增的工作表
1. 篩選名字的記錄, 再將結果轉寫至新增的工作表

Dim myTable As Range, mySheet As Worksheet, i As Integer


Dim myList ()
myList = Array(“許”, “王”, “張”) ‘利用陣列指定多個搜尋關鍵字

Set myTable = Worksheets(“資料”).Range(“顧客表格”)


For i = 0 To UBound(myList) ‘依照負責人數量決定重複處理次數
Set mySheet = Worksheets.Add(after:=Sheets(sheets.Count)) ‘新增工作表,依照負責人名改工作表名稱
mySheet.Name = myList(i) & “資料篩選”

With myTable
AutoFilter 6, myList(i)
Copy mySheet.Range(“B2”) ‘利用負責人名套用篩選功能,將結果轉寫至新工作表
AutoFilter
End with
mySheet.Range(“B2”).CurrentRegion.EntireColumn.AutoFit
Next

重複篩選, 再將篩選結果分別轉寫至不同活頁簿
1. 根據固定篩選條件, 從定期累積的資料裹篩選記錄, 再製作成報告
2. 先以清單格式輸入所有篩選條件, 再用 AdvancedFilter 轉寫資料.

利用 Add 新增活頁簿
Dim 物件變數
Set 物件變數 = Workbooks.Add()
*可撰寫以物件變數對新增活頁簿處理的程式碼

刪除重複記錄之後, 建立刪除清單

1. RemoveDuplicates
重複記錄的儲存格範圍. RemoveDuplicates [Columns], [Header]

Columns 判斷是否重複的欄編號, 可用陣列一次指定多個


Header 判斷第一列是否為標題
xlYes(判斷), xlNo(不判斷), xlGuess(Excel 判斷)

2. 將 AdvancedFilter 的參數 Unique 指定為 True


重複記錄的儲存格範圍. AdvancedFilter 篩選條件儲存格範圍, Unique: True

建立刪除清單 1
Dim target As Range
Range(“重複範圍”).Copy Range(“D2”)
Set target = Range(“D2”).CurrenctRegion
Target. RemoveDuplicates Columns:=1, Header:= xlYes ‘刪除重複記錄

建立刪除清單 2
Dim target As Range
Range(“重複範圍”) . AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range(“F2”)
Unique:=True

整合資料
1. 多個表格統合成一個
Consolidate
轉寫目標位置. Consolidate [Source], [Function], [TopRow], [LeftColumn]
Source 原始資料位址,根據 R1C1 格式指定
Function 以常數指定統整方式
TopRow 頂端列功能
LeftColumn 最左欄功能

統合 3 個表格
Range(“F2”).Consolidate Sources:=Array(Range(“台北”).Address(ReferenceStyle:=xlR1C1), _
Range(“台中”).Address(ReferenceStyle:=xlR1C1), _
Range(“台南”).Address(ReferenceStyle:=xlR1C1)), _
Function:=xlSum, _
TopRow:=True, _
LeftColumn:=True
Range(“F2”).Value = “商品名稱” ‘左上角儲存格輸入字串

2. 多個工作表表格統合成一個

公式: 對所有工作表進行重復處理格式
Dim 物件變數
For each 物件變數 In Worksheets
*可撰寫透過物件變數操作每個工作表
Next

Dim mySheet As Worksheet, myRange As Range, tmpTable As Range

For Each mySheet In Worksheets 以所有工作表為對象的迴圈處理


If mySheet.Name <> “統合” Then ‘排除處理“統合”工作表
Set myRange = Worksheets(“統合”). _
Range(“B” & Rows.Count).End(xlUp).Offset(1) ‘取得最後一筆記錄的轉寫位置
Set tmpTable = mySheet.Range(“B5”).CurrentRegion ‘取得轉寫來源的儲存格範圍
tmpTable.Rows(“2:” & tmpTable.Rows.Count).Copy myRange ‘取得轉寫標題以外的儲存格範圍
End if
Next
(先在轉寫工作表建立標題)

將資料夾內多個活頁簿整理成單個活頁簿
- 先從 VBA 開啟活頁簿, 對活頁簿進行處理, 再關閉活頁簿

開啟活頁簿再處理公式
Dim 物件變數
Set 物件變數 = Workbooks.Open(Filename:= 活頁簿路徑)
*可撰寫透過物件變數對開啟的活頁簿進行處理
物件變數.Close

路徑格式:
Driver:\ 資料格名稱\ 檔案名稱.xlsx

開啟活頁簿後轉寫資料,再關閉活頁簿

Dim myDir As String, myName As Variant, myBook As Workbook


Dim copyRange As Range, pasteRange As Range
Dim nameList ()

nameList = Array(“台北業績.xlsx”, “台中業績.xlsx”, “高雄業績.xlsx”)


myDir = ThisWorkbook.Path & “\小計用\” ‘指定儲存來源活頁簿路徑
For Each myName In nameList
Set pasteRange = Range (“B” & Rows.Count).End(xlUp).Offset(1)
Set myBook = Workbooks. Open(Filename:=myDir & myName)
‘將資料夾的路徑與檔案名稱組合,開啟目標活頁簿

Set copyRange = myBook.Names (“業績表格”).RefersToRange


Set copyRange = copyRange.Rows(“2:” & copyRange.Rows.Count)

copyRange.Copy pasteRange
myBook.Close
Next
針對特定資料夾裡的所有活頁簿

1. 利用 FileDialog 物件開啟選擇資料 (P171)

將輸入用工作表的資料轉寫至資料工作表
1. 建立轉寫機制
Sub 轉寫新記錄
Dim formSheet As Worksheet, database As Range
Dim newRecordRange As Range, i As Long
Dim addressList ()
Set formSheet = Sheets(“輸入表單”) <-將輸入用與轉寫目標位置的
Set database = ThisWorkbook.Names(‘員工表格”).RefersToRange <-表格設定給變數

Address = Array(“C4”, “C6”, “C7”, “F8”, “C10”, “C11”) ‘將要轉寫的儲存格編號存於陣列裹


Set newRecordRange = dataTable.Rows(1).Offset(dataTable.Rows.Count) ‘取得記錄的新增位置
For i = 0 To UBound (addressList)
newRecordRange.Cells(1, i + 1).Value = formSheet.Range(addressList(i)).Value
‘依照陣列裹的編號轉寫記錄
Next

2. 更新表格範圍
Sub 更新表格範圍
Const tableName = “員工表格”
Dim targetName As Name
Dim curTable As Range, lastRecord As Range

Set targetName = Names(tableName) ‘取得“員工表格”的儲存格


Set curTable = targetName.RefersToRange ‘取得“員工表格”的儲存格範圍
Set lastRecord = curTable.Row(1).Offset(curTable.Rows.Count -1)
‘取得“員工表格”最後一筆記錄的儲存格範圍

lastRecord.Copy ‘將最後一筆記錄的格式套用至新記錄
lastRecord.Offst(1, 0).PasteSpecial xlPasteFormats
Application.CutCopyMode = False
targetName.RefersTo = curTable.CurrentRegion ‘更新“員工表格”參照的儲存格範圍

3. 指定以上巨集的按鈕
Sub 新增記錄
Call 轉寫新記錄 ‘呼叫這兩個 Sub 程序
Call 更新表格範圍

從程序呼叫另一個程序
Call 要呼叫的程序名稱 (參數)
4. 建立搜尋記錄的機制
Sub 搜尋員工資料
Dim serchID As Interger, addressList(), myRange As Range, I As Integer
Serch ID = Worksheets(“輸入表單”).Range(“C4”).Value ‘取得搜尋值
addressList = Array(“C6”, “C7”, “F8”, “C10”, “C11”) ‘以陣列指定顯示位置

Set myRange = Range(“員工表格”).Column(1). Find(serchID, LookAt:=xlwhole) ‘從”員工表格”搜尋


If myRange Is Nothing Then Msgbox “找不到符合記錄” ‘搜尋不到脫離處理
Exist Sub
End if
For I = 0 To UBound(addressLiat) ‘搜尋不到脫離處理
Range(addressList(i)).Value = myRange.Offset(0, I + 1)
Next
開啟外來資料檔
1. 匯入 CSV 檔 - 指定格式開啟 CSV 格式
1.1 以逗號分隔
Dim myDir As String
myDir = ThisWorkbook.Path & “\”
‘分隔符號指定為逗號
Workbooks.OpenText _
Filename:=myDir & “員工資料表(CSV 格式).txt”, _
DataType:=xlDelimited, _
Comma:=True,_
FieldInfo:=Array(Array (1, 2), Array (2, 2),
Array (3, 9), Array (4, 2))
1.2 開啟固定長度格式的文字檔案
Dim myDir As String
myDir = ThisWorkbook.Path & “\”
‘引數 ”DataType”指定固定長度(xlFieldWidth)
‘指定在第幾個欄位作區隔
Workbooks.OpenText _
Filename:=myDir & “員工資料表(固定長度).txt”, _
DataType:=xlFieldWidth, _
FieldInfo:=Array(Array (0, 2), Array (6, 2), Array (16, 9), Array (22, 2))

You might also like