免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Excel VBA與數(shù)據(jù)統(tǒng)計 第四章 對象

第四章 對象

第一節(jié) 什么是對象Excel VBA中的對象

4.1.1 對象和類

所謂對象就是自然界存在是一切實體,所謂類就是這些實體在人腦中的一個“劃分”。例如,“人類”是一個類,而一個具體的人,例如張王李趙這樣的個體,就是“人類”這個類中的一個對象。“電腦”也是一個類,具體到“這臺電腦”就是電腦這個類的一個對象了。

在VBA中,“對象”一詞來源于英語“Object”,指Excel中可以操作的具體對象。在VBA中,除了類和對象之外,還有父類和子類、父對象和自對象的概念。

父類和子類,在類別劃分的領域,人們總是習慣地把一個類規(guī)劃為另一個類中的一部分。例如,“人類”和“猿類”同屬于“靈長類“,”圓珠筆“和”筆記本“同屬于”辦公用品“。在這種一個類中包含另一個類的劃分結構中把包含其他類型的類稱為“父類“,而被包含是類稱為“子類”。在上面的兩個例子中,“靈長類“是”人類“和”猿類“的”父類“,而”筆記本“和”圓珠筆“是”辦公用品“的”子類“

父對象和子對象,與父類和子類的定義相同,一個”父對象“中包含了許多可以操作的”子對象“,就好比一個具體的人,是一個具體的對象。而這個人的四肢、眼睛、鼻子、耳朵就是這個人這個父對象的”子對象“。顯然,無論是父對象還是子對象,都是可以直接操作的對象,也就是具體的事物,但是這些事務之間又有著”包含“的關系。

4.1.2 Excel VBA中的對象

在Excel VBA中,有著4大對象,即Application對象、WorkBook對象、WorkSheet對象和Range對象。這四大對象之間是上級和下級,父對象和子對象的關系。

Application對象:Excel VBA中最高級別的對象,這個對象就是整個Excel VBA應用程序,在這個對象中,可以實現(xiàn)對應用程序級別的任何調用。

WorkBook對象 Excel VBA中的工作簿對象,這個對象是在Excel VBA中的參與操作的工作簿。

WorkSheet對象 Excel VBA中的工作表對象,這個對象是在一個工作簿中的一個工作表。在Excel 工作簿中,可以添加和刪除工作表。這些工作表的關系就是這個工作簿的”子集“

Range 對象 Excel VBA中的單元格對象,這個對象是一個工作表中的一個單元格或者一個單元格區(qū)域,這一部分是Excel VBA操作的重點,也是本書重點闡述的內容。

第二節(jié) 對象的屬性和方法

4.2.2 對象的屬性

操作對象在某一個方面的特征,稱為這個對象的”屬性“例如,對于一個具體的人,這個人的姓名就是他的一個屬性,性別是另一個屬性,顯然,對于一個具體的對象,其屬性也是一個具體的數(shù)值。

對于確定的對象,可以讀取這個對象的某一個屬性,例如,對于一臺電腦,可以獲知這臺電腦的廠家、品牌、內存大小、處理器情況等。

對象的屬性,有些屬性可以修改,修改對象的屬性并不會影響對這個對象的其他操作,例如在World中修改正文的字體和字號,其實是修改了這個字的”字體“屬性和”字號“屬性,并沒有改變正文的本身內容。

而對象的另外一些屬性只能讀取不能修改,例如,對于一部手機,可以獲知這部手機的型號和廠家,但是卻不能修改。想獲得另外一個廠家和型號的手機,只有另外再買一部。

4.2.3 對象的方法

對象的操作方法稱為對象的方法,即對于一個具體的對象,可以采用什么樣的操作方法。例如,對于一本書,我們可以通過”閱讀“的方法閱讀這本書中的內容。對于一壺冷水,我們可以通過”加熱“的方法使得水的溫度上升。

4.2.4 對象的默認屬性

對象的默認屬性,是對象呈現(xiàn)在外界時的屬性,即外界通過這一個屬性可以直接識別對象本身。例如,對于一個人來說,他的默認屬性是姓名,其他的人總是通過姓名在直接識別這個人,而不是通過這個人的身高、體重、膚色等其他屬性。對于一本書,總是以書名為默認屬性向外界呈現(xiàn)。

4.2.5 對象的默認方法

既然對象有默認的屬性,那么對于一個確定的對象,也有一個默認的方法來操作該對象。在VBA中,對象的默認方法為顯示方法,即這個對象總是通過圖形、數(shù)字等形式顯示在屏幕上。在VBA中無論調用一個對象的屬性或方法或它的子對象,均是在這個對象后面加上一個點,即英文狀態(tài)在的句號 ”.” 來實現(xiàn)。用上面的例子,人的姓名在VBA中的“表示方法“就是:人.姓名。

4.2.6 聲明一個對象變量

聲明對象變量的方法是:Dim 變量名 As 對象。

4.2.7 Active對象

在VBA中,Active對象成為活動對象,是指程序當前處理或者選擇的具體對象。例如ActiveSheet就是當前正在編輯的工作表對象,ActiveCell就是當天正在編輯的單元格或者區(qū)域對象。

4.2.8事件

所謂的“事件”通俗來說就是發(fā)生了的一個事情,例如,“剛剛下雨了”就是一個事件,“火車啟動了”,也是一個事件。通常來說,事件往往伴隨著一系列的“后果“,例如”剛剛下雨了“,會導致”出門要帶雨傘“的后果。事件的發(fā)生在VBA中稱為”觸發(fā)“。

第三節(jié) Workbook對象的屬性和方法

