使用VBA在Excel環(huán)境下開發(fā)應(yīng)用程序,實際就是訪問和控制Excel各個對象的過程。
Excel提供了對象瀏覽器(視圖→對象瀏覽器)(F2):
目錄
1 VBA對象
2 VBA對象的事件
3 對象的選擇和引用
4 Range對象和Worksheet對象的Select(選定)和Activate(激活)方法的區(qū)別
5 單元格區(qū)域的端點選擇
6 已選取單元格區(qū)域范圍和大小
7 選取全部單元格
8 選擇特定單元格
9 按偏移量重置區(qū)域引用
10 模擬Ctrl+方向鍵產(chǎn)生的單元格
11 引用當(dāng)前對象
12 其它引用方式
13 工作表操作
14 工作簿操作
15 Application對象
在Excel中,對象是指一組屬性及這組屬性上的專用操作的封裝體。屬性可以是一些數(shù)據(jù),也可以是另一個對象。
如何用代碼表示對象?VBA用名詞來表示對象,用動詞來表示對象的方法;
當(dāng)對象是一個容器時,它會包含若干子對象,使用序號參數(shù)引用集合中的子對象;VBA的對象具有層次性,如:
Application.Workbooks("module").Worksheets("model").range("A1")
每個對象模型都包含兩種對象模型:集合對象與個體對象,如Workbooks、workbook;
常用對象的寫法
應(yīng)用程序?qū)ο螅篈pplication;
工作簿對象:Workbook;
工作表對象:Worksheet;
單元格對象:Range;
圖形對象:Shape;
圖表對象:Chart;
名稱對象:Name;
容器對象:Windows;
以上對象部分支持復(fù)數(shù)形式(集合),如WorkSheets。集合對象通常有Count、Add等方法;可以使用循環(huán)遍歷集合中的對象。
如何自動調(diào)用屬性和方法?名稱后加一個小圓點,如:
ActiveSheets.Range("A1").Activate
ActiveCell.Value=34
1.1 設(shè)置對象屬性
1.1.1 設(shè)置屬性值
對象名.屬性名 = 屬性值表達(dá)式
Sheet1.Range("A1").value = "test"
1.1.2 讀取屬性值
變量名 = 對象名.屬性名
dim r
r = Sheet1.Range("A1").value
1.2 調(diào)用對象方法
對象名.方法名稱
Sheet1.Range("A1").clear
1.3 對象變量和數(shù)組
變量和數(shù)組除了直接存儲值,還可以引用對象。將對象分配給變量的優(yōu)點如下:
變量名通常要比訪問對象本身所需的方法和屬性的完整路徑短而且容易記憶;
與通過所需的方法或?qū)傩詠碇貜?fù)訪問對象本身相比,使用引用對象的變量更有效;
在代碼運行期間,可以更改變量以引用其他對象;
VBA對象除了屬性和方法以外,還有事件。
事件的價值在于讓代碼按預(yù)定的條件自動執(zhí)行;事件所關(guān)連的過程將在事件發(fā)生時自動執(zhí)行,所以事件也稱為自動化過程,它不需要人工調(diào)用,而且事件發(fā)生時,代碼也隨之執(zhí)行,可見對象的事件賦予了對象更靈活的特征。
可以想像一下事件對于編程的重要性,以住需要單擊菜單,鍵入快捷鍵來執(zhí)行過程,而配合事件時可自動化執(zhí)行,只要滿足條件即可執(zhí)行相應(yīng)的代碼;
事件的本質(zhì)是對象在某些內(nèi)部操作時允許開發(fā)者執(zhí)行自定義操作;
Excel事件包括:
應(yīng)用程序事件;
工作簿事件;
工作表事件;
窗體事件;
窗體中的控件事件;
每個事件都依附在事件的全體對象之上;
事件過程的名稱包含有兩項內(nèi)容:對象和動作;在代碼窗口的上方有兩個下拉列表,以下兩項組合成事件的名稱:
“通用”:對象窗口;
“聲明”:過程窗口:事件的動作;
多數(shù)事件過程都有參數(shù),這些參數(shù)通常與觸發(fā)事件的條件相關(guān);
事件過程的參數(shù)是不能修改的,事件過程的名稱則允許修改;
設(shè)置事件是否自動執(zhí)行:Application.EnableEvents=False
按時執(zhí)行代碼:Application.Onkey;
Application.OnTime(EarliestTime,Procedure,LatestTime
3.1 對象的層次與引用方式
對象的逐層引用;
使用對象名稱引用對象:Workbooks("財務(wù)表.xls");
使用復(fù)數(shù)形式表示對象集合;
引用子對象:Workbooks("生產(chǎn)表.xls").Worksheets("1月");
使用序號參數(shù)引用集合中的子對象:Worksheets(1);
引用父對象:Range("a1").Parent.Name(用于獲取工作表的名稱);
引用活動對象:ActiveWorkbook.Worksheets("總表");VBA專門給活動對象賦予了一個特別的稱謂,通常使用“Active”表示活動對象;ActiveWindow,ActiveWorkbook,ActiveSheet,ActiveCell,ActiveChart,當(dāng)調(diào)用活動對象的子對象時,可以忽略活動對象名稱,直接引用其子對象;
利用with語句引用重復(fù)出現(xiàn)的對象;
3.2 Range對象
Range("A1")引用方式
引用單元格:Range("a1");Range("B"&i+5);
引用行與列:Range("B:B");Range("B:Z");Range("2:2");Range("2:5");Columns(1);Rows(2);
引用區(qū)域:Range("a1:c5");
引用多區(qū)域:Range("C4:C11,E4:E11);
Cells(1,1)引用方式
[a1]引用方式;
活動單元格:ActiveCell
下一個單元格:Next
屏幕坐標(biāo)下的單元格:Window.RangeFromPoint
選區(qū):Application.Selection、Window.RangeSelection
當(dāng)前區(qū)域:Range().CurrentRegion是指以包含當(dāng)前單元格且以空行與空列的組合為邊界的區(qū)域;
按寬度與高度重置區(qū)域:Range.Resize;Range("B2").Resize(2,3)
引用多區(qū)域的合集:Union(Range("A1:B10"), Range("c1:c10"));
引用多區(qū)域的交集:Intersect(Range("A1:B10"), Range("c1:c10"));
利用名稱引用區(qū)域:ActiveWorkbook.Names.Add "成績", "=$A$2:$A$10";
3.3 圖形對象Shapes、DrawingObjects
3.4 表對象Sheets
xlChart
xlDialogSheet
xlWorksheet
3.5 Selection對象
表示對選擇區(qū)域的操作,可以用With語句,如:
With Selection.Font
.Size=22
.ColorIndex = 6
End With
Range對象和Worksheet對象都有Select(選定)和Activate(激活)方法,其區(qū)別和聯(lián)系如下:
4.1 從功能上來說,Select代表選定對象,Activate代表激活對象。
4.2 從數(shù)量上來說,Select可以選定多個對象,Activate只能激活一個對象。
4.3 對于單個對象,Select和Activate是一樣的。
4.4 Activate的對象必定在Select對象之中。當(dāng)選定了多個對象時,其中某個對象必定是激活的對象。在已經(jīng)Select的對象中,可以任意指定Activate的對象。如果Activate了當(dāng)前Select對象之外的對象,則相當(dāng)于重新執(zhí)行了一次Select并激活。
4.5 在每次重新Select之后,則系統(tǒng)會自動Activate其中的某個對象。
4.6 一般的寫法:
select,selection
Activate,activecell
activecell.CurrentRegion.Select
5.1 選取B列第一個非空單元格
If Range("B1") = "" Then
Range("B1").End(xlDown).Selcet
Else
Range("B1").Selcet
End if
5.2 選取B列最后一個非空單元格
Range("B65536".End(xlUp).Select
5.3 選取11列最左邊非空單元格
If Range("A11") = "" Then
Range("A11").End(xlToRight).Selcet
Else
Range("A11").Selcet
End if
5.4 選取第17行最右邊非空單元格
Range("IV17").End(xlToLeft).Select
(end()方法單元格的選取,從空到非空,從非空到空;)
6.1 返回選取區(qū)域的總行數(shù)和總列數(shù)
Selection.Rows.count
Selection.Columns.count
6.2 返回選取區(qū)域的第一行的行號
Selection.Row
6.3 返回選取區(qū)域左上角的單元格
Selection.Range("A1").Address
6.4 返回選取區(qū)域右上角的單元格
Cells(Selection.Row,Selection.Column+Selection.Columns.Count-1).Address
6.5 返回選取區(qū)域左下角的單元格
Cells(Selection.Row+Selection.Row.Count-1,Selection.Column).Address
6.6 返回選取區(qū)域右下角的單元格
Selection.Cells(Selection.Cells.count).Address
7.1 Cells.select
7.2 Rows.select
7.3 Columns.select
8.1 選取當(dāng)前已使用的單元格:ActiveSheet.UsedRange.Select
8.2 選取的指定單元格相鄰的區(qū)域:Range("address").CurrentRegion.Select
8.3 按條件引用區(qū)域(選取特定內(nèi)容單元格):Range("address").SpecialCells(單元格類型變量)
如:選擇某一列的全部空行:Columns(1).specialCells(xlCellTypeBlanks).EntireRow
Range.SpecialCells(Type,Value)是指定位條件符合的單元格;如:
ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants,7).Select
Range對象的SpecialCells方法可以返回一代表與指定類型和值匹配的區(qū)域。它的具體參數(shù)為:
表達(dá)式.SpecialCells(Type,Value)其中“表達(dá)式”表示單元格對象,“Type”參數(shù)表未單元格類型,“Value”參數(shù)是可選參數(shù),只在“Type”參數(shù)為xlCellTypeConstants或xlCellTypeFormulas時用,用于確定結(jié)果中應(yīng)包含哪幾類單元格。
Range對象的Offset屬性可以返回一個Range對象,代表位于指定單元格區(qū)域的一定的偏移量位置上的區(qū)域。其具體語法如下:
Range.Offset(RowOffset,ColumnOffset)
Resize用于調(diào)整指定區(qū)域的大小,返回代表調(diào)整后的區(qū)域。它有具體語法為:Range.Resize(RowSize,ColumnSize)
其中參RowSize代表重置后的行數(shù),ColumnSize代表重置后的列數(shù),兩個參數(shù)皆為可選參數(shù)。
Range.Offset(RowOffset,ColumnOffset)
Offset(A1,2,1,6,3),表示,以A1為參照點,偏移(2,1),選取6行3列;
Range("A1").Offset(2,1).Resize(6,3).Select
Offset參數(shù)更多的是使用變量;常配合End屬性使用,如合并工作簿或工作表時,將所有工作表的數(shù)據(jù)復(fù)制到匯總表中,要求按先后順序排列,不能覆蓋上一次合并的內(nèi)容,此時需要定位非空行的下一行,然后再粘貼數(shù)據(jù),而此需求需要將End配合Offset使用。
Worksheets("二月").usedRange.Copy Worksheets("總表").Cells(Rows.Count,1).End(xlUp).Offset(1,0)
Range對象的End屬性正好對應(yīng)于以上四個快捷鍵,可以實現(xiàn)最上端、最下端、最左端和最右端的切換。它的具體語法為:
Range.End(Direction)
End表示引用源區(qū)域的區(qū)域尾端的單元格
如果活動單元格在一個較大的數(shù)據(jù)區(qū)域中間,按下快捷鍵【Ctrl+上箭頭】、【Ctrl+下箭頭】、【Ctrl+左箭頭】、【Ctrl+右箭頭】可以迅速將當(dāng)前單元格移至已用區(qū)域的邊緣;如果整個工作表均為空白則可以在最小行、最小列或者最大行、最大列之間切換;如果在空白區(qū)向數(shù)區(qū)域使用同方向的快捷鍵,則可以定位于該行(列)的第一個或者最后一個非空單元格。
參數(shù) | 常量 | 說明 |
xlToLeft | 1 | 向左 |
xlToRight | 2 | 向右 |
xlUp | 3 | 向上 |
xlDown | 4 | 向下 |
前面的對象引用方式可以確??偰苷_的引用對象,然而卻是犧牲效率來實現(xiàn)的。當(dāng)所引用的對象是當(dāng)前活動對象時VBA提供了簡化的引用方式。
在引用活動對象時是不需要羅列其上層對象的,而是直接使用“ActiveCell”或者“ActiveWorkbook”等等。
在寫法上較后者更簡潔,而且在執(zhí)行效率上也有大大的優(yōu)勢。
如果在工作表事件中使用Me,則它代表當(dāng)前工作表;如果在工作簿事件中使用Me,則它代表工作簿;如果在窗體中使用Me,則它代表窗體對象。
利用定義名稱獲取對象:Sheets(1).Shapes("按鈕 2").Width = Sheets(1).Shapes("按鈕 1").Width * 2
利用集合中的索引號來調(diào)用對象:Sheets(1).Shapes(i).Width = 100
13.1 隱藏和顯示工作表
隱藏工作表:Worksheet.Visible=xlSheetHidden;(可用右鍵)
深度隱藏工作表:Worksheet.Visible=xlSheetVeryHidden;(需要用VBA代碼才可以顯示)
顯示所有隱藏的工作表:Worksheet.Visible=xlSheetVisible;
添加工作表:Worksheets.Add(Before,After,Count,Type)
Workbooks.Open Filename:="", Password:=""
判斷一個工作簿是否打開
For x = 1 To Workbooks.Count
If Workbooks(x).Name = "" Then
etc
End If
Next x
判斷一個工作簿的存在
For x = 1 To sheets.Count
If Workbooks(x).Name = "" Then
etc
End If
Next x
15.1 用Caption屬性設(shè)置主窗口標(biāo)題欄;
15.2 用StatusBar屬性控制狀態(tài)欄;
15.3 用ScreenUpdating屬性控制屏幕更新;
15.4 用DisplayAlerts屬性控制警報信息;
15.5 用SendKeys方法模擬鍵盤輸入;
15.6 用OnTime方法定時執(zhí)行過程;
15.7 用OnKey方法自定義功能鍵;
15.8 用WorksheetFunction屬性調(diào)用內(nèi)置函數(shù)
15.9 用Union方法合并單元格;
-End-
聯(lián)系客服