Professional Documents
Culture Documents
命名規則: 第 1 個字必須是英文子母
物件指定處理對像
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 操控設定了名稱的儲存格範圍的物件
各種物件都有管理外觀與特徵的屬性以及可命令物件的方法
格式: 可用 1) 物件. 屬性
2) 物件. 方法
参數:
取得執行必要資訊的種類, 使用参數可在屬性名稱/ 方法名稱後插入一格空白, 再撰寫要傳遞的資
訊。
刪除儲存格 B2 及向上移動 ()
Range (“B2”).Delete xlShiftUp
集合
- 需要操作多個活頁薄, 多張工作表, 多個儲存格, 多處已命名的儲存格範圍等物件
- 格式為”物件名稱+S”
Worksheets 統一操控工作表
Workbooks 統一操控活頁簿
Names 統一操控已命名的儲存格範圍
變數的使用
VBA 可使用儲存臨時值/ 物件参照的變數,而使用變數之前, 必須要用 Din 敘述句宣告。
值的指定 –指定給變數
1. 指定數值, 字串, 日期資料等, 變數 = 值
2. 將儲存格, 工作表, 活頁簿等物件指定給變數, 必須便用 Set 敘述句
˙ Set 變數 = 物件
操控啟用中的 XX
VBA 建立”先選取畫面裹要處理的範圍, 再對該範圍進行操作”
ActiveWorkbook 屬性 操控啟用中的活頁簿
ActiveSheet 屬性 操控啟用中的工作表
ActiveCell 屬性 操控啟用中的單一儲存格
ThisWorkbook 屬性 操控巨集裡的活頁簿
Selection 屬性 操控目前選取的物件
事件處理:
VBA 內建很多事件, 可在”對活頁簿/ 工作表進行 XX 處理”
Workbook Open 開啟活頁簿時執行
BeforeClose 關閉活頁簿時執行
BeforeSave 儲存活頁簿前執行
WorkSheet Activate 工作表被啟用時執行
Change 變更儲存格內容時執行
SelectionChange 變更選取的儲存格時執行
BeforeDoubleClick 雙擊儲存格時執行
-儲存格
- 利用 VBA 選取儲存格有 2 種:
1. Range
˙ Range(儲存格編號)
˙ Range(起點儲存格, 終點儲存格)
使用 Cells 屬性指定儲存格範圍
無法獨力指定儲存格範圍, 要與 Range 配搭
E.g:
Range (Cells (5,2) , Cells(5,6)). Select
儲存格操作方式
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
選擇儲存格
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 右
ActivSheet.Range(“A1”).End(xlUp).Offset(1,0).Value = “Apple"
刪除多列資料
Row(“A1:B2”). Delete Shift: = xlUp
Range(“A1:B2”).Copy
Range(“B1”).Select 複製, 貼上
ActiveSheet.Paste
Range(“A1”).Select 選 A1 儲存格
Selection.Copy 複製選中儲存格
Range(“C1”).Select 選中 C1 儲存格
ActiveSheet.Paste 貼上
為儲存格範圍定義名稱
Range object.Name = “名稱”
Range(“A2”).CurrentRegion.Name = “名稱 1”
Range(“名稱 1”).Select
Offset 屬性
利用參數指定列/欄, 就能傳回指定距離的儲存格
指定從某儲存格開始, 移動第幾列幾欄到某儲存格
結合多個儲存格範圍
Application.Union(儲存格範圍 1, 儲存格範圍 2….)
可以將所指定的多個儲存格範圍結合,用於將多個表格整理復製,或選取多個範圍做祚圖表
將多個 Range 物件組合在一起
Range object.CurrentRegion
選取表格全部區域, 包括指定儲存格內,由空白欄/列所框住的四邊形範圍(=Ctrl+shift+*)
可將表格左上角的儲存格當成起點而取得啟用範圍
指定儲存格範圍的列/欄
Range object.Rows(列)
Range object.Columns(欄)
整列/整欄
Range object.EntireRow(列)
Range object. EntireColumn(欄)
建立彈性表格範圍
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(“工作表名稱”).Select
Sheets(Array(“工作表 1”, “工作表 2”)).Select → 選多個
Worksheets(1).Activate
隱藏工作表
Sheets(“工作表名稱”).Visible = False
新增檔案
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”)
WorksheetFunction
使用工作表函數
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
End Sub
1.2 使用常數
常數是固定數值, 不能改動 (不想讓值任意被取代)
Const 常數名稱 As 資料型態 = 值
End Sub
1.4 改工作表名稱
Dim tmpsheet As Worksheet
Set tmpsheet = Worksheets(1)
tmpsheet.Name = "customer Name"
1.7 將各儲存格連結
Join(Array, 分隔符號)
同一物件連續處理
With 共通部分
程式處理
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 ("晚安")
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
For i = 1 To 60
A = A + 220
B = B + 200
If A >= B Then
MsgBox "追趕上" & i & "分鐘後"
第一次用 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
Next I
Do 重複處理
Loop
Offset 指定 Row and column 的位置
6. 陣列
Dim 陣列名 (數量) As 資料型態 (Variant)
變數 = Array (item1, item2,…)
Debug.Print 表示變數和陣列內容的指令
例子
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
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
日期時間寫法
#日期#
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
批次將資料分類,並儲存到不同的工作表中
˙ 由同一張儲存所有一年級不同多個班別的成績記錄, 根據郝屬班別進行分類, 儲存到結構相同的
成績表
i=i+1
bj = Worksheets("成績").Cells(i, "c").Valve
Loop
將多張工作表的資料合併到一張
Dim sht As Worksheet
Set sht = Worksheets("成績")
sht.`("2:65536").Clear ‘刪除成績表原有記錄
將每張工作表儲存為單獨活頁檔案
Dim folder As String
folder = ThisWorkbook.Path & "\班級成績表" ‘儲存到活頁簿檔案的目錄
If Len(Dir(folder, vbDirectory)) = 0 Then MkDir folder ‘選擇是否新增該資料夾
*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
每 5 分鐘自動保存一次
Sub Otime()
Application.OnTime Now() + TimeValue(“00:05:00”), “Wbsave
End Sub
Sub wbSave()
ThisWorkbook.Save
Call Otime
End Sub
圖形介面 –
1. Option Button
2. inputBox – 新増可輸入資料的對話盒
Dim c As –Variant
C = inputBox(“你要在 A1 輸入什麼內容?”)
Range(‘A1”).Value = c
3. ShowForm
Initialize – 對表單進行初始化設定
Sub UserForm()
Load InputForm
InputForm.Show
End Sub
利用 Match 取得值的位置
利用 Match 搜尋含有特定值的記錄
使用工作表函數
Application.WorksheetFunction.工作表函數名稱 (參數)
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 指定以日期/ 數值 篩選的條件
篩選某個日期之後的紀錄 DateAdd
可根據種類參數指定的間隔, 從基準日參數拍指定日計算參數指定天數的日期
格式
DateAdd(計算種類, 值, 基準日)
篩選當月的紀錄 DateSerial
想篩選整個月紀錄昤, 可將篩選條件設定為”這個月的第一天”
取得月底紀錄
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 貼上方式
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 列記錄
直接轉寫儲存格的值
轉寫搜尋到的紀錄 – 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 欄最後一格儲存格 (轉寫目標位
置)
只轉寫篩選的結果
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”) '設定轉寫位置目標
重復搜尋與篩選
使用 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) ‘反覆搜尋, 直到”第一個儲存格” =” ”下個儲存格”
利用陣列達成多重搜尋關鍵字的搜尋處理
陣列重複處理
Dim 陣列變數(), 計數器變數
陣列變數 =Array(值 1, 值 2.)
For 陣列變數 = 0 to UBound (陣列變數)
*以陣列變數(計數器變數)格式撰寫處理每個陣列的值的處理
Next
以多個關鍵字搜尋
搜尋許, 王, 張 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)
重複篩選, 再將篩選結果分別轉寫至不同的工作表
1. 使用 Worksheets 集合的 Add 方法新增工作表, 然後將篩選結果轉寫至新增的工作表
2. Add 方法 - 參數: After – 可在指定的工作表之後新增工作表,
3. 將參數指定為”Sheets(sheets.Count)” – 代表在所有工作表之後新增工作表
利用 Add 新增工作表
Dim 物件變數
Set 物件變數 = Worksheets.Add(after:=Sheets(sheets.Count))
*可撰寫以物件變數對新增工作表處理的程式碼
將每位負責人的篩選結果轉寫至新增的工作表
1. 篩選名字的記錄, 再將結果轉寫至新增的工作表
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]
建立刪除清單 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
將資料夾內多個活頁簿整理成單個活頁簿
- 先從 VBA 開啟活頁簿, 對活頁簿進行處理, 再關閉活頁簿
開啟活頁簿再處理公式
Dim 物件變數
Set 物件變數 = Workbooks.Open(Filename:= 活頁簿路徑)
*可撰寫透過物件變數對開啟的活頁簿進行處理
物件變數.Close
路徑格式:
Driver:\ 資料格名稱\ 檔案名稱.xlsx
開啟活頁簿後轉寫資料,再關閉活頁簿
copyRange.Copy pasteRange
myBook.Close
Next
針對特定資料夾裡的所有活頁簿
將輸入用工作表的資料轉寫至資料工作表
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 <-表格設定給變數
2. 更新表格範圍
Sub 更新表格範圍
Const tableName = “員工表格”
Dim targetName As Name
Dim curTable As Range, lastRecord As Range
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”) ‘以陣列指定顯示位置