由于Application對象作用于整個Excel VBA工程,所以我們這里從它的子對象WorkBook開始講解。由于每一個對象的屬性和方法十分復雜,正常運用也不會涉及這么多,所以這里只挑選幾個比較重要的講解,需要進一步了解其他屬性和方法的讀者可以去CSDN查詢相關的內容

第三節(jié) Workbook對象

4.3.1 Workbook 和ThisWorkbook對象的屬性

ThisWorkbook 這個對象指當前打開的VBE所在的工作薄,ThisWorkbook以及Workbook對象中常用的屬性有:

Name屬性,返回當前工作簿的名稱,例如,在桌面上的新建文件夾中一個名字叫做”工作簿3“的Excel表,打開后,在VBE環(huán)境下嘗試下列程序:

Sub W()

MsgBox(ThisWorkbook.Name)

End Sub

運行結果,返回該Excel工作?。ㄎ募┑拿Q:工作簿3.xls。

Path屬性,返回當前工作簿所在的保存路徑,還是上面的例子,假如程序改成:

Sub W()

MsgBox(ThisWorkbook.Path)

End Sub

運行結果,返回工作簿所在的保存路徑,即C:\Users\Administrator\Desktop\新建文件夾。

利用ThisWorkbook的Path屬性獲得工作簿所在目錄下的所有Excel工作簿名稱(所有xls格式工作簿名稱)

Sub W()

Dim Path As String, File As String

Path = ThisWorkbook.Path & '\'

File = Dir(Path & '*.xls')

MsgBox (File)

While File <> ''

File = Dir

If File = '' Then Exit Sub

MsgBox (File)

Wend

End Sub

上面這個例子中,利用 Thisworkbook.Path返回當前工作簿所在的路徑,并且使用Dir函數(shù)一一讀取這個路徑下所有的xls格式文件的文件名。對于Dir函數(shù),其使用規(guī)則如下:Dir(Path,[,attr]),當?shù)诙€參數(shù)缺失時,Dir函數(shù)返回路徑下沒有設置屬性的文件的名稱。第一次使用Dir函數(shù)時,返回路徑下的第一個文件名稱,再次使用這個函數(shù),并且不加參數(shù),返回第二個文件名稱……當路徑下沒有文件或者所有文件名稱均被返回,則返回一個空字符。Dir函數(shù)的第二個參數(shù)可以是下列參數(shù)之一:vbNormal(沒有屬性的文件)、vbRedOnly(只讀文件)、vbHidden(隱藏文件)、vbSystem(系統(tǒng)文件)、vbVolume(卷標文件)、vbDirectory(文件夾的名稱和文件名稱)

與ThisWorkbook一樣,任何Workbook對象都有Name和Path屬性,用法與ThisWorkbook中的用法一致,例如,可以定義一個WorkBook對象變量,并獲得該對象的名稱和路徑。

4.3.2 Workbook對象常用到的事件

在VBA中,打開工作簿,關閉工作簿,激活工作簿都是一個“事件“。

打開工作簿事件:打開工作簿時,觸發(fā)”打開工作簿“事件,在VBE界面窗口中,點擊資源管理器中的“ThisWorkbook”就可以進入ThisWorkbook的工作簿事件。

從這里可以看出,Workbook的事件編輯窗口與一般的之前我們的模塊編輯窗口沒什么不同,只是多了一行選擇菜單。這里,在“通用”下拉菜單中找到“Workbook”,就可以在后面“聲明”下拉菜單中找到Workbook的可利用事件。這里我們只講解其中4個事件。

Open事件:打開Workbook時觸發(fā)Open事件,例如,我們如果想每一次打開這個工作簿就顯示歡迎界面,可以在ThisWorkbook的事件編碼器里面找到Workbook的Open事件,并加上一行代碼: MsgBox(“你好!”),整個程序段如下:

Private Sub Workbook_Open()

MsgBox ('你好!')

End Sub

圖4.2 在Workbook的Open事件中添加歡迎界面“你好!”

保存一下,以后我們每一次打開這個工作簿的時候,都會彈出這個歡迎的對話框“你好!”

圖4.3 歡迎界面

BeforClose事件:在關閉工作簿時,觸發(fā)BeforeClose事件,例如,我們想讓每一次關閉工作簿的時候,彈出一對話框“Good Bye!”,可以在ThisWorkbook的事件編碼器里面找到Workbook的BeforeClose事件,并且添加一行 MsgBox(”Good Bye!“)完整代碼如下:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

MsgBox ('Good Bye!')

End Sub

保存后,每次關閉工作簿時就會彈出這個對話框了。

圖4.4 關閉時顯示“Good Bye!”

BeforeSave事件 保存工作表前,觸發(fā)BeforeSave事件,例如,我們想自己添加一個是否保存的對話框,并且點擊”是“時進行保存,”否“不保存,可以在ThisWorkbook的事件編碼器里面找到Workbook的BeforeSave事件,并且加上命令,完整代碼如下。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

MsgBox ('保存是個好習慣')

Cancel = Not (MsgBox('保存?', vbYesNo))

End Sub

這一程序的運行結果,每一次保存工作簿前都會給出提示“保存是個好習慣“,然后提示是否保存,注意到,這個程序中的Cancel是”取消保存“,所以,前面用了一個否定運算符的Not,后面MsgBox,一是給用戶顯示”是否保存“,二是顯示兩個按鈕,即”是“和”否“。用戶按下”是“則返回邏輯值”Ture“,否則返回”False“。

AfterSave事件 保存工作簿后,觸發(fā)AfterSave事件,不同的是,AfterSave時間中沒有”取消“選項了,我們也可以在AfterSave中添加代碼,用于提示保存成功。

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

MsgBox ('保存成功!')

