天天看點

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

一、對象模型

在VBE中“幫助(H)”——“Microsoft Visual Basic 幫助(H) F1”——“Visual Basic 語言參考”——“函數” 或者在VBE下快捷鍵“F1”

位址:https://docs.microsoft.com/zh-cn/office/vba/api/overview/excel/object-model

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

二、Application對象(Excel頂層對象)

1、ScreenUpdating屬性 

 是否控制螢幕更新,False表示關閉螢幕更新,True表示打開螢幕更新

設定ScreenUpdating=False 關閉螢幕更新,将看不到程式的執行過程,可以加快程式的執行速度,讓程式顯得更直覺,專業。

示例(為關閉螢幕更新下,會彈出對話框):

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub InputTest()
    Cells.ClearContents '清除表中所有資料
    Range("A1:A10") = 100
    MsgBox "剛才在A1:A10輸入數值100,你能看到結果嗎?"
    Range("B1:B10") = 200
    MsgBox "剛才在B1:B10輸入數值200,你能看到結果嗎?"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

示例(關閉螢幕更新,看不到執行過程,程式最終執行完成才能看到最終結果)

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub InputTest()
    Cells.ClearContents '清除表中所有資料
    Application.ScreenUpdating = False '關閉螢幕更新
    Range("A1:A10") = 100
    MsgBox "剛才在A1:A10輸入數值100,你能看到結果嗎?"
    Range("B1:B10") = 200
    MsgBox "剛才在B1:B10輸入數值200,你能看到結果嗎?"
    Application.ScreenUpdating = True '恢複螢幕更新
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

2、DisplayAlterts屬性

 是否顯示警告對話框,False為不顯示,True為顯示

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub delSht()
    Dim sht As Worksheet
    Application.DisplayAlerts = False '不顯示警告資訊
    For Each sht In Worksheets
        If sht.Name = ActiveSheet.Name Then '判斷sht是不是活動工作表
            sht.Delete '删除sht代表的工作表
        End If
    Next
    Application.DisplayAlerts = True '恢複顯示警告資訊
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

3、EnableEvents屬性

啟用或禁用事件,False為禁用(不讓事件發生),True為啟用

什麼是事件?能被Excel認識的一個操作動作,例如“打開工作簿”、“關閉工作簿”等

  • 示例1:編寫一個程式,當選中工作表的單元格時,自動在單元格中寫入該單元格的位址
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Value = Target.Address
End Sub      
  • 示例2:選中活動單元格,記錄對應單元格位址,并将活動單元格向下移動一個單元格
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Value = Target.Address
    Application.EnableEvents = False '禁用事件
    Target.Offset(1, 0).Select '選中活動單元格下面的一個單元格
    Application.EnableEvents = True '啟用事件
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

4、WorksheetFunction屬性

使用WorksheetFunction調用Excel内置函數

  • 示例1:統計A1:A50單元格中數值大于1000的單元格有多少個?
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub CountTest()
    Dim mycount As Integer, rng As Range
    For Each rng In Range("A1:B50")
        If rng.Value > 1000 Then mycount = mycount + 1
    Next
    MsgBox "A1:B50中大于1000的單元格個數為:" & mycount
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 示例2: 統計A1:A50單元格中數值大于1000的單元格有多少個?使用COUNTIF函數
Sub CountTest()
    Dim mycount As Integer
    mycount = Application.WorksheetFunction.CountIf(Range("A1:B50"), ">1000")
    MsgBox "A1:B50中大于1000的單元格個數為:" & mycount
End Sub      

5、給Excel梳妝打扮

  • Excel工作表界面相關指令
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • Excel界面
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

6、Application的常用屬性

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

三、Workbook對象

Workbook工作簿 

Workbooks工作簿集合

1、怎麼引用工作簿

引用工作簿,就是指明工作簿的位置及名稱,共有兩種方式

方式一:利用索引号引用工作簿,Workbook.Item(3),這裡的Item可以省略,即Workbook(3)

方式二:利用工作簿名稱引用 ,Workbook("Book1")或Workbook("Book1.xls"),如果本地檔案顯示拓展名(且檔案已經儲存),則檔案名必須帶拓展名,否則會報錯。

2、Workbook名片資訊

Sub wbMsg()
    Range("B2") = ThisWorkbook.Name     '傳回目前工作簿名稱 練習 -副本.xlsm
    Range("B3") = ThisWorkbook.Path     '傳回目前工作簿路徑 C:\Users\ThinkPad\Desktop
    Range("B4") = ThisWorkbook.FullName '傳回當期工作簿帶名稱的路徑 C:\Users\ThinkPad\Desktop\練習 - 副本.xlsm
End Sub      

3、建立工作簿

  • 使用方法:Workbooks.Add 

  如果不帶任何參數,将建立包含一定數目空白工作表的新工作簿(數目由SheetsInNewWorkbook屬性決定) 

  • 也可以給Add方法設定參數(參數表示現有Excel名稱的字元串,選用該參數,建立的工作簿将以該檔案作為模闆)

  Workbooks.Add "C:\Program Files\Microsoft Office\Templates\2052\ADDRESS\ADDRESS.XLS" 

  • 也可以通過參數指定建立工作簿中包含的工作類型

  Workbooks.Add xlWBATChart '建立圖表工作表 

  • Excel一共有4種類型的工作表

  可以在插入對話框裡看到(選中工作表名稱——滑鼠右鍵單擊——插入——即可顯示),如圖(包含參數說明):

  

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

4、打開工作簿

 使用Workbooks的Open方法(參數名要寫含路徑的名稱)

Sub OpenFile()
    Workbooks.Open Filename:="F:\Book1.xls"
End Sub      

參數名成可以省略不寫(Open除了Filename參數外,還有14個參數,讓使用者決定以何種方式打開指定的檔案,可以通過系統的幫助來檢視更多的資訊)

Sub OpenFile()
    Workbooks.Open "F:\Book1.xls"
End Sub      

5、激活工作簿

 同僚打開多個工作簿,但是同一時間隻能有一個視窗是活動的,調用Workbooks對象的Active方法可以激活一個工作簿。 

Sub JhWb()
    Workbooks("Book1.xls").Activate '激活工作簿
End Sub      

6、儲存工作簿

 儲存工作簿調用Workbooks的Save方法

Sub SaveWb()
    ThisWorkbook.Save   '儲存代碼所在的工作簿
End Sub      

 如果想将檔案另存為一個新的檔案,或者第一次儲存一個建立的工作簿,就用SaveAs方法。

參數指定檔案儲存的路徑及檔案名如果省略路徑,則預設将檔案儲存在目前檔案夾中

Sub SaveWb()
    ThisWorkbook.SaveAs Filename:="D:\test.xls"
End Sub      

使用SaveAs方法将工作簿另存為新檔案後,将自動關閉原檔案,打開新檔案,如果希望繼續保留原檔案不打開新檔案,可以用SaveCopyAs方法

Sub SaveWb()
    ThisWorkbook.SaveCopyAs Filename:="D:\test.xls"
End Sub      

7、關閉工作簿

 關閉工作簿使用Workbooks的Close方法,如果不帶參數,則關閉所有打開的工作簿

Sub CloseWb()
    Workbooks.Close '關閉所有打開的工作簿
End Sub      

如果想關閉指定的工作簿,需要指定參數

Sub CloseWb()
    Workbooks("Book1.xls").Close  '關閉Book1.xls
End Sub      

