电竞比分网-中国电竞赛事及体育赛事平台

分享

VBA|Excel對(duì)象、事件、對(duì)象的選擇和引用

 thchen0103 2017-11-06

使用VBA在Excel環(huán)境下開發(fā)應(yīng)用程序,實(shí)際就是訪問和控制Excel各個(gè)對(duì)象的過程。

Excel提供了對(duì)象瀏覽器(視圖→對(duì)象瀏覽器)(F2):

VBA|Excel對(duì)象、事件、對(duì)象的選擇和引用

目錄

1 VBA對(duì)象

2 VBA對(duì)象的事件

3 對(duì)象的選擇和引用

4 Range對(duì)象和Worksheet對(duì)象的Select(選定)和Activate(激活)方法的區(qū)別

5 單元格區(qū)域的端點(diǎn)選擇

6 已選取單元格區(qū)域范圍和大小

7 選取全部單元格

8 選擇特定單元格

9 按偏移量重置區(qū)域引用

10 模擬Ctrl+方向鍵產(chǎn)生的單元格

11 引用當(dāng)前對(duì)象

12 其它引用方式

13 工作表操作

14 工作簿操作

15 Application對(duì)象

1 VBA對(duì)象

在Excel中,對(duì)象是指一組屬性及這組屬性上的專用操作的封裝體。屬性可以是一些數(shù)據(jù),也可以是另一個(gè)對(duì)象。

如何用代碼表示對(duì)象?VBA用名詞來表示對(duì)象,用動(dòng)詞來表示對(duì)象的方法;

當(dāng)對(duì)象是一個(gè)容器時(shí),它會(huì)包含若干子對(duì)象,使用序號(hào)參數(shù)引用集合中的子對(duì)象;VBA的對(duì)象具有層次性,如:

Application.Workbooks("module").Worksheets("model").range("A1")

每個(gè)對(duì)象模型都包含兩種對(duì)象模型:集合對(duì)象與個(gè)體對(duì)象,如Workbooks、workbook;

常用對(duì)象的寫法

應(yīng)用程序?qū)ο螅篈pplication;

工作簿對(duì)象:Wo(hù)rkbook;

工作表對(duì)象:Worksheet;

單元格對(duì)象:Range;

圖形對(duì)象:Shape;

圖表對(duì)象:Chart;

名稱對(duì)象:Name;

容器對(duì)象:Windows;

以上對(duì)象部分支持復(fù)數(shù)形式(集合),如WorkSheets。集合對(duì)象通常有Count、Add等方法;可以使用循環(huán)遍歷集合中的對(duì)象。

如何自動(dòng)調(diào)用屬性和方法?名稱后加一個(gè)小圓點(diǎn),如:

ActiveSheets.Range("A1").Activate

ActiveCell.Value=34

1.1 設(shè)置對(duì)象屬性

1.1.1 設(shè)置屬性值

對(duì)象名.屬性名 = 屬性值表達(dá)式

Sheet1.Range("A1").value = "test"

1.1.2 讀取屬性值

變量名 = 對(duì)象名.屬性名

dim r

r = Sheet1.Range("A1").value

1.2 調(diào)用對(duì)象方法

對(duì)象名.方法名稱

Sheet1.Range("A1").clear

1.3 對(duì)象變量和數(shù)組

變量和數(shù)組除了直接存儲(chǔ)值,還可以引用對(duì)象。將對(duì)象分配給變量的優(yōu)點(diǎn)如下:

  • 變量名通常要比訪問對(duì)象本身所需的方法和屬性的完整路徑短而且容易記憶;

  • 與通過所需的方法或?qū)傩詠碇貜?fù)訪問對(duì)象本身相比,使用引用對(duì)象的變量更有效;

  • 在代碼運(yùn)行期間,可以更改變量以引用其他對(duì)象;

2 VBA對(duì)象的事件

VBA對(duì)象除了屬性和方法以外,還有事件。

事件的價(jià)值在于讓代碼按預(yù)定的條件自動(dòng)執(zhí)行;事件所關(guān)連的過程將在事件發(fā)生時(shí)自動(dòng)執(zhí)行,所以事件也稱為自動(dòng)化過程,它不需要人工調(diào)用,而且事件發(fā)生時(shí),代碼也隨之執(zhí)行,可見對(duì)象的事件賦予了對(duì)象更靈活的特征。

可以想像一下事件對(duì)于編程的重要性,以住需要單擊菜單,鍵入快捷鍵來執(zhí)行過程,而配合事件時(shí)可自動(dòng)化執(zhí)行,只要滿足條件即可執(zhí)行相應(yīng)的代碼;

事件的本質(zhì)是對(duì)象在某些內(nèi)部操作時(shí)允許開發(fā)者執(zhí)行自定義操作;

Excel事件包括:

應(yīng)用程序事件;

工作簿事件;

工作表事件;

窗體事件;

窗體中的控件事件;

每個(gè)事件都依附在事件的全體對(duì)象之上;