End Sub

給工作簿添加打開密碼:通過Workbook的Open事件,可以給工作簿添加打開密碼,完整代碼如下:

Private Sub Workbook_Open()

Dim PassWord As String

PassWord = InputBox('請輸入密碼')

If PassWord = '123456' Then

Exit Sub

Else

MsgBox ('密碼錯誤!')

ThisWorkbook.Close

End If

End Sub

這一段代碼作用是,每一次打開工作簿的時候要求用戶輸入密碼,如果輸入的密碼不是123456,則顯示“密碼錯誤“,并且關閉工作簿。

圖4.5 給Excel工作簿添加打開密碼

第四節(jié) worksheet對象

4.4.1 worksheet對象的引用

對于一個worksheet對象,可以采用的引用方法有

(1)直接引用Sheet+數(shù)字的形式,Sheet1即這個Excel工作簿中的第一個工作表,Sheet2為Excel工作簿中的第二個工作表……

(2)采用worksheets(n)的形式,表示工作簿中第n個工作表(按照從左向右的順序)。

(3)采用worksheets(“字符串”)的形成,表示名子為字符串的工作表。

(4)采用worksheets(“Sheet”+數(shù)字)的形式,表示第n個工作表。

4.4.2 worksheet對象的屬性

Name屬性:與Workbook中的Name屬性一樣,worksheet也有Name屬性,我們可以訪問這些名稱。例如,獲取工作簿中的工作表名稱,可以寫成下列程序

Sub GetWSN()

Dim wsh As Worksheet

For Each wsh In Worksheets

MsgBox wsh.Name

Next wsh

End Sub

程序中,Worksheets即整個Excel工作簿中飯的所有工作表,這個例子中,運用For Each……Next對工作簿中的工作表一一遍歷,然后輸出每個工作表的名稱。

也通過修改工作簿中的工作表的Name屬性修改工作表名稱,例如。

Sub ChWHN()

dim wsh As WorkSheet, i as Integer

i = 1

For Each wsh In WorkSheets

wsh.Name=”表” & i

i =i +1

Next wsh

End Sub

運行結果,用一個循環(huán)變量i,給Excel工作簿中所有的工作表編號。

Visible屬性:工作表的Visible屬性決定這個工作表是否可見,如果我們想影藏工作表1,只需要 Sheet1.Visible= False, 或者Worksheets(1).Visible=False即可。

Sub Hiden()

Worksheets(1).Visible = False

End Sub

顯示所有的工作表:與上過程相反,顯示所有的工作表可以用下列語句

Sub ShowAll()

Dim wsh as Worksheet

For Each wsh in WorkSheets

wsh.Visible=True

Next wsh

End Sub

語句也是通過一個循環(huán)變量,將所有工作表的Visible屬性修改為True。

Index屬性:返回工作表的序號,例如,在Excel工作簿中有一個名字為“My Work Sheet”的工作表,可以用過Worksheets(“My Work Sheet”).Index得到這個工作表在工作簿中的序號。

4.4.3 worksheet對象的方法

Copy方法,Copy方法可以復制粘貼整個工作表。例如,將整個工作表1復制一份,命令是 Sheet1.Copy。此時,Excel會在最后自動建立一個新工作表,然后工作表中的內容和表1中完全一致。

Activate方法,Activate方法可以使工作表處于激活狀態(tài),例如,在工作表1中進行工作時,想跳轉到工作表2,用VBA代碼的方法就是:Sheet2.Activate。

Delete方法,Delete方法用于刪除一個工作表。例如,Sheet2.Delete,就刪除了工作表2.

Move方法,Move方法可以改變工作表在工作簿中的位置,例如:Sheet2.Move After:=Sheet3 ,就將Sheet2工作表移動到了工作表Sheet3的后面,當然也可以利用例如:Sheet4.Move Before:= Sheet2 的方式把表Sheet4移動到Sheet2的前面。

第五節(jié) Range對象

Range對象即單元格對象,是應用最為廣泛,使用最為靈活的一個Excel對象,是本章節(jié)的重中之重。

4.5.1 Range對象的引用方法

(1)單一引用

直接用Range或者Cells或者[]方式引用,Excel VBA中,可以直接用代碼引用Excel表格中的單元格或者區(qū)域。對于這些單元格或者區(qū)域,可以采用單一引用的方式,也可以采用嵌套引用的方式 。

Range(“A1”)方式引用單元格:Excel VBA中,可以用Range(“A1”)的方式引用Excel中的單元格,Range(“A1”)即表示Excel表格中的”A1”單元格,即第一行第一列的單元格。例如,可以用以下命令將A1單元格中的數(shù)字修改為2019.

Sub S()

Range(“A1”)=2019

End Sub

Cells(1,1)方式引用單元格:在Excel VBA中,還可以用Cells(1,1)的方式引用單元格,Cells(1,1)也表示Excel表格中第一行第一列的單元格,即“A1”單元格,例如,可以用下面命令給B1單元格中的數(shù)字修改為4

Sub S1()

Cells(1,2)=4

End Sub

[A1]方式引用單元格: 在Excel VBA中,還可以用[A1]方式引用單元格,[A1]方式引用單元格也是引用Excel中的A1單元格??梢杂孟旅娉绦蛐薷腃1單元格中的數(shù)字。

Sub S2()

[C1]=25

End Sub

引用的引用:假如我們在Excel的單元格A1中寫入了一個單元格的名稱,例如”B2“,那么,用Range([A1])的方式同樣可以引用到B2單元格。例如,下面程序中,利用A1單元格中的內容給相應的單元格賦值為15.

Sub S3()

Range([A1])=15

End Sub