如果關閉之前被更改過的内容沒有儲存,關閉工作簿前Excel會詢問使用者是否儲存更改,如果不想顯示該對話框,可以給Close方法設定參數:

Sub CloseWb()
    Workbooks("Book1.xls").Close savechanges:=True '關閉并儲存Book1.xls
End Sub      

關閉并儲存的參數savechanges也可以省略不寫:

Sub CloseWb()
    Workbooks("Book1.xls").Close True '關閉Book1.xls
End Sub      

8、ThisWorkbook與ActiveWorkbook

 同是Application對象的屬性,同是傳回Workbook對象,但二者并不是等同的。

ThisWorkbook是對程式所在的工作簿的引用

ActiveWorkbook是對活動工作簿的引用

建立的工作簿總會成為活動工作簿

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub wb()
    Workbooks.Add
    MsgBox "代碼所在的工作簿為:" & ThisWorkbook.Name & Chr(13) _
            & "目前活動工作簿為:" & ActiveWorkbook.Name
    ActiveWorkbook.Close savechanges:=False
End Sub       
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

四、Worksheet對象

Worksheet表示一張普通的工作表,Worksheets表示多個Worksheet對象的集合。

1、引用工作表

可以使用工作表的索引号或者标簽名稱引用它 

Worksheets.Item (1)     '引用工作表裡的第一張工作表
Worksheets (1)          '引用工作表裡的第一張工作表
Worksheets ("Sheet1")   '引用工作簿裡标簽名稱為"Sheet1"的工作表      

  因為代碼名稱隻能在【屬性視窗】裡修改,不會随着工作表标簽名稱或索引号的變化而變化。是以,當工作表的索引号或标簽名稱經常變化時,使用代碼名稱引用工作表會更友善。

  使用代碼名稱引用工作表,隻需直接寫代碼名稱

  例如:第一張工作表的A1單元格輸入100,代碼為:Sheet1.Range("A1")=100

  檢視工作表的代碼名稱,可以讀取它的CodeName屬性,如果想知道活動工作表的代碼名稱,代碼為:

Sub ShowShtCode()
    MsgBox ActiveSheet.CodeName
End Sub      

2、建立工作表

 建立工作表使用Worksheets的Add方法

  • 不帶任何參數,将在活動工作表建立一張工作表

  Worksheets.Add

  • 可以用參數給建立的工作表指定位置

  Worksheets.Add before:=Worksheets(1)  '在第一張工作表前插入一張新的工作表

  Worksheets.Add after:=Worksheets(1) ‘在第一張工作表後插入一張新的工作表

  • 還可以同時插入多張工作表

  Worksheets.Add Count:=3  '在活動工作表前插入3張工作表,Count參數的預設值為1

  • 可以同時使用多個參數,不同參數之間用英文逗号隔開
Sub shtAdd()
    Worksheets.Add after:=Worksheets(1), Count:=3
End Sub      

  在最後一張工作表後插入兩張工作表

Sub shtAdd()
    '在最後一個工作表後插入兩張工作表
    Worksheets.Add before:=Worksheets(Worksheets.Count), Count:=2
End Sub       
  • Add方法有哪些參數?請看VBE的提示
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

3、更改工作表标簽名稱

  • 更改工作表标簽名稱,設定工作表Name屬性

  Worksheets(2).Name="工資表"   '更改第二張工作表的标簽名稱為“工資表”

  •  建立工作表時在程式中更改标簽名稱
Sub shtAdd()
    Worksheets.Add Before:=Worksheets(1)
    ActiveSheet.Name = "工資表"
End Sub      
  • 建立工作表同時指定它的标簽名稱
Sub shtAdd()
    '在第一張工作表前插入一個名稱為“工資表”的工作表
    Worksheets.Add(before:=Worksheets(1)).Name = "工資表"
End Sub      
  • 如果同時添加多張工作表(即Count參數值大于1),并不能使用一句代碼同時命名

4、删除工作表

删除工作表使用Worksheets對象的Delete方法

Worksheets("Sheet1").Delete   '删除Sheet1工作表

5、激活工作表

 激活工作表可以使用Activate方法和Select方法

Worksheets(1).Activate '激活第一張工作表

Worksheets(1).Select '激活第一張工作表

6、複制工作表

 複制工作表使用Copy方法

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtCopy()
    '這裡的工作表名稱一定要存在,否則執行會報錯
    Worksheets("工資條").Copy  '不帶參數   複制工作表,同時建立工作簿用于存放copy來的工作表(未儲存狀态)
    Worksheets("工資條").Copy before:=Worksheets("Sheet1") '帶參數  複制工作表,存放在目前工作簿的工作表Sheet1之前
    Worksheets("工資條").Copy after:=Worksheets("Sheet1") '帶參數   複制工作表,存放在目前工作簿的工作表Sheet1之後
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

7、移動工作表

 移動工作表與複制工作表類似,使用方法Move

Sub shtMove()
    Worksheets("工資條").Move   '不指定參數,将把工作表移動到新的工作簿中(建立工作簿)
    Worksheets("工資條").Move before:=Worksheets("Sheet1") '複制工作表,存放在目前工作簿的工作表Sheet1之前
    Worksheets("工資條").Move after:=Worksheets("Sheet1") '複制工作表,存放在目前工作簿的工作表Sheet1之後
End Sub      

8、隐藏和顯示工作表

使用工作表的Visible屬性顯示或隐藏工作表 

'以下這三行代碼作用一樣,等同于從【格式】菜單中隐藏工作表
Worksheets("工資條").Visible = False
Worksheets("工資條").Visible = xlSheetHidden
Worksheets("工資條").Visible = 0      

用下面方法隐藏的工作表,跟上面3種方法不一樣,且通過這種方法隐藏的工作表,無法通過菜單取消隐藏,隻能通過VBA在屬性視窗設定或者用代碼取消隐藏

Worksheets("工資條").Visible = xlSheetVeryHidden
Worksheets("工資條").Visible = 2      

無論以何種方式隐藏了工作表,都可以用如下代碼中的任意一句顯示它

Worksheets("工資條").Visible = True
Worksheets("工資條").Visible = xlSheetVisible
Worksheets("工資條").Visible = 1
Worksheets("工資條").Visible = -1      

9、擷取工作表的數目

使用Worksheets.Count

Dim mycount%
mycount=Worksheets.Count       

10、Sheets與Worksheets

  •  不同的指令,傳回相同的結果
Sheets(2).Name
Worksheets(2).Name

Sheets.Count
Worksheets.Count      
  • 分别代表兩種不同的集合

  Excel裡共有4中不同類型的工作表,Sheets表示公祖不裡所有類型的工作表的集合,而Worksheets隻表示普通工作表的集合。

  Sheets和Worksheets集合裡的對象都有标簽名稱Name、代碼名稱CodeName、索引号Index等屬性,也有Add、Delete、Copy和Move等方法,設定屬性和調用方法類似。但是因為Sheets集合包含更多類型的工作表,所有其包含的方法和屬性比Worksheets集合多。 

五、Range對象

1、Worksheet(或Range)對象的Range屬性

  • 引用單元格并指派

Worksheets("sheet1").Range("A1").Value=50 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rng()
    Range("A1:A10").Value = 200 '在活動工作表的A1:A10輸入值為200
    
    Dim n As String
    n = "B1:B10"
    Range(n) = 100 '在活動工作表的B1:B10輸入值為100
