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