(2) 嵌套引用 利用Range不僅可以引用單個單元格,而且可以引用一個單元格區(qū)域,Range應用單元格區(qū)域的方法和意義如下。

Range(“A1:B5”) 表示引用Excel表格中整個A1到B5區(qū)域。這種引用方法,引號中的部分可以用一個字符串變量代替。

Range(“A1”,”B5”)也是表示引用Excel表格中整個A1到B5區(qū)域,這種引用的方法中,逗號分隔的兩個部分可以使用用兩個字符串變量代替。

Range(“A:A”) 表示引用Excel表中整個A列所有單元格。

Range(“A:C”) 表示引用Excel表中A列到C列的所有單元格。

Range(“2:2”) 表示引用Excel表中整個第2行的所有單元格。

Range(“2:5”) 表示引用Excel表中第2行到第5行所有單元格。

整列的引用,除了可以用Range,也可以用Columns(“A”)的方式或者Columns(“A:B”)的方式。Columns(“A:B”)表示引用A列和B列。

整行的引用,可以采用Rows()的方式,與Columns方式引用整列的用法相似,Rows(2)表示引用整個第2行。

單元格對象的嵌套引用,可以用Range引用一個區(qū)域,再用Range引用其中的一個單元格或者區(qū)域,例如Range(“B2:D4”).Range(“B2”) 表示單元格區(qū)域B2到D4中的“B2”格,即第二行第二列的單元格,即C3單元格。

圖4.6 單元格的嵌套引用

也可以用Range選擇一個單元格區(qū)域,再用Cells引用單元格區(qū)域中的某一個單元格,例如Range(“C2:F9”).Cells(2,4) 表示單元格區(qū)域C2到F9中,第2行第4列的單元格。即F3單元格。

4.5.2 Range對象的屬性和方法

Address屬性:Address屬性返回一個Range對象在工作表中的絕對位置,下面命令在A1單元格中返活動單元格的位置,當Range對象為一個單元格區(qū)域時,返回這個單元格區(qū)域的第一行第一列所在的位置。

Sub Address()

Range(“A1”)=ActiveCell.Address

End Sub

Column屬性:Column屬性返回單元格所在的列的列數(shù),例如,將與活動單元格同一列的第4行的單元格的數(shù)修改為29.

Sub Col()

Cells(4, ActiveCell.Column) = 29

End Sub

Columns屬性

Columns屬性的Clear方法 用于清除單元格區(qū)域對象中的某一列或者所有列的數(shù)據(jù)。例如,想清除Excel 單元格區(qū)域A1:C3中第2列的數(shù)據(jù),可以用以下程序。

Sub Col2()

Range(“A1:C3”).Columns(2).Clear

End Sub

如果想運用于單元格區(qū)域中的所有列,則Columns后面不加(2)。

Columns屬性的Copy方法 用于復制單元格區(qū)域中某一列或者所有列的數(shù)據(jù),例如,將Excel單元格區(qū)域A1:C3中第2列的數(shù)據(jù)復制到F列,可以使用下列程序:

Sub Col2()

Range('A1:C3').Columns(2).Copy Range('F:F')

End Sub

Copy方法前面是復制的“原始數(shù)據(jù)“的位置,后面是復制的”目標位置“。這里,直接用原始位置.Copy 目標位置,就可以完成這個復制操作。

Columns屬性的ClearFormats方法,ClearFormats方法用于清除單元格區(qū)域中選定列的單元格格式。例如,加上單元格區(qū)域A1:C1格式設定為貨幣型,則這個單元格區(qū)域中所有的數(shù)字前多出一個貨幣符號”¥”,用Columns.ClearFormats就可以清除這種格式設置。

Columns 屬性的Delete方法, Delete方法用于刪除列,例如,想刪除Excel中A列中的內容,并且讓原來的B列自動成為A列則可以用下列程序。

Sub Del()

Range(“A:A”).Columns.Delete

End Sub

這里需要注意,刪除列的操作可能會引起單元格中公式引用錯誤,例如,原先在D4單元格中輸入公式“=A4+B4”,在刪除A列后,這個公式就會發(fā)生引用錯誤的情況。這是因為,在進行刪除列的操作后,公式所在的列也發(fā)生了變化(原來在D4格,刪除一列后在C4格)

Columns 屬性的Count方法,Columns屬性的Count方法返回區(qū)域的列數(shù),例如,Range(“A2:D5”).Columns.Count 等于4(這個區(qū)域有4列)。Columns屬性的Count方法通常用于用戶輸入或者選擇區(qū)域的地方,例如:

Sub ColumnCount()

Dim Rng As Range

Set Rng = Application.InputBox('選擇區(qū)域', '計算區(qū)域列數(shù)', , , , , , 8)

MsgBox (Rng.Columns.Count)

End Sub

這一段程序中,需要解釋的是Application.InputBox的用法,Application.InputBox是InputBox的”升級版本“其可以允許用戶輸入數(shù)字、文本(字符串)、公式、邏輯值、單元格或者單元格區(qū)域,其用法是Application.InputBox(Prompt,[Title],[Default],[Left],[Top],[HelpFile]

,[HelpIndex],[Type]),Prompt是對話框的內容,Title為對話框的標題,Default為默認輸入值,Left和Top分別為對話框所在的屏幕位置(不設定情況下可以自由移動),HelpFile、HelpIndex為幫助文件,Type指定用戶輸入的類型,分別為0:公式,1:數(shù)字,2:文本,4:邏輯值,8:Range對象,16:錯誤值,64:數(shù)值數(shù)組。

Columns屬性Active方法:用于激活Range對象的某一列。