End Sub       
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 通過設定“單元格區域名稱”調用Range
Sub rng()
    Range("date").Value = 200
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 引用多個不連續的區域,用逗号隔開
Sub rng()
    Range("A1:A10,A4:E6,C3:D9").Value = 200
End Sub      
  • 用空格而不是逗号,則表示選中區域交集部分
Sub rng()
    Range("A1:B10 A4:D9").Value = 200
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

2、Worksheet(或Range)對象的Cells屬性

  •  指定單元格
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtCells()
    ActiveSheet.Cells(3, 4).Value = 20  '在第3行,第4列香蕉的單元格輸入20
    ActiveSheet.Cells(3, "D").Value = 30 '在第3行,第D列相交的單元格輸入30
    
    Range("B3:F9").Cells(2, 3) = 40 '在區域“B3:F9”區域中的第2行,第3列相交的單元格,即D4
    ActiveSheet.Cells(2).Value = 50 '在活動工作表的第二個單元格輸入50,這裡使用的數字2是單元格序号,序号是按照單元格區域内由左向右遞增
    
    '選中活動工作表的A1:E10
    Range(Cells(1, 1), Cells(10, 5)).Select
    
    '以下兩個語句等價
    Range("A1", "E10").Select
    Range(Range("A1"), Range("E10")).Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 全部單元格
Sub shtCells()
    ActiveSheet.Cells.Select  '選中活動工作表的所有單元格
    Range("B3:E9").Select '選中活動工作表中B3:E9單元格區域
End Sub      
  • 更簡短的快捷方式
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtCells()
    [A1] = 10
    [A1:B10] = 20
    [B3:D10 A4:G8] = 100 '公共交叉區域,如果兩個區域參數沒有逗号,表示一個參數,而參數表示的區域沒有交集的話會報錯
    [A1:A10,C1:C10,E1:E10] = 200 '合并區域
    [area] = 300 '名稱are代表單元格,即單元格名稱為area
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

  []是Application對象的Evaluate方法的簡寫形式,這種簡寫形式非常适合飲用一個固定的Range對象,但是因為不能再方括号中使用變量,是以這種引用方式缺少靈活性。

4、其他擷取單元格的方式(除了Range、Cells外)—Rows 

ActiveSheet.Rows '選中活動工作表的所有行
ActiveSheet.Rows(3).Select '選中活動工作表的第3行
ActiveSheet.Rows("3:3").Select '選中活動工作表的第3行
ActiveSheet.Rows("3:5").Select '選中活動工作表的第3行到第5行
Rows("3:10").Rows("1:1").Select '選中第3行到第10行區域内的第一行      

5、其他擷取單元格的方式(除了Range、Cells外)—Columns 

ActiveSheet.Columns  '選中活動工作表的所有列
ActiveSheet.Columns (6) '選中活動工作表中的第6列
ActiveSheet.Columns ("F:G") '選中活動工作表中的F至G列
Columns("B:G").Columns("B:B").Select '選中B:G區域中的第2列      

6、Application的Union方法

Union方法像一支強烈的粘合劑,将不連續的多個單元格區域粘在一起,可以同時對其進行操作。

Sub rngUnion()
    Application.Union(Range("A1:A10"), Range("D1:D5")).Select '入參至少為2個區域,至多30個區域,區域之間用逗号分隔
    Union(Range("A1:A10"), Range("D1:D5")).Select  'application可以省略不寫
End Sub      

7、Range對象的Offset屬性

 Offset屬性用來基于基于單元格的位置移動

Offset(x,y)兩個參數,x表示行移動,即x>0表示向下移動,x<0表示向上移動;y表示列移動,即y>0表示向右移動,y<0表示向左移動。

參數移動方向示意圖:

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngOffset()
    Range("A1").Offset(2, 3).Value = 500 '基于“A1”單元格,向下移動2行,向右移動3列
    Range("C5:D6").Offset(-3, 0).Select '在“C5:D6”區域的基礎上,向上移動3行,列方向參數為0,不移動。
End Sub      

8、Range對象的Resize屬性

 使用Range對象的Resize屬性擴大或縮小指定的單元格區域,得到一個新的單元格區域。

Resize共有兩個參數,第一個參數确定新區域的行數,第二個參數确定新區域的列數,兩個參數的值都是正整數,最小為1.

新區域把該對象最左上角的單元格當成自己左上角第一個單元格

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngResize()
    '将B2單元格擴大為B2:E6
    Range("B2").Resize(5, 4).Select
    
    '将B2:E6單元格縮小為B2:B3,新區域以B2單元格為最左上角單元格
    Range("B2:E6").Resize(2, 1).Select
    '上句等同于
    Range("B2:E6").Cells(1).Resize(2, 1).Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

9、Worksheet對象的UsedRange屬性

 UsedRange屬性傳回工作表中已經使用的單元格圍成的矩形區域(不管這些區域間是否有空行,空列或空單元格)。

Sub rngUsed()
    ActiveSheet.UsedRange.Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

10、Range對象的CurrentRegion屬性

 CurrentRegion傳回目前區域,即以空行和空行的組合為邊界的區域

Sub rngUsed()
    Range("D3").CurrentRegion.Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

11、Range對象的End屬性

 End屬性傳回目前區域結尾處的單元格,等同于在源單元格按<End+方向鍵(上下左右)>得到的單元格。

Sub rngEnd()
    Range("E5").End(xlUp).Select
End Sub      

共有4個參數,說明如下:

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

什麼情況會用到End屬性?工作表中記錄的行數随時都在變化,應該把新記錄寫入工作表的第5行還是第10行?

可以用End屬性解決這個問題

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngEnd()
    '取第一個單元格,如果非空則向下移動一個單元格,否則不移動。對新單元格進行指派
    Dim c As Range
    Set c = ActiveSheet.Range("A65536").End(xlUp)
    If c.Value <> "" Then
        Set c = c.Offset(1, 0)
    End If
    c.Value = "張青"
End Sub


Sub rngUsed()
    '取使用區域内行數增加1,對該行的A列進行指派
    Dim xrow As Long
    xrow = ActiveSheet.UsedRange.Rows.Count + 1
    Cells(xrow, "A").Value = "張青"
End Sub


Sub rngCurr()
    '取目前區域内行數增加1,對該行的A列進行指派
    Dim xrow As Long
    xrow = Range("A1").CurrentRegion.Rows.Count + 1
    Cells(xrow, "A").Value = "張青"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

六、操作單元格,還需要了解

1、單元格内容-Value

Range("A1:B2").Value = "abc"
Range("A1:B2") = "abc"  'Value是Range的預設屬性,在給區域指派時可以省略。      

2、單元格個數-Count

Range("B4:F10").Count   '統計單元格數量
ActiveSheet.UsedRange.Rows.Count '統計活動單元格的行數
ActiveSheet.UsedRange.Columns.Count  '統計活動單元格的列數      

3、單元格位址-Address

 MsgBox "目前選中的單元格位址為"&Selection.Address

4、選中單元格-Active與Select

以下兩組代碼是等效的。 

ActiveSheet.Range("A1:B10").Select
ActiveSheet.Range("A1:B10").Activate      

5、選擇性清除單元格-Clear 

Range("B2:B15").Clear '清除B2:B15單元格所有内容(包括批注、内容、注釋、格式等)
Range("B2:B15").ClearComments '清除B2:B15單元格批注
Range("B2:B15").ClearContents '清除B2:B15單元格内容
Range("B2:B15").ClearFormats '清除B2:B15單元格格式      