事件過程的名稱包含有兩項(xiàng)內(nèi)容:對(duì)象和動(dòng)作;在代碼窗口的上方有兩個(gè)下拉列表,以下兩項(xiàng)組合成事件的名稱:

“通用”:對(duì)象窗口;

“聲明”:過程窗口:事件的動(dòng)作;

多數(shù)事件過程都有參數(shù),這些參數(shù)通常與觸發(fā)事件的條件相關(guān);

事件過程的參數(shù)是不能修改的,事件過程的名稱則允許修改;

設(shè)置事件是否自動(dòng)執(zhí)行:Application.EnableEvents=False

按時(shí)執(zhí)行代碼:Application.Onkey;

Application.OnTime(EarliestTime,Procedure,LatestTime

3 對(duì)象的選擇和引用

3.1 對(duì)象的層次與引用方式

  • 對(duì)象的逐層引用;

  • 使用對(duì)象名稱引用對(duì)象:Workbooks("財(cái)務(wù)表.xls");

  • 使用復(fù)數(shù)形式表示對(duì)象集合;

  • 引用子對(duì)象:Workbooks("生產(chǎn)表.xls").Worksheets("1月");

  • 使用序號(hào)參數(shù)引用集合中的子對(duì)象:Worksheets(1);

  • 引用父對(duì)象:Range("a1").Parent.Name(用于獲取工作表的名稱);

  • 引用活動(dòng)對(duì)象:ActiveWorkbook.Worksheets("總表");VBA專門給活動(dòng)對(duì)象賦予了一個(gè)特別的稱謂,通常使用“Active”表示活動(dòng)對(duì)象;ActiveWindow,ActiveWorkbook,ActiveSheet,ActiveCell,ActiveChart,當(dāng)調(diào)用活動(dòng)對(duì)象的子對(duì)象時(shí),可以忽略活動(dòng)對(duì)象名稱,直接引用其子對(duì)象;

  • 利用with語句引用重復(fù)出現(xiàn)的對(duì)象;

3.2 Range對(duì)象

  • 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]引用方式;

  • 活動(dòng)單元格:ActiveCell

  • 下一個(gè)單元格: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 "成績(jī)", "=$A$2:$A$10";

3.3 圖形對(duì)象Shapes、DrawingObjects

3.4 表對(duì)象Sheets

xlChart

xlDialogSheet

xlWorksheet

3.5 Selection對(duì)象

表示對(duì)選擇區(qū)域的操作,可以用With語句,如:

With Selection.Font

.Size=22

.ColorIndex = 6

End With

4 Range對(duì)象和Worksheet對(duì)象的Select(選定)和Activate(激活)方法的區(qū)別

Range對(duì)象和Worksheet對(duì)象都有Select(選定)和Activate(激活)方法,其區(qū)別和聯(lián)系如下:

4.1 從功能上來說,Select代表選定對(duì)象,Activate代表激活對(duì)象。

4.2 從數(shù)量上來說,Select可以選定多個(gè)對(duì)象,Activate只能激活一個(gè)對(duì)象。

4.3 對(duì)于單個(gè)對(duì)象,Select和Activate是一樣的。

4.4 Activate的對(duì)象必定在Select對(duì)象之中。當(dāng)選定了多個(gè)對(duì)象時(shí),其中某個(gè)對(duì)象必定是激活的對(duì)象。在已經(jīng)Select的對(duì)象中,可以任意指定Activate的對(duì)象。如果Activate了當(dāng)前Select對(duì)象之外的對(duì)象,則相當(dāng)于重新執(zhí)行了一次Select并激活。

4.5 在每次重新Select之后,則系統(tǒng)會(huì)自動(dòng)Activate其中的某個(gè)對(duì)象。

4.6 一般的寫法:

select,selection

Activate,activecell

activecell.CurrentRegion.Select

5 單元格區(qū)域的端點(diǎn)選擇(B5:G17)

5.1 選取B列第一個(gè)非空單元格

If Range("B1") = "" Then

Range("B1").End(xlDown).Selcet

Else

Range("B1").Selcet

End if

5.2 選取B列最后一個(gè)非空單元格

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 已選取單元格區(qū)域范圍和大?。˙5:D14)

6.1 返回選取區(qū)域的總行數(shù)和總列數(shù)

Selection.Rows.count

Selection.Columns.count

6.2 返回選取區(qū)域的第一行的行號(hào)

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 選取全部單元格的方法

7.1 Cells.select

7.2 Rows.select

7.3 Columns.select

8 選擇特定單元格

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對(duì)象的SpecialCells方法可以返回一代表與指定類型和值匹配的區(qū)域。它的具體參數(shù)為:

表達(dá)式.SpecialCells(Type,Value)其中“表達(dá)式”表示單元格對(duì)象,“Type”參數(shù)表未單元格類型,“Value”參數(shù)是可選參數(shù),只在“Type”參數(shù)為xlCellTypeConstants或xlCellTypeFormulas時(shí)用,用于確定結(jié)果中應(yīng)包含哪幾類單元格。

9 按偏移量重置區(qū)域引用