Row 屬性:Range對象的Raw屬性,返回這個單元格所在的行數(shù),如果是一個單元格區(qū)域,則返回該區(qū)域第一個單元格所在的行數(shù)。例如,將與活動單元格同行的第4列數(shù)字改為26.

Sub R()

Cells(ActiveCell.Row,4)=26

End Sub

Rows屬性

Rows屬性的Clear方法:與Columns屬性的Clear方法相似,Rows屬性的Clear方法用于清除一個Range對象中的某一行或者某幾行數(shù)據(jù)。

Rows屬性的Copy方法:用于復制一個Range對象的某一列數(shù)據(jù)。用法與Columns屬性的Copy方法相似。

Rows屬性同時也具有Columns屬性的其他方法。

Offset屬性:Range對象的Offset屬性,返回Range對象移動若干個單元格后的單元格區(qū)域,Offset屬性的用法是:Offset(行偏移量,列偏移量),若行偏移量>0,則表示單元格區(qū)域向下移動,列偏移量>0表示區(qū)域向右移動,否則表示區(qū)域向上、向左移動。例如:Range(”A2:C6“).Offset(1,2) 表示單元格區(qū)域A2:C6向下移動1行,再向右移動2列的單元格區(qū)域,即C3:E7區(qū)域。

圖4.7 單元格區(qū)域的Offset屬性

利用Range對象的Offset屬性,我們可以把一個Excel表特定的區(qū)域中的數(shù)字復制到其相鄰的區(qū)域。例如:

Sub Rep()

Dim Rng As Range

Set Rng=Range(“A1:C4”)

Rng.Copy Rng.Offset(0,Rng.Columns.Count)

End Sub

這一段的作用是,將A1:C4單元格區(qū)域中的內容復制到它右側相鄰的區(qū)域,即D1:F4.這里,先使用Columns的Count方法返回之前單元格區(qū)域Rng的列數(shù)Rng.Columns.Count,并使用Offset屬性,讓之前的區(qū)域向右移動這么多列,任意一個單元格區(qū)域,向右移動其列數(shù)個單元格后,總會得到與其相鄰的右側區(qū)域。最后,再用Copy方法將之前的內容復制過去。讀者可以通過這個例子思考一下如何把單元格區(qū)域復制到其下側相鄰的區(qū)域。請讀者記住這一個程序,我們會在下一節(jié)中對這個程序詳加討論,并把這個程序的思想“發(fā)揚光大”。

Interior屬性

Interior屬性的Color屬性:用于修改單元格的背景顏色,可以采用vbRed(紅色)、vbGreen(綠色)、vbBlue(藍色)的方法修改單元格背景色,也可以用RGB()的方式修改單元格背景色。例如

Sub Col1()

Range(“A1”).Interior.Color=vbRed ‘將A1單元格的背景色改為紅色

Range(“B2:D4”).Interior.Color=vbBlue ’將單元格區(qū)域B2:D4背景色改為綠色

Range(“E:E”).Interior.Color=RGB(0,0,255) ‘將E列單元格背景改為綠色

Range(“F2”,”G5”).Interior.Color=RGB(255,255,0) ‘將F2:G5區(qū)域背景色改為黃色。

End Sub

Interior屬性的ColorIndex屬性:也用于修改背景色的顏色,不同的是,ColorIndex通過一個數(shù)字修改背景色顏色,具體哪一個數(shù)字對應哪種種顏色,讀者可以自己實現(xiàn)以下下列從程序。

Sub Col2()

Dim i As Integer, Rng1 As Range, Rng2 As Range

Set Rng1 = Range('A:A')

Set Rng2 = Range('B:B')

For i = 1 To 50

Rng1(i) = i

Rng2(i).Interior.ColorIndex = i

Next i

End Sub

程序輸出了前50種顏色和其Index的對應關系。

Interior屬性的Pattern屬性

使用Pattern屬性可以清除單元格或區(qū)域中的背景顏色,只需要將單元格的Interior.Pattern屬性的值改為xlNone即可。

Font屬性 Font屬性用于修改單元格中的字體,可用屬性有:Color,修改字體顏色;Bold,字體是否加粗;Italic,是否采用斜體,Size,設置字體大小,F(xiàn)ontStyle,用于設置字體樣式;Underline,是否使用下劃線等。例如,將E2單元格字體設置為:紅色、加粗、斜體、加下劃線,字號為15的程序如下:

Sub Col2()

Range('E2').Font.Color = vbRed

Range('E2').Font.Bold = True

Range('E2').Font.Italic = True

Range('E2').Font.Size = 15

Range('E2').Font.Underline = True

End Sub

Formula屬性: Range對象的的Formula屬性的作用是在Range對象中運用Excel公式進行計算,相當于在Excel文本中的“插入公式”操作,例如,在單元格A6中,計算A1單元格到A4單元格中的和,程序為:

Sub F1()

Range('A6').Formula = '=Sum(A1:A5)'

End Sub

而要在A列到E列中,在第6行計算前5行單元格中的和可以用下列方式:

Sub F2()

Range(“A1:E6”).Rows(6).Formula=”=Sum(A1:A5)”

End Sub

通過Formula屬性添加的公式,不會遇到之前提到的刪除行或者列造成公式引用錯誤的情況。這里公式的書寫方法和在Excel單元格中的書寫方法是一致的,即加入$符號表示絕對引用。值得注意的是,這里在引號內外都有“=”號,引號外側的“=”的用處是將這個公式作為一個“字符串”賦值給Range變量的Formula屬性,而引號內部的“=”的作用是,告訴Excel這是一個公式,而不是一個字符串。