6、複制&粘貼單元格區域-Copy&Paste

  • 錄制複制和粘貼的宏内容如下:
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub Macro1()
    Range("A1").Select
    Selection.Copy
    Range("C1").Select
    ActiveSheet.Paste
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 但在執行複制或者粘貼操作之前并不需要選中單元格,是以代碼可以簡化為:
Sub Macro1()
    Range("A1").Copy Range("C1") 'A1是源單元格,C1是目标單元格
End Sub      
  • 帶參數的複制-Destination
Sub Macro1()
    Range("A1").Copy Destination:=Range("C1") 'A1是源單元格,C1是目标單元格,Destination是目标
End Sub      
  • 帶參數的複制-CurrentRegion

 要複制的單元格區域不能确定大小,可以隻指定一個單元格作為目标區域的最左上角單元格

Sub Macro1()
    Range("A1").CurrentRegion.Copy Range("C1") 'A1是源單元格,C1是目标單元格,Destination是目标
End Sub      
  • 想粘貼源區域的數值(以下兩個式子等價)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngCopyValue_1()
    Range("A1:A10").Copy
    Range("F1:F10").PasteSpecial Paste:=xlPasteValues '僅粘貼數值
End Sub
Sub rngCopyValue_2()
    Range("A1:A10").Value = Range("F1:F10").Value
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

7、剪切單元格-Cut 

Sub rngCut()
    Range("A1:A5").Cut Destination:=Range("G1") '把A1:A5剪切到G1:G5,這裡G1表示以G1為左上角第一個單元格的區域
    Range("F6:F10").Cut Range("G6") '把F1:F10剪切到G6:K10,參數Destination可以省略
End Sub      

8、删除單元格-Delete

 Delete有4個選項,分别對應如下參數:

Range("B5").Delete Shift:=xlToLeft '删除B5單元格,删除後右側單元格左移
Range("B5").Delete Shift:=xlUp '删除B5單元格,删除後下方單元格上移
Range("B5").EntireRow.Delete '删除B5單元格所在的行
Range("B5").EntireColumn.Delete '删除B5單元格所在的列      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

9、單元格名稱,Names集合

Excel中定義的名稱就是給單元格區域(或數值、常量、公式)取的名字,一個自定義的名稱及時一個Name對象,Names是工作簿中定義的所有名稱的集合。

  • 建立名稱

錄制的宏告訴我們,怎樣建立一個名稱

'Add建立名稱的方法,RefersToR1C1表示使用R1C1引用樣式
ActiveWorkbook.Names.Add Name = "date", RefersToR1C1:="Sheet1!R5C[-2]"      

R5C[-2]說明:R後面的數值表示行号,C後面的數值表示列号,[]中括号表示相對引用,預設是絕對引用,相對應用時R>0表示向下移動,C>0表示向右移動

R[2]C[3]:對活動單元格下方的第二行與右邊的第3列相交的單元格的引用

R2C3:對工作表中第二行與第3列相交的單元格的引用

  • 另一種單元格引用方式:A1樣式引用
'Add建立名稱的方法,RefersToR1C1表示使用A1引用樣式,$表示相對絕對引用,将把活動單元格當做A1單元格
ActiveWorkbook.Names.Add Name = "date", RefersTo:="Sheet1$B$4"      
  • 定義名稱更簡單的方式
Range("A1:C10") = "date"      
  • 怎樣引用名稱
ActiveWorkbook.Names("date").Name = "姓名"
ActiveWorkbook.Names("姓名").Name = "張三"      
  • 也可以使用名稱索引引用名稱
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub UseName()
    Dim i, mx As Integer
    mx = ActiveWorkbook.Names.Count '統計一共有多少個單元格
    For i = 1 To mx
        activateworkbook.Names(i).Visible = False '隐藏名稱
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

10、單元格批注,Comment對象

一個批注就是一個Comment對象,Comments是工作簿中所有Comment對象的集合

  • 給單元格增加批注
Range("B5").AddComment Text:="我用VBA建立的批注"      
  • 怎麼知道單元格是否有批注
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub wbComment()
    Range("B5").AddComment Text:="我用VBA建立的批注"
    If Range("B5").Comment Is Nothing Then '判斷是否存在Comment對象
        MsgBox "B5單元格中沒有批注"
    Else
        MsgBox "B5單元格中已有批注"
    End If
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 操作批注
Sub operComment()
    Range("B5").AddComment Text:="我用VBA建立的批注" '建立批注
    Range("B5").Comment.Visible = False '隐藏B5單元格批注
    Range("B5").Comment.Delete '删除B5單元格批注
End Sub      

11、給單元格化妝

  •  設定字型-Font
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub FontSet()
    With Range("A1:L1").Font
        .Name = "宋體" '設定字型為宋體
        .Size = 12 '設定字号為12号
        .Color = RGB(255, 0, 0) '設定字型顔色為紅色
        .Bold = True '設定字型加粗
        .Italic = True '設定字型傾斜顯示
        .Underline = xlUnderlineStyleDouble 'feud文字添加雙下劃線
    End With
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 給單元格增加底紋-Interior
Sub InteriorSet()
    Range("A1:L1").Interior.Color = RGB(255, 255, 0) '增加黃色底紋
End Sub      
  • 給表格設定表框
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub InteriorSet()
    With Range("A1").CurrentRegion.Borders
        .LineStyle = xlContinuous '設定單線邊框
        .Color = RGB(0, 0, 255) '設定邊框顔色
        .Weight = xlHairline '設定邊框線條樣式
    End With
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  • 其他設定

  可以在“單元格格式”對話框中進行其他設定,如果想用代碼實作而不知道代碼怎麼寫,可以手動操作,用宏錄制器錄下它。

七、典型的技巧與示例

1、編寫一個程式,按要求創求的一個新的工作簿,并把它儲存到指定的檔案夾。 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub wbAdd()
    '程式建立“員工花名冊”工作簿,儲存在本工作簿所在的檔案夾中
    Dim wb As Workbook, sht As Worksheet '定義一個Workbook對象和一個Worksheet對象
    Set wb = Workbooks.Add '建立一個工作簿
    Set sht = wb.Worksheets(1)
    With sht
        .Name = "花名冊"  '修改第一張工作表的标簽名稱
        .Range("A1:F1") = Array("序号", "姓名", "性别", "出生年月", "參加工作時間", "備注") '設定表頭
    End With
    wb.SaveAs ThisWorkbook.Path & "\員工花名冊.xls" '儲存建立的工作表到本工作簿所在的檔案夾中
    ActiveWorkbook.Close '關閉建立的工作簿
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

2、判斷工作簿是否打開

  • 工作簿是否打開判斷
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
'判斷"成績表.xls"工作簿是否打開
Sub isWbOpen()
    Dim i As Integer
    For i = 1 To Workbooks.Count
        If Workbooks(i).Name = "成績表.xls" Then
            MsgBox "檔案已打開"
            Exit Sub '如果找到該檔案,退出過程
        End If
    Next
    MsgBox "檔案沒有打開"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
  •  工作表是否打開判斷
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
'判斷打開的工作表中是否含“一年級”,有則移動到第一個位置,否則在第一個位置建立
Sub isShtOpen()
    Dim sht As Worksheet
    For Each sht In Worksheets
        If sht.Name = "一年級" Then
            sht.Move before:=Worksheets(1)
            'MsgBox "已經打開"
            Exit Sub
        End If
    Next
    Worksheets.Add(before:=Worksheets(1)).Name = "一年級"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

 另一種寫法:

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
'判斷打開的工作表中是否含“一年級”,有則移動到第一個位置,否則在第一個位置建立      
Sub isShtOpen()
    On Error Resume Next
    If Worksheets("一年級") Is Nothing Then
        Worksheets.Add(before:=Worksheets(1)).Name = "一年級"
    Else
        Worksheet("一年級").Move before:=Worksheets(1)
        'MsgBox "已經打開"
    End If
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