Range對(duì)象的Offset屬性可以返回一個(gè)Range對(duì)象,代表位于指定單元格區(qū)域的一定的偏移量位置上的區(qū)域。其具體語法如下:

Range.Offset(RowOffset,ColumnOffset)

Resize用于調(diào)整指定區(qū)域的大小,返回代表調(diào)整后的區(qū)域。它有具體語法為:Range.Resize(RowSize,ColumnSize)

其中參RowSize代表重置后的行數(shù),ColumnSize代表重置后的列數(shù),兩個(gè)參數(shù)皆為可選參數(shù)。

Range.Offset(RowOffset,ColumnOffset)

Offset(A1,2,1,6,3),表示,以A1為參照點(diǎn),偏移(2,1),選取6行3列;

Range("A1").Offset(2,1).Resize(6,3).Select

Offset參數(shù)更多的是使用變量;

常配合End屬性使用,如合并工作簿或工作表時(shí),將所有工作表的數(shù)據(jù)復(fù)制到匯總表中,要求按先后順序排列,不能覆蓋上一次合并的內(nèi)容,此時(shí)需要定位非空行的下一行,然后再粘貼數(shù)據(jù),而此需求需要將End配合Offset使用。

Worksheets("二月").usedRange.Copy Worksheets("總表").Cells(Rows.Count,1).End(xlUp).Offset(1,0)

10 模擬Ctrl+方向鍵產(chǎn)生的單元格

Range對(duì)象的End屬性正好對(duì)應(yīng)于以上四個(gè)快捷鍵,可以實(shí)現(xiàn)最上端、最下端、最左端和最右端的切換。它的具體語法為:

Range.End(Direction)

End表示引用源區(qū)域的區(qū)域尾端的單元格

如果活動(dòng)單元格在一個(gè)較大的數(shù)據(jù)區(qū)域中間,按下快捷鍵【Ctrl+上箭頭】、【Ctrl+下箭頭】、【Ctrl+左箭頭】、【Ctrl+右箭頭】可以迅速將當(dāng)前單元格移至已用區(qū)域的邊緣;如果整個(gè)工作表均為空白則可以在最小行、最小列或者最大行、最大列之間切換;如果在空白區(qū)向數(shù)區(qū)域使用同方向的快捷鍵,則可以定位于該行(列)的第一個(gè)或者最后一個(gè)非空單元格。

參數(shù)常量說明
xlToLeft1向左
xlToRight2向右
xlUp3向上
xlDown4向下

11 引用當(dāng)前對(duì)象

  • 前面的對(duì)象引用方式可以確保總能正確的引用對(duì)象,然而卻是犧牲效率來實(shí)現(xiàn)的。當(dāng)所引用的對(duì)象是當(dāng)前活動(dòng)對(duì)象時(shí)VBA提供了簡(jiǎn)化的引用方式。

  • 在引用活動(dòng)對(duì)象時(shí)是不需要羅列其上層對(duì)象的,而是直接使用“ActiveCell”或者“ActiveWorkbook”等等。

  • 在寫法上較后者更簡(jiǎn)潔,而且在執(zhí)行效率上也有大大的優(yōu)勢(shì)。

  • 如果在工作表事件中使用Me,則它代表當(dāng)前工作表;如果在工作簿事件中使用Me,則它代表工作簿;如果在窗體中使用Me,則它代表窗體對(duì)象。

12 其它引用方式

  • 利用定義名稱獲取對(duì)象:Sheets(1).Shapes("按鈕 2").Width = Sheets(1).Shapes("按鈕 1").Width * 2

  • 利用集合中的索引號(hào)來調(diào)用對(duì)象:Sheets(1).Shapes(i).Width = 100

13 工作表操作

13.1 隱藏和顯示工作表

隱藏工作表:Worksheet.Visible=xlSheetHidden;(可用右鍵)

深度隱藏工作表:Worksheet.Visible=xlSheetVeryHidden;(需要用VBA代碼才可以顯示)

顯示所有隱藏的工作表:Worksheet.Visible=xlSheetVisible;

添加工作表:Worksheets.Add(Before,After,Count,Type)

14 工作簿操作

Workbooks.Open Filename:="", Password:=""

判斷一個(gè)工作簿是否打開

For x = 1 To Workbooks.Count

If Workbooks(x).Name = "" Then

etc

End If

Next x

判斷一個(gè)工作簿的存在

For x = 1 To sheets.Count

If Workbooks(x).Name = "" Then

etc

End If

Next x

15 Application對(duì)象

15.1 用Caption屬性設(shè)置主窗口標(biāo)題欄;

15.2 用StatusBar屬性控制狀態(tài)欄;

15.3 用ScreenUpdating屬性控制屏幕更新;

15.4 用DisplayAlerts屬性控制警報(bào)信息;

15.5 用SendKeys方法模擬鍵盤輸入;

15.6 用OnTime方法定時(shí)執(zhí)行過程;

15.7 用OnKey方法自定義功能鍵;

15.8 用WorksheetFunction屬性調(diào)用內(nèi)置函數(shù)

15.9 用Union方法合并單元格;

-End-

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多