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