3、判斷工作簿是否存在 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub isExistWb()
    '判斷本工作簿所在的檔案夾中是否存在“員工花名冊.xls”
    Dim fil As String
    fil = ThisWorkbook.Path & "\員工花名冊.xls"
    If Len(Dir(fil)) > 0 Then
        MsgBox "工作簿已經存在"
    Else
        MsgBox "工作簿不存在"
    End If
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

4、向未打開的工作簿中錄入資料 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub WbInput()
    '在本工作簿所在的檔案夾下“員工花名冊”裡添加一條記錄
    Dim wb As String, xrow As Integer, arr
    wb = ThisWorkbook.Path & "\員工花名冊.xls"
    Workbooks.Open (wb)
    With ActiveWorkbook.Worksheets(1)
        xrow = .Range("A1").CurrentRegion.Rows.Count + 1
        arr = Array(xrow - 1, "張嬌", "女", "#7/8/1987#", "#9/1/2010#", "10年新招")
        .Cells(xrow, 1).Resize(1, 6) = arr
    End With
    ActiveWorkbook.Close savechanges:=True
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

5、隐藏活動工作表外的所有工作表 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub ShtVisible()
    '隐藏活動工作表外的所有工作表
    Dim sht As Worksheet
    For Each sht In Worksheet
        If sht.Name <> ActiveSheet.Name Then
            sht.Visible = xlSheetVeryHidden '深度隐藏,不能通過“格式”菜單顯示它
        End If
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

6、批量建立工作表 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtAdd()
    '一張成績表中儲存不同班級的資料,需要以班級名命名
    '根據C列的班級名建立不同的工作表
    Dim i As Integer, sht As Worksheet
    i = 2
    Set sht = Worksheets("成績表")
    Do While sht.Cells(i, "C") <> ""
        Worksheets.Add after:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = sht.Cells(i, "C").Value
        i = i + 1
    Loop
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

7、批量對資料分類 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub fenLei()
    '把成績按班級分到各個工作表中
    Dim i As Long, bj As String, rng As Range
    i = 2
    bj = Cells(i, "C").Value
    Do While bj <> ""
        '将分表中A列第一個空單元格賦給rng
        Set rng = Worksheets(bj).Range("A65536").End(xlUp).Offset(1, 0)
        Cells(i, "A").Resize(1, 7).Copy rng '将記錄指派到對應的工作表中
        i = i + 1
        bj = Cells(i, "C").Value
    Loop
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

清除工作表内容

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtClear()
    Dim sht As Worksheet
    For Each sht In Worksheets
        If sht.Name <> "成績表" Then
            sht.Range("A2:G65536").ClearContents
        End If
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

8、将工作表儲存為新工作簿 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub SaveToFile()
    '把各個工作表以單獨的工作簿檔案儲存在本工作簿所在的檔案夾下的“班級成績表”檔案夾下
    Application.ScreenUpdating = False '關閉螢幕更新
    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
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

換種寫法:

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub 自動拆分工作表()
'
' 自動拆分工作表 宏
'
' 快捷鍵: Ctrl+m
'
    '把各個工作表以單獨的工作簿檔案儲存在本工作簿所在的檔案夾下的“拆分工作簿”檔案夾下
    Application.ScreenUpdating = False '關閉螢幕更新
    Dim folder As String
    folder = Application.ActiveWorkbook.Path & "\拆分工作簿"
    '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    
    
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

9、快速合并多表資料 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub HeBing()
    '把各班級成績表合并到“總成績”工作表中
    Rows("2:25536").Clear '删除原有記錄
    Dim sht As Worksheet, xrow As Integer, rng As Range
    For Each sht In Worksheets  '周遊工作簿中所有工作表
        If sht.Name <> ActiveSheet.Name Then
            Set rng = Range("A65536").End(xlUp).Offset(1, 0) '獲得A列第一個空單元格
            xrow = sht.Range("A1").CurrentRegion.Rows.Count - 1 '記錄分表中記錄條數
            sht.Range("A2").Resize(xrow, 7).Copy rng '粘貼記錄到彙總表
        End If
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

