Excel的操作基本都是圍繞工作簿、表單、單元格展開的,這些就是Excel操作的核心對象,所以VBA操作的核心對象也是它們。了解了這些核心的對象與它們支持的功能,我們就可以很方便的開發(fā)各種應(yīng)用。 了解了這一點(diǎn),我們先來分析一下Excel核心對象與我們看到的Excel文件的對應(yīng)關(guān)系:
從這個(gè)描述中,我們可以很容易的看出每個(gè)對象的層級(jí)關(guān)系和包含關(guān)系:
這個(gè)縱向的關(guān)系就如下圖所示: 靜態(tài)的分析完這些以后,下面我們動(dòng)態(tài)的分析一個(gè)常見的操作:打開一個(gè)Excel文件,Excel會(huì)自動(dòng)做哪些事呢?當(dāng)我們打開多個(gè)Excel文檔后,這些對象有什么變化呢? 打開第一個(gè)Excel文檔的時(shí)候,Excel會(huì)實(shí)例化一個(gè)Application對象代表Excel應(yīng)用,然后實(shí)例化一個(gè)Workbook代表當(dāng)前的工作簿,然后實(shí)例化相應(yīng)的Worksheet和更底層的其他對象。當(dāng)再次打開別的文檔的時(shí)候,由于Application對象已經(jīng)存在了,所以,只會(huì)實(shí)例化新的Workbook,Worksheet等對象,而不同的Workbook對象之間并不會(huì)互相干涉。當(dāng)我們操作Excel中的各種對象的時(shí)候,基本都是選中并激活對象,然后通過鼠標(biāo)或鍵盤完成各種功能。這個(gè)過程是簡單的,但是很直觀,很有用,其實(shí)自動(dòng)化這些操作的過程,就是我們使用VBA腳本模擬這個(gè)過程的過程。 從上面的分析我們已經(jīng)得到了核心對象的關(guān)系,在下面我總結(jié)了這些核心對象最常用的一些屬性和方法。 1. Application Application代表的是Excel應(yīng)用程序,從核心的操作對象包含關(guān)系分析得到下列成員: Workbooks - 類別:集合/屬性,返回類型:Workbook集合,含義:當(dāng)前打開的所有Excel文件的集合 Worksheets/Sheets - 類別:集合/屬性,返回類型:Worksheet集合,含義:當(dāng)前活動(dòng)的Excel文件中Worksheet的集合 Rows - 類別:集合/屬性,返回類型:Range,含義:當(dāng)前活動(dòng)Sheet的所有行 Columns - 類別:集合/屬性,返回類型:Range,含義:當(dāng)前活動(dòng)Sheet的所有列 Cells - 類別:屬性,返回類型:Range,含義:當(dāng)前活動(dòng)Sheet中所有的單元格 ThisWorkbook - 類別:屬性,返回類型:Workbook, 含義:當(dāng)前正在運(yùn)行的Macro所在的Excel文件 ActiveWorkbook - 類別:屬性,返回類型:Workbook,含義:當(dāng)前活動(dòng)的Excel文件 ActiveSheet - 類別:屬性,返回類型:Worksheet,含義:當(dāng)前活動(dòng)的Sheet ActiveCell - 類別:屬性,返回類型:Range,含義:當(dāng)前活動(dòng)的單元格(不一定是一個(gè),可能是一組) Range - 類別:屬性,返回類型:Range,含義:指定的一組單元格,需要提供參數(shù) Selection - 類別:屬性,返回類型:選中的對象類型(如Range,Chart等),含義:當(dāng)前Macro執(zhí)行的目標(biāo)文件中選中的對象 WorksheetFunction - 類別:集合/屬性,返回類型:WorksheetFunction對象,含義:返回所有Worksheet內(nèi)置的函數(shù) 從Application代表著可視化元素分析得到下列成員: Dialogs - 類別:集合/屬性,返回類型:Dialogs集合,含義:Excel所有內(nèi)置的對話框 CommandBars - 類別:集合/屬性,返回類型:CommandBars集合,含義:Excel所有菜單和工具欄 StatusBar - 類別:屬性,返回類型:String,含義:Excel狀態(tài)欄上的文本 InputBox - 類別:方法,返回類型:Variant,含義:顯示一個(gè)讓用戶輸入的對話框,可以指定錄入的數(shù)據(jù)類型并驗(yàn)證。如果點(diǎn)擊取消,則返回False。 其余常用的方法成員: Run:運(yùn)行執(zhí)行的宏或函數(shù)。 Quit:退出Excel。 SendKeys:模擬鍵盤操作(%代表Alt, ^代表Ctrl, +代表Shift,其余特殊鍵如Tab要加'{}',如'{Tab}', '{Enter}'等),這個(gè)函數(shù)一般用于當(dāng)不能用Excel中的對象和函數(shù)解決相關(guān)問題的時(shí)候,可以模擬用戶按鍵盤的方式完成默寫功能。 OnTime:延時(shí)運(yùn)行一個(gè)函數(shù)。 Evaluate:計(jì)算傳入字符串參數(shù)代表的對象或值。 GoTo:選中指定條件的范圍并激活。 ActivateMicrosoftApp:激活一個(gè)微軟的程序,比如計(jì)算器(0),Word(1)等等。 GetOpenFileName:打開“打開文件”對話框,返回選中的文件的名字,但并不真打開。 GetSaveAsFileName:打開“另存為”對話框,返回用戶選中或輸入的名字,但并不真保存。 ActiveWindow:獲得當(dāng)前活動(dòng)的窗口。 FindFile:顯示“打開文件”對話框,并打開選中文件,打開成功則返回True,否則返回False。 Intersect:獲得兩個(gè)Range對象的重疊區(qū)域。 其它常用的屬性成員: ScreenUpdating:是否關(guān)閉屏幕刷新,一般一些操作的時(shí)候不想立即顯示出來,就可以先關(guān)閉,做完操作以后開啟。 DisplayStatusBar: 是否顯示狀態(tài)欄。 Version:當(dāng)前Excel的版本號(hào)(12代表2007,14代表2010...),保存文檔選擇格式的時(shí)候可以使用這個(gè)信息。 DefaultFilePath:打開或保存文件時(shí)的默認(rèn)路徑。 CutCopyMode:推出剪切/復(fù)制模式的話,程序中選中目標(biāo)的虛線框就不顯示了,一般如果有剪切或復(fù)制操作后,都要把這個(gè)設(shè)為false。 DisplayAlerts:是否顯示警告框。 FileDialog:獲得“打開文件”對話框?qū)ο螅梢杂肧how去顯示,也可以設(shè)置這個(gè)對話框的一些屬性。 2. Workbook 描述層級(jí)關(guān)系的幾個(gè)成員: Worksheets/Sheets - 類別:集合/屬性,返回類型:Worksheets集合,含義:當(dāng)前活動(dòng)的Excel文件中Worksheet的集合。 Connections - 類別:集合/屬性,返回類型:Connections集合,含義:當(dāng)前數(shù)據(jù)源的數(shù)據(jù)連接。 ActiveSheet - 類別:屬性,返回類型:Worksheet,含義:當(dāng)前活動(dòng)的Sheet。 其它常用的屬性: Name:指定Workbook對應(yīng)的Excel文件的文件名。 FullName:指定Workbook對應(yīng)的Excel文件的全路徑。 Names:指定Workbook中所有命名的名字集合。 Path:指定Workbook對應(yīng)的Excel文件的路徑(不包含文件名)。 Password:打開Workbook需要的密碼。 Saved:指示當(dāng)前的Workbook是否已經(jīng)保存了,是只讀的。 其它常用的方法: Activate:激活指定的Workbook。 Close:關(guān)閉Workbook對應(yīng)的文件。 Save:保存Workbook對應(yīng)的文件。 SaveAs:另存為新的文件,不會(huì)出現(xiàn)對話框。 RefreshAll:刷新Workbook中所有的外部數(shù)據(jù)資源與數(shù)據(jù)透視源。 3. Worksheet 常用的成員包括: Name - 類別:屬性,含義:獲取或設(shè)置指定Worksheet的名字。在Excel中,手動(dòng)操作是雙擊Sheet的名字位置,然后修改。 Copy - 類別:方法,含義:復(fù)制Sheet到新的位置,會(huì)生成新的Sheet。 Delete - 類別:方法,含義:刪除Sheet。 Move - 類別:方法,含義:移動(dòng)Sheet到新的位置。 Paste - 類別:方法,含義:粘貼Clipboard中的內(nèi)容到Sheet中。 PivotTables - 類別:方法,含義:返回當(dāng)前Sheet中的指定的數(shù)據(jù)透視表或者所有數(shù)據(jù)透視表。 Rows - 類別:集合/屬性,含義:返回當(dāng)前Sheet中的所有行 Columns - 類別:集合/屬性,含義:返回當(dāng)前Sheet中的所有列 Cells - 類別:集合/屬性,含義:返回當(dāng)前Sheet中的所有的單元格(用行和列的Index標(biāo)識(shí)) Range - 類別:集合/屬性,含義:返回當(dāng)前Sheet中的所有單元格(用行列的字符串標(biāo)識(shí)) UsedRange - 類別:集合/屬性,含義:返回當(dāng)前Sheet中的用戶使用的范圍,這個(gè)是相當(dāng)有用,它的很多屬性都是居家生活必備良品。 Shapes - 類別:集合/屬性,含義:返回當(dāng)前Sheet中所有的Shape對象,如自選圖形,多邊形,OLE對象,圖片等。 4. Range 與 Cells 實(shí)際上,Excel的對象中并沒有Cell對象,所有的Cell相關(guān)的區(qū)域全部用Range來標(biāo)識(shí)。同時(shí)Cells是存在的,它代表當(dāng)前Sheet中所有的單元格,它的類型是Range,它存在的價(jià)值在于:Range用字符串來標(biāo)識(shí)單元格,但是有時(shí)候循環(huán)的時(shí)候,用行列的Index來標(biāo)識(shí)單元格更方便操作,特別是當(dāng)要處理當(dāng)前Sheet中的所有單元格時(shí),Cells就派上用場了。 Range對象是Excel操作最為核心的對象,幾乎所有的操作最終都是反映到該對象上,所以熟悉這個(gè)對象的常用成員是非常重要的。要引用Range對象,可以直接使用單元格區(qū)域的名字,地址等字符串,設(shè)置起始結(jié)束單元格格式,除了這個(gè),使用Offset,Resize方法,或者最簡單的使用'[]'也可以引用相關(guān)Range對象。例如: Range('A1')=1
Range('MyCell').Value = 1 '使用了單元格的名稱 Range('A1:B10').Value = 1 Range('A1, A3, A5') = 'XYZ' Range('A1', 'B10') = 1 strValue = [A1:B1]
Range(Cells(0,0),Cells(5,5)).Clear Range('A:A').EntireColumn.AutoFit '自動(dòng)調(diào)整A列寬度 Range對象常用的成員如下所示: Row, Column:返回Range對象中所有區(qū)域中第一塊區(qū)域的第一行行號(hào),第一列列號(hào),返回類型為Long。 Rows, Columns:返回該Range對象包含的所有行,所有列,返回類型為Range。 CurrentRegion:返回四面被空行和空列包圍的一個(gè)新的Range對象,這個(gè)新的Range對象包含當(dāng)前Range對象(不管當(dāng)前的Range是不是空行空列),這個(gè)屬性在相當(dāng)一部分操作中都是很重要的,特別是當(dāng)目標(biāo)Range的行列位置不確定時(shí)可以用這個(gè)屬性返回目標(biāo)區(qū)域。 Count:返回Range對象包含的單元格的數(shù)目,返回類型為Long。 Value:Value代表Range對象的值,類型為Variant,可讀可寫,寫的時(shí)候會(huì)把Range中所有單元格都設(shè)為相同值。 Offset, Resize, End:這幾個(gè)都與選擇Range的范圍有關(guān),Offset強(qiáng)調(diào)返回Range對象指定偏移方向上的單元格,執(zhí)行這個(gè)操作后返回的是偏移后的單元格;Resize強(qiáng)調(diào)擴(kuò)充當(dāng)前的Range對象;End返回包含該Range的指定方向上的最后一個(gè)單元格,常用于返回用戶使用的最大的行與列。 Formula:返回或設(shè)置Range對象的公式,用于大范圍填充或計(jì)算數(shù)據(jù)時(shí)很方便。 AutoFill:自動(dòng)填充Range對象中的所有單元格,用于大范圍填充數(shù)據(jù)時(shí)很方便。 SpecialCells:返回Range對象中滿足一定條件的單元格,返回類型為Range,用于大范圍填充數(shù)據(jù)的時(shí)候,配合使用可以有奇效。 Select, Clear, Copy, Cut, Paste, PasteSpecial, Delete:這一組為最基本的操作,不解釋。 MergeCells:返回Range對象中是否包含合并的單元格,返回類型為Boolean。 Merge, UnMerge:合并,取消合并Range對象中的單元格。 Areas:Range對象可以是不連續(xù)的,每個(gè)不連續(xù)的區(qū)間就用Area標(biāo)識(shí)。 Address:Range對象的地址,以行列形式返回字符串,這個(gè)有時(shí)候很方便。 VerticalAlignment, HorizentalAlignment:Range對象中單元格的對齊方式。 Worksheet:當(dāng)前Range所在的Sheet,屬于反向的引用,有時(shí)候能派上用場。 5. Selection Selection代表了Sheet中選中的內(nèi)容,如果選中的是單元格,那么它返回的就是Range對象,如果選中的是其他元素,則返回的就是其他對象。它是Application的一個(gè)相當(dāng)重要的屬性。一般來說,當(dāng)Range對象執(zhí)行Select方法后,Selection的表演就正式開始了。之所以單拿出這個(gè)屬性來強(qiáng)調(diào)一下,是因?yàn)樗牡匚缓苤匾砹艘环N操作思想,雖然選中單元格再操作并不總是很好的手法(說來說去還是效率的問題,后面我會(huì)單獨(dú)總結(jié)一下這個(gè)方面的做法),但是很多時(shí)候,這么做確實(shí)是很多人的首要選擇,原因很簡單,因?yàn)楹茏匀?,很直觀,我們可以看著Excel一步一步完成我們想要的每個(gè)步驟。 在VB編輯器中,按快捷鍵Ctrl+J可以顯示Intellisense列表。 對象有默認(rèn)屬性,使用對象時(shí)如果不指定屬性,則使用默認(rèn)屬性。一般不建議使用,容易引入Bug。 到Range對象時(shí),我已經(jīng)不再區(qū)分屬性和方法了,在VBA語法中這個(gè)實(shí)在沒太大區(qū)別,使用的時(shí)候需要傳參數(shù)就傳即可。 注意對象的賦值用的是“Set...=...”語法。 在無二義性的前提下,VBA中支持省略父對象而直接使用屬性,如直接使用Selection,代表使用的是Application.Selection。 最好的資料就是MSDN,這是Excel資料的鏈接:http://msdn.microsoft.com/en-us/library/bb149081(v=office.12).aspx 存在即合理,常用、重要都是相對的,不要小瞧任何對象和成員。 |
|