Excel VBA的語法就不多說了, 從最重要的Application開始
Application對象代表Excel程序本身, 對Application的操作會直接影響Excel程序
廢話不多說, 直接上代碼
先來介紹一下Application的常用屬性:
1.ActiveCell 當前激活的(1個)單元格, 一個Range對象, 注意是一個格子
- Dim myRange As Range
- '下述四種寫法等同
- Set myRange = Application.ActiveCell '如果窗口沒有顯示工作表,則此屬性無效
- Set myRange = ActiveWindow.ActiveCell
- Set myRange = ActiveCell '懶人寫法, 后續(xù)會有很多Application下的屬性可以去掉Application的前綴
- Set myRange = Application.ActiveWindow.ActiveCell
獲取到單元格的Range對象就能對其進行操作了:(語法就不介紹了)
- With ActiveCell '獲取當前激活的單元格
- .Value = '哈哈'
- With .Font
- .Bold = True
- .Italic = True
- .Size = 18
- End With
- End With
把(1個)格子的內(nèi)容設(shè)置為'哈哈', 加粗,斜體,字號182. Selection 基本概念和ActiveCell類似, 與之不同的是Selection可以表示多個單元格, 依然是一個Range對象
- Dim r As range
- Set r = Application.Selection
- r.Value = 1
3.ActiveWorkbook 當前激活的一個工作簿,是一個Workbook對象
- Dim wb As Workbook
- '下述兩種寫法等同
- Set wb = Application.ActiveWorkbook
- Set wb = ActiveWorkbook '又是懶人寫法
如果當前的Excel是空的, 就是說沒有打開任何一個Workbook(工作簿) 上面的wb會是Nothing (VBA里的空)
每個Workbook對象都有一個Application屬性, 貌似(Excel對象都有這個屬性), 表示該對象所屬的Application(這個Application是對象)- Dim app As Application
- Dim app2 As Application
- Set app = Application
- Set app2 = Application.ActiveWorkbook.Application
- If app = app2 Then 'I'sure. 這里會輸出OK, 說明是同一個Application對象
- Debug.Print 'OK' 'Debug.Print 會將后面的文字內(nèi)容輸出到'立即窗口' (如果沒看到立即窗口, 請:Ctrl+G)
- Else
- Debug.Print 'Fail'
- End If
4.Workbooks, Worksheets, Sheets
Application.Workbooks用于獲取當前打開的(多個)工作簿
- For i = 1 To WorkBooks.Count '這里也可以寫全Application.WorkBooks.Count
- Debug.Print WorkBooks(i).name
- Next
Applicaton.Sheets用于獲取當前(激活的)工作簿下的所有工作表, 包括圖表(Chart)- For i = 1 To Application.Sheets.Count '同樣可以偷懶 Sheets.Count 一旦省略前綴基本上都是'激活的'(worksheet或者Workbook)
- Debug.Print Application.Sheets(i).name
- Next
- For i = 1 To Application.Worksheets.Count
- Debug.Print Application.Worksheets(i).name
- Next
Application.Caption = 'Haha'
注意一點, 這個可是沒有'懶人寫法'的
. 如果你想懶一下 Caption = 'Haha' VBA會把Caption當作一個新變量的試試下面這個
Application.Caption = ''
6. Range 上面在提到ActiveCell時說過Range, ActiveCell是一個Range對象, 這里的Range是一個屬性, 但它同時也是一個Range對象, 是不是有點暈. 別擔心
可以把Application.Range理解為一個方法(或者函數(shù)), Application.Range需要一個參數(shù), 來返回參數(shù)指定的(n個)單元格, 看個例子先:
Application.Range('A1').Value = 100
這句話, 把Application(就是Excel) 當前激活的Workbook(工作簿)下的激活的Worksheet(工作表)下的Range('A1') (這里就是A1單元格) 的值設(shè)置為數(shù)字100
完整寫法就是:
- Dim r As range 'r是一個Range對象
- Set r = Application.Range('A1')
- r.Value = 100
r 是一個Range對象, Application.Range('A1')返回一個Range對象, 而Application.Range本身是Application的屬性再看看這個:
Application.Range('A1:B2').Value = 'Haha'
也許你會問, 這樣用Range屬性太麻煩了 ,還必須有前面激活的工作簿,工作表, 太不靈活了.
沒錯, Range屬性不僅僅在Application下, 同樣也存在于Worksheet下, OK, 聰明的你估計已經(jīng)想到該怎么寫了:
只要獲取到了一個我想要的Worksheet對象(工作表), 我就能訪問指定的范圍Range(...)
Application.Worksheets('Sheet1').Range('A1').Value = 76000
當然,細心的你也許發(fā)現(xiàn)了:這里沒有說是哪個Workbook, 沒錯, 這里的Workbook不是激活的那個Workbook, 而是你在寫VBA程序的那個Workbook7. ScreenUpdating 屏幕更新, 用于設(shè)置是否將VBA的執(zhí)行的中間結(jié)果顯示在Excel表中
顯然, 關(guān)閉屏幕更新, 會使得VBA的執(zhí)行速度更快.
我們可以做個實驗, 比較關(guān)閉前后的用時.
- Dim startTime As Date
- Dim endTime As Date
- For t = 0 To 1
- Application.ScreenUpdating = (t = 1)
- startTime = Time
- For Each c In ActiveSheet.Columns
- If c.Column Mod 2 = 0 Then
- c.Hidden = True
- End If
- Next
- endTime = Time
- x = (endTime - startTime) * 24 * 60 * 60
- If Application.ScreenUpdating Then
- Debug.Print 'ScreenUpdating Enabled: ' & x & ' sec.'
- Else
- Debug.Print 'ScreenUpdating Disabled: ' & x & ' sec.'
- End If
- Next
ScreenUpdating Disabled: 0 sec.
ScreenUpdating Enabled: 3.99999999999743 sec.
所以,執(zhí)行復雜操作時很慢, 有可能就是沒有關(guān)閉ScreenUpdating屬性
8. StatusBar和DisplayStatusBar
Application.StatusBar就是Excel的狀態(tài)欄, 而Application.DisplayStatusBar意思是否顯示狀態(tài)欄,一個Boolean變量
- Application.DisplayStatusBar = True
- Application.StatusBar = '正在打開文檔...'
- Application.StatusBar = False '設(shè)為False就是恢復Excel狀態(tài)欄的原來狀態(tài)
聯(lián)系客服