FormulaR1C1屬性: FormulaRC1與Formula屬性的作用是一致的,即向Excel單元格中添加公式,而不同之處在于,F(xiàn)ormulaR1C1的方式是采用相對位置的方式引用單元格,還是以上述的程序為例子,如果采用FormulaR1C1形式,則書寫方式為:

Sub F3()

Range(“A1:E6”).Rows(6).FormulaR1C1=”=Sum(R[-5]C[0]:R[-1]C[0])”

End Sub

解釋一下這個R和C中括號中的數(shù)字的意思,R和C中括號里面的數(shù)字表示相對偏移量。在這個例子中,相對于A6來說,A1位于同一列前面的第5行,相對于A6來說,A1的行偏移量為-5,列偏移量為0,所以A1這里表示為R[-5]C[0]。同樣的道理,A5表示為R[-1]C[0]。 在VBA中,如果偏移量為0也可以省略不寫,上面兩個可以直接寫出R[-5]C和R[-1]C。中括號中的負數(shù)表示引用的單元格在當前單元格的上方或者左方,正數(shù)則表示引用的單元格位于目前的下側或者右側。

前面已經(jīng)提到了Range對象的幾種屬性和方法,例如Copy、Clear、ClearFormats等,Range對象本身也有這些方法,例如前面的程序,直接使用了Range對象的Copy方法,而不是其Columns屬性或者Rows屬性的Copy方法,Range對象的Copy方法是復制整個Range對象,而Columns或者Rows屬性的Copy方法只是復制Range對象中的某列或者某行。Range對象除了上述的屬性和方法以外,還有一些屬性和方法

Sort方法:Sort方法用于對Range對象按照列排序,Sort的用法如下:Sort key1:=Range對象1, order1:=方式1, key2:=Range對象2, order2=方式2……Header=……例如,對象區(qū)域A1:B5,按照A1列降序排序(沒有標題)的程序為:

Sub S()

Range('A1:B5').Sort key1:=Range('A1'), order1:=xlDescending

End Sub

key表示以哪一列為排序對象,order為xlDescending是為降序排序,為xlAscending時為升序排序。

Merge方法:Merge方法可以合并Excel中的單元格,利用Range().Merge屬性即可以將單元格區(qū)域中的單元格合并,合并后的單元格的地址,自動等于參與合并的單元格首個單元格的地址。例如,將A1:B5區(qū)域合并單元格,可以寫成:

Sub M1()

Range(“A1:B5”).Merge

End Sub

MergeCells屬性:如果單元格是合并以后的單元格,則單元格的Merge屬性為Ture,否則為False,利用這個屬性可以把已經(jīng)合并的單元格進行拆分。例如,上面的命令將A1到B5單元格區(qū)域合并為一個單元格,現(xiàn)在需要拆分,只需要下列命令即可:

Sub M2()

Range(“A1”).MergeCells=False

End Sub

Resize屬性:Resize屬性返回一個改變大小的Range區(qū)域,Resize屬性的用法是,Resize(行數(shù),列數(shù)),表示以原來區(qū)域第一個單元格為標準,將原來Range區(qū)域改變?yōu)樾袛?shù)和列數(shù)的新區(qū)域,例如Range(“A1:B5”).Resize(3,5),表示以原先單元格區(qū)域A1:B5第一個單元格A1為基準,將區(qū)域大小修改為3行和5列,修改后的區(qū)域為A1:E3。

圖4.8 Range對象的Resize屬性

利用Resize屬性,求任意一個選定單元的每一行數(shù)字和。我們可以利用Range對象的Resize屬性以及FormulaR1C1屬性編寫程序實現(xiàn)對選定單元每一行求和運算。

Sub AllSum()

Dim Rng As Range, Rng1 As Range

Dim N As Integer

Set Rng = Application.InputBox('選擇區(qū)域', '進行求和', , , , , , 8)

N = Rng.Columns.Count

Set Rng1 = Rng.Resize(Rng.Rows.Count, Rng.Columns.Count + 1)

Rng1.Columns(N + 1).FormulaR1C1 = '=Sum(RC[-' & N & ']:RC[-1])'

End Sub

