excelperfect 標(biāo)簽:VBA,對象模型 要編寫Excel VBA程序,必須知道對象??梢哉J(rèn)為,VBA基于面向?qū)ο缶幊?,這意味著VBA程序主要是在處理(或操控)對象。因此,我們要掌握ExcelVBA編程,必須理解: 1.什么是對象 2.如何操控VBA對象 3.Excel VBA對象模型 剛開始接觸對象和對象模型的朋友,可能會被一些概念搞糊涂,這是正常的,隨著不斷地學(xué)習(xí)和使用,你的理解會越來越深入,這些概念也會逐漸清晰起來。 基本說來,Excel VBA對象模型是編程時可以使用的對象的層次結(jié)構(gòu),它使得引用要操控的對象更容易。 
對象層次結(jié)構(gòu)如下: 層級1:在最頂端,只有一個對象。 層級2:層次結(jié)構(gòu)頂部的對象包含的一些對象。 層級3:層級2中的對象可能包含的一些對象。 層級4:層級3中的對象可能包含的一些對象。 … 對象可能包含其他對象。該過程會重復(fù),直到到達不包含任何其他對象的對象。 通常,層次結(jié)構(gòu)頂部的對象是Application對象,即層級1的對象是應(yīng)用程序本身。對于Excel來說,Application對象就是Excel本身。 Application對象包含其他VBA對象。Excel的Application對象包含的一些主要對象為: - Windows,包含應(yīng)用程序所有Window對象。
- Workbooks,包含所有Workbook對象。
這些VBA對象中的每一個又包含其他對象。例如,Workbook對象中包含的一些VBA對象如下:- Windows,包含指定Excel工作簿中的Window對象。
- Worksheets,包含Worksheet對象。
同樣,這些VBA對象包含其他對象。例如Worksheet對象包含下列VBA對象:ChartObjects,包含ChartObject對象。 Comment,代表單元格批注。 Hyperlink,代表超鏈接。 Name,代表為特定單元格區(qū)域定義的名稱。 PageSetup,用于存儲打印信息。 PivotTables,包含PivotTable對象。 Range,代表單元格、行、列、所選擇的單元格,或三維單元格區(qū)域。 如果以圖形描述,上述Excel VBA對象層次結(jié)構(gòu)大致如下所示: 注:上圖僅僅是Excel VBA對象模型層次結(jié)構(gòu)的很小一部分。但不要著急,在編程時,我們通常只使用其中一些常用的對象,即便需要使用一些不常見對象,也能很快在Excel對象模型參考中找到,或者通過宏錄制器錄制宏來找到想要用的對象。下面,我們來看看Excel VBA對象模型層次結(jié)構(gòu)背后的邏輯。集合有兩個顯著特征:它們本身就是對象;它們的主要目的是對同一類的VBA對象進行組合和管理。在某些情況下,集合非常有用。例如,假設(shè)想對一組特定的對象執(zhí)行某些操作,如果所有這些對象都是同一集合的一部分,則可以構(gòu)造VBA代碼以遍歷集合的每個成員并執(zhí)行所需的操作??梢韵氲玫剑@種結(jié)構(gòu)比單獨列出每個集合成員更簡單。所以,集合允許同時處理一組完整的VBA對象,而不是處理每個單個的對象。- Workbooks,當(dāng)前打開的所有Excel工作簿的集合。
- Worksheets,特定工作簿中所有Excel工作表的集合。
- Charts,特定工作簿內(nèi)所有圖表工作表。
- Sheets,特定工作簿中所有工作表的集合,此時與工作表類型無關(guān),包含常規(guī)工作表和圖表工作表。
在編寫VBA代碼時,了解如何引用對象是至關(guān)重要的。很明顯,想要開始處理特定的VBA對象時,必須先識別它,也就是說,告訴VBA要處理哪個對象。如果遍歷Excel VBA對象模型的整個層次結(jié)構(gòu)來引用對象,則稱為完全限定引用。我們已經(jīng)知道,Excel對象模型層次結(jié)構(gòu)的頂部是Application對象,因此引用這個對象很簡單,只需輸入:從這里開始,需要使用點(.)運算符開始沿著層次結(jié)構(gòu)移動,即使用點(.)將每個VBA對象連接到上一個對象(對象的父對象)。這些點(.)用于自上而下連接并引用ExcelVBA對象模型的成員。例如,假設(shè)要引用Range對象,參考上圖所示的對象模型層次結(jié)構(gòu),Range對象處于第4層: 現(xiàn)在,自頂而下使用(.)連接這些不同的對象,從而引用Range對象:Application.Workbooks.Worksheets.Range注意,這只是基本的引用框架,并沒有實際識別單個的VBA對象,即如果有幾個工作簿或工作表,如何知道引用哪個?如何知道要處理的具體單元格區(qū)域。這就需要處理如何引用集合內(nèi)的特定對象??梢允褂脙煞N方法。方法1:使用對象名稱,其語法為:集合名(“對象名”)。例如,如果要處理工作表Sheet1,則可以使用:方法2:使用索引號,其語法為:集合名(索引號)。這樣,上面的代碼可修改為:好了,解釋清楚這些后,我們回過去看如何引用具體的Range對象。假設(shè)要處理工作簿Book1的工作表Sheet1中的單元格A1,則其完全限定引用為:Application.Workbooks(“Book1.xlsm”).Worksheets(“Sheet1”).Range(“A1”)正如你所看到的,完全限定引用需要編寫很長的代碼,繁瑣且難以閱讀。實際上,可以簡化對象引用,使代碼更簡短。之所以能夠簡化完全限定引用,是因為Excel VBA對象模型有一些默認(rèn)的對象,當(dāng)沒有明確輸入時,Excel會假設(shè)你引用的是這些對象。Excel總是假設(shè)你在處理Application對象,因此,可以從引用中忽略該對象。這樣,上面的完全限定引用代碼可簡化為:Workbooks(“Book1.xlsm”).Worksheets(“Sheet1”).Range(“A1”)情形2:當(dāng)前工作簿和當(dāng)前工作表Excel總是假設(shè)你在處理當(dāng)前工作簿(標(biāo)準(zhǔn)模塊中代碼所在的工作簿),如果你的目的是處理當(dāng)前工作簿,則上面的代碼可進一步簡化為:Worksheets(“Sheet1”).Range(“A1”)如果你要處理的工作表是當(dāng)前活動工作表,代碼又可簡化為:如果想要精通Excel VBA,那么必須掌握ExcelVBA對象模型的原理。隨著不斷的學(xué)習(xí)和實踐,你會更清楚其中的細節(jié),ExcelVBA對象模型的結(jié)構(gòu)和使用也會越來越熟練。歡迎在下面留言,完善本文內(nèi)容,讓更多的人學(xué)到更完美的知識。
|