10、彙總同檔案夾下多個工作簿數 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub HzwWb()
    '把目前下各個工作簿的資訊彙總到同檔案夾下的另一個工作簿的同一張工作表裡
    Dim r, c As Long
    r = 1 '表頭的行數
    c = 8 '表頭的列數
    Range(Cells(r + 1, "A"), Cells(65536, c)).ClearContents '清空彙總表中原資料
    Application.ScreenUpdating = False '關閉螢幕更新
    Dim FileName As String, wb As Workbook, sht As Worksheet, Erow As Long, fn As String, arr As Variant
    FileName = Dir(ThisWorkbook.Path & "\" & "*.xlsx")
    Do While FileName <> ""
        If FileName <> ThisWorkbook.Name Then '判斷檔案是否是本工作簿
            Erow = Range("A1").CurrentRegion.Rows.Count + 1 '取得彙總表中第一條空行行号
            fn = ThisWorkbook.Path & "\" & FileName
            Set wb = GetObject(fn) '将fn代表的工作簿對象賦給變量
            Set sht = wb.Worksheets(1) '彙總的是第一張工作表
            '将資料表中的記錄儲存在arr數組裡
            arr = sht.Range(sht.Cells(r + 1, "A"), sht.Cells(65536, "B").End(xlUp).Offset(0, 8))
            '将數組arr中的資料寫入工作表
            Cells(Erow, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
            wb.Close False
        End If
        FileName = Dir '用Dir函數取得其他檔案名,并指派給變量
    Loop
    Application.ScreenUpdating = True '恢複螢幕更新
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)

11、為工作表建立目錄 

Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub mkdir()
    '為工作簿中所有工作表建立目錄
    Rows("2:65536").ClearContents
    Dim sht As Worksheet, irow As Integer
    irow = 2
    For Each sht In Worksheets '周遊工作表
        Cells(irow, "A").Value = irow - 1 '寫入序号
        '寫入工作表名,并建立超連結
        ActiveSheet.Hyperlinks.Add anchor:=Cells(irow, "B"), Address:="", _
            SubAddress:="'" & sht.Name & "'!A1", TextToDisplay:=sht.Name
            irow = irows + 1 '行号加1
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub InputTest()
    Cells.ClearContents '清除表中所有資料
    Range("A1:A10") = 100
    MsgBox "剛才在A1:A10輸入數值100,你能看到結果嗎?"
    Range("B1:B10") = 200
    MsgBox "剛才在B1:B10輸入數值200,你能看到結果嗎?"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub InputTest()
    Cells.ClearContents '清除表中所有資料
    Application.ScreenUpdating = False '關閉螢幕更新
    Range("A1:A10") = 100
    MsgBox "剛才在A1:A10輸入數值100,你能看到結果嗎?"
    Range("B1:B10") = 200
    MsgBox "剛才在B1:B10輸入數值200,你能看到結果嗎?"
    Application.ScreenUpdating = True '恢複螢幕更新
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub delSht()
    Dim sht As Worksheet
    Application.DisplayAlerts = False '不顯示警告資訊
    For Each sht In Worksheets
        If sht.Name = ActiveSheet.Name Then '判斷sht是不是活動工作表
            sht.Delete '删除sht代表的工作表
        End If
    Next
    Application.DisplayAlerts = True '恢複顯示警告資訊
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Value = Target.Address
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Value = Target.Address
    Application.EnableEvents = False '禁用事件
    Target.Offset(1, 0).Select '選中活動單元格下面的一個單元格
    Application.EnableEvents = True '啟用事件
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub CountTest()
    Dim mycount As Integer, rng As Range
    For Each rng In Range("A1:B50")
        If rng.Value > 1000 Then mycount = mycount + 1
    Next
    MsgBox "A1:B50中大于1000的單元格個數為:" & mycount
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub CountTest()
    Dim mycount As Integer
    mycount = Application.WorksheetFunction.CountIf(Range("A1:B50"), ">1000")
    MsgBox "A1:B50中大于1000的單元格個數為:" & mycount
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub wbMsg()
    Range("B2") = ThisWorkbook.Name     '傳回目前工作簿名稱 練習 -副本.xlsm
    Range("B3") = ThisWorkbook.Path     '傳回目前工作簿路徑 C:\Users\ThinkPad\Desktop
    Range("B4") = ThisWorkbook.FullName '傳回當期工作簿帶名稱的路徑 C:\Users\ThinkPad\Desktop\練習 - 副本.xlsm
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub OpenFile()
    Workbooks.Open Filename:="F:\Book1.xls"
End Sub      
Sub OpenFile()
    Workbooks.Open "F:\Book1.xls"
End Sub      
Sub JhWb()
    Workbooks("Book1.xls").Activate '激活工作簿
End Sub      
Sub SaveWb()
    ThisWorkbook.Save   '儲存代碼所在的工作簿
End Sub      
Sub SaveWb()
    ThisWorkbook.SaveAs Filename:="D:\test.xls"
End Sub      
Sub SaveWb()
    ThisWorkbook.SaveCopyAs Filename:="D:\test.xls"
End Sub      
Sub CloseWb()
    Workbooks.Close '關閉所有打開的工作簿
End Sub      
Sub CloseWb()
    Workbooks("Book1.xls").Close  '關閉Book1.xls
End Sub      
Sub CloseWb()
    Workbooks("Book1.xls").Close savechanges:=True '關閉并儲存Book1.xls
End Sub      
Sub CloseWb()
    Workbooks("Book1.xls").Close True '關閉Book1.xls
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub wb()
    Workbooks.Add
    MsgBox "代碼所在的工作簿為:" & ThisWorkbook.Name & Chr(13) _
            & "目前活動工作簿為:" & ActiveWorkbook.Name
    ActiveWorkbook.Close savechanges:=False
End Sub       
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Worksheets.Item (1)     '引用工作表裡的第一張工作表
Worksheets (1)          '引用工作表裡的第一張工作表
Worksheets ("Sheet1")   '引用工作簿裡标簽名稱為"Sheet1"的工作表      
Sub ShowShtCode()
    MsgBox ActiveSheet.CodeName
End Sub      
Sub shtAdd()
    Worksheets.Add after:=Worksheets(1), Count:=3
End Sub      
Sub shtAdd()
    '在最後一個工作表後插入兩張工作表
    Worksheets.Add before:=Worksheets(Worksheets.Count), Count:=2
End Sub       
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtAdd()
    Worksheets.Add Before:=Worksheets(1)
    ActiveSheet.Name = "工資表"
End Sub      
Sub shtAdd()
    '在第一張工作表前插入一個名稱為“工資表”的工作表
    Worksheets.Add(before:=Worksheets(1)).Name = "工資表"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtCopy()
    '這裡的工作表名稱一定要存在,否則執行會報錯
    Worksheets("工資條").Copy  '不帶參數   複制工作表,同時建立工作簿用于存放copy來的工作表(未儲存狀态)
    Worksheets("工資條").Copy before:=Worksheets("Sheet1") '帶參數  複制工作表,存放在目前工作簿的工作表Sheet1之前
    Worksheets("工資條").Copy after:=Worksheets("Sheet1") '帶參數   複制工作表,存放在目前工作簿的工作表Sheet1之後
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtMove()
    Worksheets("工資條").Move   '不指定參數,将把工作表移動到新的工作簿中(建立工作簿)
    Worksheets("工資條").Move before:=Worksheets("Sheet1") '複制工作表,存放在目前工作簿的工作表Sheet1之前
    Worksheets("工資條").Move after:=Worksheets("Sheet1") '複制工作表,存放在目前工作簿的工作表Sheet1之後
End Sub      
'以下這三行代碼作用一樣,等同于從【格式】菜單中隐藏工作表
Worksheets("工資條").Visible = False
Worksheets("工資條").Visible = xlSheetHidden
Worksheets("工資條").Visible = 0      
Worksheets("工資條").Visible = xlSheetVeryHidden
Worksheets("工資條").Visible = 2      
Worksheets("工資條").Visible = True
Worksheets("工資條").Visible = xlSheetVisible
Worksheets("工資條").Visible = 1
Worksheets("工資條").Visible = -1      
Dim mycount%
mycount=Worksheets.Count       
Sheets(2).Name
Worksheets(2).Name

Sheets.Count
Worksheets.Count      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rng()
    Range("A1:A10").Value = 200 '在活動工作表的A1:A10輸入值為200
    
    Dim n As String
    n = "B1:B10"
    Range(n) = 100 '在活動工作表的B1:B10輸入值為100
End Sub       
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rng()
    Range("date").Value = 200
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rng()
    Range("A1:A10,A4:E6,C3:D9").Value = 200
End Sub      
Sub rng()
    Range("A1:B10 A4:D9").Value = 200
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtCells()
    ActiveSheet.Cells(3, 4).Value = 20  '在第3行,第4列香蕉的單元格輸入20
    ActiveSheet.Cells(3, "D").Value = 30 '在第3行,第D列相交的單元格輸入30
    
    Range("B3:F9").Cells(2, 3) = 40 '在區域“B3:F9”區域中的第2行,第3列相交的單元格,即D4
    ActiveSheet.Cells(2).Value = 50 '在活動工作表的第二個單元格輸入50,這裡使用的數字2是單元格序号,序号是按照單元格區域内由左向右遞增
    
    '選中活動工作表的A1:E10
    Range(Cells(1, 1), Cells(10, 5)).Select
    
    '以下兩個語句等價
    Range("A1", "E10").Select
    Range(Range("A1"), Range("E10")).Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtCells()
    ActiveSheet.Cells.Select  '選中活動工作表的所有單元格
    Range("B3:E9").Select '選中活動工作表中B3:E9單元格區域
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtCells()
    [A1] = 10
    [A1:B10] = 20
    [B3:D10 A4:G8] = 100 '公共交叉區域,如果兩個區域參數沒有逗号,表示一個參數,而參數表示的區域沒有交集的話會報錯
    [A1:A10,C1:C10,E1:E10] = 200 '合并區域
    [area] = 300 '名稱are代表單元格,即單元格名稱為area
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
ActiveSheet.Rows '選中活動工作表的所有行
ActiveSheet.Rows(3).Select '選中活動工作表的第3行
ActiveSheet.Rows("3:3").Select '選中活動工作表的第3行
ActiveSheet.Rows("3:5").Select '選中活動工作表的第3行到第5行
Rows("3:10").Rows("1:1").Select '選中第3行到第10行區域内的第一行      
ActiveSheet.Columns  '選中活動工作表的所有列
ActiveSheet.Columns (6) '選中活動工作表中的第6列
ActiveSheet.Columns ("F:G") '選中活動工作表中的F至G列
Columns("B:G").Columns("B:B").Select '選中B:G區域中的第2列      
Sub rngUnion()
    Application.Union(Range("A1:A10"), Range("D1:D5")).Select '入參至少為2個區域,至多30個區域,區域之間用逗号分隔
    Union(Range("A1:A10"), Range("D1:D5")).Select  'application可以省略不寫
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngOffset()
    Range("A1").Offset(2, 3).Value = 500 '基于“A1”單元格,向下移動2行,向右移動3列
    Range("C5:D6").Offset(-3, 0).Select '在“C5:D6”區域的基礎上,向上移動3行,列方向參數為0,不移動。
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngResize()
    '将B2單元格擴大為B2:E6
    Range("B2").Resize(5, 4).Select
    
    '将B2:E6單元格縮小為B2:B3,新區域以B2單元格為最左上角單元格
    Range("B2:E6").Resize(2, 1).Select
    '上句等同于
    Range("B2:E6").Cells(1).Resize(2, 1).Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngUsed()
    ActiveSheet.UsedRange.Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngUsed()
    Range("D3").CurrentRegion.Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngEnd()
    Range("E5").End(xlUp).Select
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngEnd()
    '取第一個單元格,如果非空則向下移動一個單元格,否則不移動。對新單元格進行指派
    Dim c As Range
    Set c = ActiveSheet.Range("A65536").End(xlUp)
    If c.Value <> "" Then
        Set c = c.Offset(1, 0)
    End If
    c.Value = "張青"
End Sub


Sub rngUsed()
    '取使用區域内行數增加1,對該行的A列進行指派
    Dim xrow As Long
    xrow = ActiveSheet.UsedRange.Rows.Count + 1
    Cells(xrow, "A").Value = "張青"
End Sub


Sub rngCurr()
    '取目前區域内行數增加1,對該行的A列進行指派
    Dim xrow As Long
    xrow = Range("A1").CurrentRegion.Rows.Count + 1
    Cells(xrow, "A").Value = "張青"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Range("A1:B2").Value = "abc"
Range("A1:B2") = "abc"  'Value是Range的預設屬性,在給區域指派時可以省略。      
Range("B4:F10").Count   '統計單元格數量
ActiveSheet.UsedRange.Rows.Count '統計活動單元格的行數
ActiveSheet.UsedRange.Columns.Count  '統計活動單元格的列數      
ActiveSheet.Range("A1:B10").Select
ActiveSheet.Range("A1:B10").Activate      
Range("B2:B15").Clear '清除B2:B15單元格所有内容(包括批注、内容、注釋、格式等)
Range("B2:B15").ClearComments '清除B2:B15單元格批注
Range("B2:B15").ClearContents '清除B2:B15單元格内容
Range("B2:B15").ClearFormats '清除B2:B15單元格格式      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub Macro1()
    Range("A1").Select
    Selection.Copy
    Range("C1").Select
    ActiveSheet.Paste
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub Macro1()
    Range("A1").Copy Range("C1") 'A1是源單元格,C1是目标單元格
End Sub      
Sub Macro1()
    Range("A1").Copy Destination:=Range("C1") 'A1是源單元格,C1是目标單元格,Destination是目标
End Sub      
Sub Macro1()
    Range("A1").CurrentRegion.Copy Range("C1") 'A1是源單元格,C1是目标單元格,Destination是目标
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngCopyValue_1()
    Range("A1:A10").Copy
    Range("F1:F10").PasteSpecial Paste:=xlPasteValues '僅粘貼數值
End Sub
Sub rngCopyValue_2()
    Range("A1:A10").Value = Range("F1:F10").Value
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub rngCut()
    Range("A1:A5").Cut Destination:=Range("G1") '把A1:A5剪切到G1:G5,這裡G1表示以G1為左上角第一個單元格的區域
    Range("F6:F10").Cut Range("G6") '把F1:F10剪切到G6:K10,參數Destination可以省略
End Sub      
Range("B5").Delete Shift:=xlToLeft '删除B5單元格,删除後右側單元格左移
Range("B5").Delete Shift:=xlUp '删除B5單元格,删除後下方單元格上移
Range("B5").EntireRow.Delete '删除B5單元格所在的行
Range("B5").EntireColumn.Delete '删除B5單元格所在的列      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
'Add建立名稱的方法,RefersToR1C1表示使用R1C1引用樣式
ActiveWorkbook.Names.Add Name = "date", RefersToR1C1:="Sheet1!R5C[-2]"      
'Add建立名稱的方法,RefersToR1C1表示使用A1引用樣式,$表示相對絕對引用,将把活動單元格當做A1單元格
ActiveWorkbook.Names.Add Name = "date", RefersTo:="Sheet1$B$4"      
Range("A1:C10") = "date"      
ActiveWorkbook.Names("date").Name = "姓名"
ActiveWorkbook.Names("姓名").Name = "張三"      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub UseName()
    Dim i, mx As Integer
    mx = ActiveWorkbook.Names.Count '統計一共有多少個單元格
    For i = 1 To mx
        activateworkbook.Names(i).Visible = False '隐藏名稱
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Range("B5").AddComment Text:="我用VBA建立的批注"      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub wbComment()
    Range("B5").AddComment Text:="我用VBA建立的批注"
    If Range("B5").Comment Is Nothing Then '判斷是否存在Comment對象
        MsgBox "B5單元格中沒有批注"
    Else
        MsgBox "B5單元格中已有批注"
    End If
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub operComment()
    Range("B5").AddComment Text:="我用VBA建立的批注" '建立批注
    Range("B5").Comment.Visible = False '隐藏B5單元格批注
    Range("B5").Comment.Delete '删除B5單元格批注
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub FontSet()
    With Range("A1:L1").Font
        .Name = "宋體" '設定字型為宋體
        .Size = 12 '設定字号為12号
        .Color = RGB(255, 0, 0) '設定字型顔色為紅色
        .Bold = True '設定字型加粗
        .Italic = True '設定字型傾斜顯示
        .Underline = xlUnderlineStyleDouble 'feud文字添加雙下劃線
    End With
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub InteriorSet()
    Range("A1:L1").Interior.Color = RGB(255, 255, 0) '增加黃色底紋
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub InteriorSet()
    With Range("A1").CurrentRegion.Borders
        .LineStyle = xlContinuous '設定單線邊框
        .Color = RGB(0, 0, 255) '設定邊框顔色
        .Weight = xlHairline '設定邊框線條樣式
    End With
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub wbAdd()
    '程式建立“員工花名冊”工作簿,儲存在本工作簿所在的檔案夾中
    Dim wb As Workbook, sht As Worksheet '定義一個Workbook對象和一個Worksheet對象
    Set wb = Workbooks.Add '建立一個工作簿
    Set sht = wb.Worksheets(1)
    With sht
        .Name = "花名冊"  '修改第一張工作表的标簽名稱
        .Range("A1:F1") = Array("序号", "姓名", "性别", "出生年月", "參加工作時間", "備注") '設定表頭
    End With
    wb.SaveAs ThisWorkbook.Path & "\員工花名冊.xls" '儲存建立的工作表到本工作簿所在的檔案夾中
    ActiveWorkbook.Close '關閉建立的工作簿
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
'判斷"成績表.xls"工作簿是否打開
Sub isWbOpen()
    Dim i As Integer
    For i = 1 To Workbooks.Count
        If Workbooks(i).Name = "成績表.xls" Then
            MsgBox "檔案已打開"
            Exit Sub '如果找到該檔案,退出過程
        End If
    Next
    MsgBox "檔案沒有打開"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
'判斷打開的工作表中是否含“一年級”,有則移動到第一個位置,否則在第一個位置建立
Sub isShtOpen()
    Dim sht As Worksheet
    For Each sht In Worksheets
        If sht.Name = "一年級" Then
            sht.Move before:=Worksheets(1)
            'MsgBox "已經打開"
            Exit Sub
        End If
    Next
    Worksheets.Add(before:=Worksheets(1)).Name = "一年級"
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
'判斷打開的工作表中是否含“一年級”,有則移動到第一個位置,否則在第一個位置建立      
Sub isShtOpen()
    On Error Resume Next
    If Worksheets("一年級") Is Nothing Then
        Worksheets.Add(before:=Worksheets(1)).Name = "一年級"
    Else
        Worksheet("一年級").Move before:=Worksheets(1)
        'MsgBox "已經打開"
    End If
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub isExistWb()
    '判斷本工作簿所在的檔案夾中是否存在“員工花名冊.xls”
    Dim fil As String
    fil = ThisWorkbook.Path & "\員工花名冊.xls"
    If Len(Dir(fil)) > 0 Then
        MsgBox "工作簿已經存在"
    Else
        MsgBox "工作簿不存在"
    End If
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub WbInput()
    '在本工作簿所在的檔案夾下“員工花名冊”裡添加一條記錄
    Dim wb As String, xrow As Integer, arr
    wb = ThisWorkbook.Path & "\員工花名冊.xls"
    Workbooks.Open (wb)
    With ActiveWorkbook.Worksheets(1)
        xrow = .Range("A1").CurrentRegion.Rows.Count + 1
        arr = Array(xrow - 1, "張嬌", "女", "#7/8/1987#", "#9/1/2010#", "10年新招")
        .Cells(xrow, 1).Resize(1, 6) = arr
    End With
    ActiveWorkbook.Close savechanges:=True
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub ShtVisible()
    '隐藏活動工作表外的所有工作表
    Dim sht As Worksheet
    For Each sht In Worksheet
        If sht.Name <> ActiveSheet.Name Then
            sht.Visible = xlSheetVeryHidden '深度隐藏,不能通過“格式”菜單顯示它
        End If
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtAdd()
    '一張成績表中儲存不同班級的資料,需要以班級名命名
    '根據C列的班級名建立不同的工作表
    Dim i As Integer, sht As Worksheet
    i = 2
    Set sht = Worksheets("成績表")
    Do While sht.Cells(i, "C") <> ""
        Worksheets.Add after:=Worksheets(Worksheets.Count)
        ActiveSheet.Name = sht.Cells(i, "C").Value
        i = i + 1
    Loop
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub fenLei()
    '把成績按班級分到各個工作表中
    Dim i As Long, bj As String, rng As Range
    i = 2
    bj = Cells(i, "C").Value
    Do While bj <> ""
        '将分表中A列第一個空單元格賦給rng
        Set rng = Worksheets(bj).Range("A65536").End(xlUp).Offset(1, 0)
        Cells(i, "A").Resize(1, 7).Copy rng '将記錄指派到對應的工作表中
        i = i + 1
        bj = Cells(i, "C").Value
    Loop
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub shtClear()
    Dim sht As Worksheet
    For Each sht In Worksheets
        If sht.Name <> "成績表" Then
            sht.Range("A2:G65536").ClearContents
        End If
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub SaveToFile()
    '把各個工作表以單獨的工作簿檔案儲存在本工作簿所在的檔案夾下的“班級成績表”檔案夾下
    Application.ScreenUpdating = False '關閉螢幕更新
    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
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub 自動拆分工作表()
'
' 自動拆分工作表 宏
'
' 快捷鍵: Ctrl+m
'
    '把各個工作表以單獨的工作簿檔案儲存在本工作簿所在的檔案夾下的“拆分工作簿”檔案夾下
    Application.ScreenUpdating = False '關閉螢幕更新
    Dim folder As String
    folder = Application.ActiveWorkbook.Path & "\拆分工作簿"
    '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    
    
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub HeBing()
    '把各班級成績表合并到“總成績”工作表中
    Rows("2:25536").Clear '删除原有記錄
    Dim sht As Worksheet, xrow As Integer, rng As Range
    For Each sht In Worksheets  '周遊工作簿中所有工作表
        If sht.Name <> ActiveSheet.Name Then
            Set rng = Range("A65536").End(xlUp).Offset(1, 0) '獲得A列第一個空單元格
            xrow = sht.Range("A1").CurrentRegion.Rows.Count - 1 '記錄分表中記錄條數
            sht.Range("A2").Resize(xrow, 7).Copy rng '粘貼記錄到彙總表
        End If
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub HzwWb()
    '把目前下各個工作簿的資訊彙總到同檔案夾下的另一個工作簿的同一張工作表裡
    Dim r, c As Long
    r = 1 '表頭的行數
    c = 8 '表頭的列數
    Range(Cells(r + 1, "A"), Cells(65536, c)).ClearContents '清空彙總表中原資料
    Application.ScreenUpdating = False '關閉螢幕更新
    Dim FileName As String, wb As Workbook, sht As Worksheet, Erow As Long, fn As String, arr As Variant
    FileName = Dir(ThisWorkbook.Path & "\" & "*.xlsx")
    Do While FileName <> ""
        If FileName <> ThisWorkbook.Name Then '判斷檔案是否是本工作簿
            Erow = Range("A1").CurrentRegion.Rows.Count + 1 '取得彙總表中第一條空行行号
            fn = ThisWorkbook.Path & "\" & FileName
            Set wb = GetObject(fn) '将fn代表的工作簿對象賦給變量
            Set sht = wb.Worksheets(1) '彙總的是第一張工作表
            '将資料表中的記錄儲存在arr數組裡
            arr = sht.Range(sht.Cells(r + 1, "A"), sht.Cells(65536, "B").End(xlUp).Offset(0, 8))
            '将數組arr中的資料寫入工作表
            Cells(Erow, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
            wb.Close False
        End If
        FileName = Dir '用Dir函數取得其他檔案名,并指派給變量
    Loop
    Application.ScreenUpdating = True '恢複螢幕更新
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)
Sub mkdir()
    '為工作簿中所有工作表建立目錄
    Rows("2:65536").ClearContents
    Dim sht As Worksheet, irow As Integer
    irow = 2
    For Each sht In Worksheets '周遊工作表
        Cells(irow, "A").Value = irow - 1 '寫入序号
        '寫入工作表名,并建立超連結
        ActiveSheet.Hyperlinks.Add anchor:=Cells(irow, "B"), Address:="", _
            SubAddress:="'" & sht.Name & "'!A1", TextToDisplay:=sht.Name
            irow = irows + 1 '行号加1
    Next
End Sub      
Excel-VBA常用對象(Application、Workbook、Worksheet、Range)