程序中,先使用Application.InputBox輸入一個單元格區(qū)域,并把這個單元格區(qū)域賦值給Range變量Rng,然后再定義一個Range變量Rng1,讓Rng1等于Rng列數(shù)增加1,行數(shù)不變的新區(qū)域。然后再利用FormulaRC1屬性計算每一行的和,而對于FormulaRC1來說,因為用戶輸入的區(qū)域行數(shù)和列數(shù)都是不確定的,所以這里,第一個單元格的相對列偏移量應該等于之前Rng變量的列數(shù)的相反數(shù),這里用一個變量N來對Rng變量的列數(shù)進制保存,然后利用字符串的& 符號將常量“RC[-“與列偏移的變量N相連。而最后一個單元格列偏移量一定等于-1。讀者可以自己試著寫一個求每一列和的程序。

Delete方法:Delete方法可以用于刪除Excel表的某一行或者某一列,在運用這個方法的時候,有一個小小的陷阱,即在行刪除之后,后面的行數(shù)會自動減去1,即刪除前的第2行,在刪除之后就變成了第1行。例如,下面程序不是刪除Excel的1到20行,而是刪除了第1、3、5、7、9……39行:

Sub Del()

Dim i As Integer

For i =1 to 20

Rows(i).Delete

Next i

End Sub

那么如何才能刪除前20行呢?第一個方法,刪除第一行,刪除20遍。第二個方法,采用逆向刪除,先刪除1第20行,然后刪除第19行……。

刪除前20行方法1。

Sub Del20()

Dim i As Integer

For i =1 to 20

Rows(1).Delete

Next i

End Sub

刪除前20行方法2

Sub Del20()

Dim i As Integer

For i =20 to 1 Step -1

Rows(i).Delete

Next i

End Sub

逆向刪除時,由于刪除操作不會對前面的行產(chǎn)生影響,所以可以用Rows(i).Delete

Seletion方法: Selection方法完成對Range對象的“選定”操作,這種操作可以允許使用一次性操作不同區(qū)域的Range對象。例如可以用Section方法計算選中單元格中所有數(shù)字的和。

Sub S()

Dim i , S1 As Double

For Each i In Selextion

S1=S1+i

Msgbox(S1)

最后講解一下Range對象的Value屬性,Range對象的Value屬性即Range對象的值屬性,即單元格或者單元格區(qū)域中的內容。Range對象的Value屬性是Range對象的默認屬性,以上對Range對象的賦值過程或者訪問過程其實都是利用了Range對象的這個屬性,只不過由于Value屬性是默認屬性,所以我們這里并沒有見到例如Range(“A1”).Value=5這樣的表達形式。

第六節(jié) 在Excel表中相隔的區(qū)域輸入序號

這個問題出自于對電話號碼的打印和保存,假設我們現(xiàn)在用一個Excel表格保存電話號碼,當然你可以每一行只保存一個人的電話號碼,這樣做將非常浪費Excel表格的行,閱讀起來也相對困難?,F(xiàn)在我們在每一個電話號碼的前面加上一個“序號“,把Excel表格按照列分成若干的區(qū)域,每一個區(qū)域只保存20個電話號碼。即A列到C列保存前20個人的電話號碼,A列編號從1到20,然后D列到F列保存21號到40號的電話號碼,D列編號從21到40……如果我們現(xiàn)在有100個電話號碼,呢么請問如何快速地在A列、D列、G列、J列、M列輸入這100個數(shù)字呢。

4.6.1 思路分析

現(xiàn)在我們設一個Range變量,這個變量為3列,20行,然后讓這個Range變量從A列開始向右側移動5次,每移動一次,就向變量的第一列寫入數(shù)字。

這個思路聽上去很棒,實際上也確實是一個非常不錯的思路,那么,我們如何來實現(xiàn)這個思路呢?實現(xiàn)這個思路,我們先來看一看需要哪些“材料“,

首先,我們得有一個Range變量,這個Range變量可以通過命令Dim Rng As Range來實現(xiàn),這個不難。

其次,我們需要一個循環(huán)變量,來計數(shù)一下這個Rng共循環(huán)了多少次,我們用i這個變量對Rng循環(huán)的次數(shù)進行保存,并且當i的數(shù)值達到6時,不再循環(huán)。

隨后,我們需要一個變量表示1到100這100個數(shù)字,因為對于每一個Rng以及Rng循環(huán)的每一次,都需要輸入這個數(shù)字,并且保證每輸入一個數(shù),這個變量自動增加1?,F(xiàn)在,還剩下一個問題:如何向每一個Rng中的第一列輸入連續(xù)的數(shù)?

所以我們還需要一個變量,表示Rng變量第一列的每一行。可以用RowI這樣的變量來表示。

最后讓我們把這個思路給串聯(lián)起來。

(1)定義Range變量,用于整個大循環(huán),定義變量i用于保存循環(huán)進行了多少次。

(2)定義RowI變量,用于給每個大循環(huán)中的第一列進行循環(huán)。

(3)定義整數(shù)N,用于表示現(xiàn)在需要輸入的數(shù)字。

將這些思想串聯(lián)起來之后,可以寫出以下程序。

4.6.2 動手寫程序

Sub Insert()

Dim Rng As Range, i As Integer, RowI as Integer, N As Integer

Set Rng=Range(“A1:C20”)

i=1

N=1

For i=1 to 5

For RowI=1 to 20

Rng.Cells(RowI,1)=N

N=N+1

Next RowI

Set Rng=Rng.Offset(0,Rng.Columns.Count)

Next i

End Sub

這個程序看起來稍微比之前長了一些,但基本框架還是之前的那些,并且,其基礎的命令也沒有發(fā)生什么變化,這里,讀者只需要知道這個For……Next是一種循環(huán)結構,循環(huán)結構將在第6章的部分詳細講解。這里看到,利用Offset屬性將范圍重新選定的方式確實發(fā)揮著超級高的效率。

4.6.3 另一個例子

在A列輸入細胞培養(yǎng)的培養(yǎng)天數(shù):在工作中,我們希望用一個Excel保存若干個搖瓶的細胞培養(yǎng)數(shù)據(jù),由于整個Excel表格需要放不止一個搖瓶的細胞培養(yǎng)數(shù)據(jù),所以我們想按照列的輸入方式,在A列填入培養(yǎng)天數(shù),剩下的按照搖瓶編號或者實驗的先后順序編號將數(shù)據(jù)輸入Excel表格。這樣A列的數(shù)據(jù)就需要反復輸入,采用同上面思路一致的思路,現(xiàn)在假設我們培養(yǎng)天數(shù)需要連續(xù)重復輸入20遍,每一遍的數(shù)字已經(jīng)確認,為0到14,并且在每兩遍之間空一行,那么,同樣可以編寫程序如下.

Sub Insert()

Dim i As Integer, j AS Integer,Rng As Range

Set Rng=Range(“A1:A15”)

For i =1 to 20

For j=1 to 15

Rng(j)=j-1

Next j

Set Rng=Rng.Offset(Rng.Rows.Count+1,0)

Next i

End Sub

這里可以少一個變量的原因是,我們每一次的輸入都是從0重新開始,對于每一個Rng,第一個數(shù)字總等于0,第二個數(shù)字總等于1…… 所以,Rng的第j個數(shù)總等于j-1。

第七節(jié) UsedRange與CurrentRegion對象

4.7.1 UsedRange對象

讓我們來看一下這樣一個問題,問題:將Excel工作表Sheet1中已有數(shù)據(jù)的列復制到與其相鄰的區(qū)域。

聰明的讀者已經(jīng)認識到了,題目中并沒有告訴我這個Excel表格里面那些列被寫入了數(shù)據(jù),我怎么定義這個變化的單元格區(qū)域對象呢?

在VBA中,UsedRange對象為當前表格使用的區(qū)域,這個區(qū)域的定義是這樣的,不管區(qū)域中有多少空格,以左上和右下兩個頂端有數(shù)據(jù)的單元格為界,都是UsedRange區(qū)域。

圖4.9 UsedRange

也就是說,在上面這個圖中,UsedRange起始的列為不是空列的第一列,即B列,結束的列為非空列的最后一列,即G列,開始的行和結束的行也是非空的第一行和最后一行。加入在J10的位置再寫上數(shù)據(jù),那么這個UsedRange就變成B2:J10。

有了UsedRange對象,我們就可以完成上述的任務了。

Sub U()

Dim Rng As Range

Set Rng=Sheet1.UsedRange.Offset(0,Sheet1.UsedRange.Columns.Count)

Sheet1.UsedRange.Copy Rng

End Sub

這里要注意的是,使用UsedRange時,一定要指明是在哪個工作表中,即使只有一個工作表也需要這樣寫!

4.7.2 CurrentRegion對象

與UsedRange對象不同的是,CurrentRegion對象返回Range對象中連續(xù)的列和連續(xù)的行組成的連續(xù)的“區(qū)域”。例如Range(“A1”).CurrentRegion的意思是,以A1單元格為基準的,具有數(shù)據(jù)的連續(xù)列和連續(xù)的行組成的區(qū)域。

圖4.10 A1單元格的CurrentRegion

可以利用CurrentRegion選擇有連續(xù)數(shù)據(jù)的單元格(即相鄰的行或者列中單元格有數(shù)據(jù)),例如,求A1單元格有連續(xù)數(shù)據(jù)的單元格中的數(shù)字之和(在上圖中是求方塊中的數(shù)字,不計算方框外面的這個E4單元格。

Sub C()

Dim S As Integer, i

For Each i In Range(“A1”).CurrentRegion

S=S+i

Next i

MsgBox(S)

End Sub

第八節(jié) Range對象的 Union、Intersect與End

4.8.1 Range對象的合集Union

Union的作用是將不連續(xù)的Range區(qū)域選擇作為一個“整體”,將不連續(xù)的單元格區(qū)域作為整體操作的方式也可以用Range的方法來實現(xiàn),例如:Range(“A1:B5”,”D4:E6”),為A1:B5和D4:E6兩個不連續(xù)的單元格區(qū)域,用Union方法表示就是Application.Union(Range(“A1:B5”),Range(“D4:E6”))。下面將不連續(xù)的兩個區(qū)域背景色改為紅色。

Sub U2()

Application.Union(Range(“A1:B5”),Range(“D4:E6”)).Interior.Color=vbRed

End Sub

4.8.2 Range對象的交集Intersect

Intersect的作用是求兩個Range變量的交集。例如,Intersect(Range(“A1:F5”),Range(“E3:G7”)),結果是A1:F5區(qū)域與E3:G7區(qū)域的 “交集”即E3:F5區(qū)域。

圖4.11 兩個單元格區(qū)域的“交集”

利用Instersect求兩個區(qū)域的交集,可以完成一些“看似不可能”完成的任務。例如,求用戶選擇的區(qū)域與Excel表中前兩列交叉范圍內的數(shù)字之和。由于不能確定用戶只選取了前兩列的數(shù)據(jù),而計算中,兩列后的數(shù)據(jù)對于計算是沒有作用的。所以,這里要用Intersect。

Sub Calc()

Dim Rng1 As Range, Rng2 As Range, s As Double, i

Set Rng1 = Range('A:B')

Set Rng2 = Application.InputBox('選擇區(qū)域', '', , , , , , 8)

Set Rng2 = Intersect(Rng1, Rng2)

For Each i In Rng2

s = s + i

Next i

MsgBox (s)

End Sub

4.8.3 End屬性

Range對象的的End屬性返回該對象所在行和列的“邊緣”,其中可以有4個選項,即xlDown、xlUp、xlToLeft、xlToRight分別表示上、下、左、右邊緣。讀者可以任意用一組數(shù)據(jù)(記住B3單元格周圍有數(shù)據(jù)實驗一下效果)

Sub E()

Range('B3').End(xlDown).Interior.Color = vbRed

Range('B3').End(xlUp).Interior.Color = vbRed

Range('B3').End(xlToLeft).Interior.Color = vbRed

Range('B3').End(xlToRight).Interior.Color = vbRed

End Sub

將B3單元格不為空且上下左右“邊緣”背景改為紅色。這里可以看到,產(chǎn)生的效果是,以B3單元格所在的單元格為基準,向上、向下、向左、向右找到連續(xù)有數(shù)字的“最后一個”單元格。

還有一點,如果選擇了一個空的單元格,那么尋找結果為第一個不為空的單元格。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VBA在Excel中的應用(一)
Excel VBA解讀(77):Evaluate方法
自學資料(Excel VBA)[收集整理2]
淺談Excel開發(fā):三 Excel 對象模型
EXCEL VBA與數(shù)據(jù)統(tǒng)計
別怕,我是宏!VBA系列之元素篇(0基礎學員必看)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服