看看下面的Excel界面截圖,“排序”和“篩選”往往在一起,這大概是很多數(shù)據(jù)需要先排序后篩選吧!
在Excel 2007中新增了Sort對(duì)象,在錄制宏時(shí)Excel會(huì)自動(dòng)用到這個(gè)對(duì)象,但我們今天不會(huì)講解這個(gè)對(duì)象,待以后再詳解。今天主要講解Range對(duì)象的Sort方法,對(duì)于3個(gè)以內(nèi)的字段排序很方便。其語法如下:
Range對(duì)象.Sort(Key1,Order1 As XlSortOrder, _
Key2,Type,Order2As XlSortOrder, _
Key3,Order3As XlSortOrder, _
HeaderAs XlYesNoGuess, _
OrderCustom,MatchCase,_
OrientationAs XlSortOrientation, _
SortMethodAs XlSortMethod, _
DataOption1As XlSortDataOption, _
DataOption2As XlSortDataOption, _
DataOption3As XlSortDataOption)
說明:
所有參數(shù)均可選。
參數(shù)Key1、Key2、Key3指定排序字段,確定要排序的值,但參數(shù)Key2、Key3不能用于排序數(shù)據(jù)透視表。
參數(shù)Order1、Order2、Order3,分別確定參數(shù)Key1、Key2、Key3指定值的排序順序,相應(yīng)的常量值是xlDescending或者xlAscending(默認(rèn))。
參數(shù)Type,指定要排序的元素。僅用于數(shù)據(jù)透視表,可以指定為xlSortLabels或者xlSortValues。
參數(shù)Header,指定是否第一行包含標(biāo)題信息,默認(rèn)為xlNo。如果想要Excel嘗試確定標(biāo)題,那么指定其值為xlGuess。
參數(shù)OrderCustom,指定一個(gè)基于1的整數(shù)偏移量到自定義排序順序列表,使用自定義的排序順序進(jìn)行排序。
參數(shù)MatchCase,設(shè)置為True執(zhí)行區(qū)分大小寫的排序,為False則執(zhí)行不區(qū)分大小寫的排序,不能用于數(shù)據(jù)透視表。
參數(shù)Orientation,默認(rèn)按行進(jìn)行排序且數(shù)據(jù)是垂直排列。如果數(shù)據(jù)是水平排列的,通過指定該參數(shù)使其按列進(jìn)行排序。相應(yīng)的常量值是xlSortRows或者xlSortColumn。
參數(shù)SortMethod,指定排序方
法,適用于除英語以外的語言。
參數(shù)DataOption,有3個(gè)參數(shù),用來指定排序時(shí)對(duì)單元格中文本和數(shù)字的處理。如果指定其值為xlSortTextAsNumbers,將文本當(dāng)作數(shù)據(jù)進(jìn)行排序,默認(rèn)值是xlSortNormal,分別對(duì)數(shù)字和文本數(shù)據(jù)排序。不能應(yīng)用于數(shù)據(jù)透視表排序。參數(shù)DataOption1用于指定如何排序在Key1中指定的單元格區(qū)域中的文本。參數(shù)DataOption2,用于指定如何排序在Key2中指定的單元格區(qū)域中的文本。參數(shù)DataOption3,用于指定如何排序在Key3中指定的單元格區(qū)域中的文本。
下面以下圖所示的工作表來演示,以理解Sort方法及其參數(shù)。主要是介紹前面幾個(gè)參數(shù),其它的參數(shù)將會(huì)在以后的文章中涉及時(shí)再進(jìn)行相應(yīng)講解。
首先以“性別”作為排序字段,升序排列,并且第一行作為標(biāo)題信息,代碼如下:
運(yùn)行代碼后的結(jié)果如下圖:
接下來,再添加排序字段:以“性別”作為第1排序字段升序排列,以“總分”作為第2排序字段降序排列。代碼如下:
Excel將會(huì)以“性別”作為主要關(guān)鍵字升序排列,以“總分”作為次要關(guān)鍵字降序排列,即主關(guān)鍵字排序相同的,再以次關(guān)鍵字排序。結(jié)果如下圖所示:
示例1:查找滿足某項(xiàng)條件的所有數(shù)據(jù)并按順序排列
仍以上面的工作表為例,我們需要所有男同學(xué)的成績并以總分從高到低的順序排列。將排序與自動(dòng)篩選結(jié)合,可達(dá)到我們的目的。
代碼如下:
運(yùn)行代碼后的效果如下圖:
示例2:查找滿足某項(xiàng)條件的不重復(fù)數(shù)據(jù)
如本文開頭所示的工作表,要求獲取男女同學(xué)中總分最高的同學(xué)數(shù)據(jù)記錄。將排序與高級(jí)篩選相結(jié)合,可以達(dá)到我們的目的。
代碼中的:
rng.Columns(3)
表示單元格區(qū)域rng中的第3列,即“性別”字段列。
運(yùn)行代碼后的效果如下圖:
示例3:雙擊列標(biāo)題自動(dòng)排序
在本文的示例工作表中,雙擊列標(biāo)題,會(huì)升序排列該標(biāo)題下的內(nèi)容,再次雙擊該列標(biāo)題,降序排列。代碼如下:
說明:
代碼位于工作表模塊的Worksheet_BeforeDoubleClick事件中,在工作表單元格中雙擊鼠標(biāo)時(shí)發(fā)生該事件。(關(guān)于工作表事件,將在本系列文章后面的Worksheet對(duì)象系列中詳細(xì)講解)
在模塊頂部子過程外面聲明變量,表明該變量可用于該模塊下所有的子過程。本程序代碼之所以在模塊頂部聲明變量,是為了保存雙擊事件發(fā)生前變量的值,以便與雙擊事件發(fā)生后相關(guān)值比較,從而實(shí)現(xiàn)升序和降序的切換。(關(guān)于變量作用范圍,將在本系列文章后面詳細(xì)講解)
Range('A1').CurrentRegion獲取單元格A1所在的區(qū)域,可參閱《ExcelVBA解讀(38):快速確定自已的地盤——CurrentRegion屬性》。
下面的小視頻演示了代碼運(yùn)行的效果:
示例4:根據(jù)活動(dòng)單元格排序
在上文所示的工作表中,當(dāng)單元格在A1:G10區(qū)域內(nèi)移動(dòng)時(shí),將根據(jù)活動(dòng)單元格所處的位置對(duì)其所在列按降序排序。代碼如下:
說明:
代碼位于工作表模塊的Worksheet_SelectionChange事件中,當(dāng)活動(dòng)單元格發(fā)生變化時(shí)觸發(fā)該事件。(關(guān)于工作表事件,將在本系列文章后面的Worksheet對(duì)象系列中詳細(xì)講解)
下面的小視頻演示了代碼運(yùn)行的效果:
示例5:根據(jù)顏色排序
這是Excel 2013 VBA幫助文檔中Sort方法的示例,按單元格的背景色進(jìn)行排序。示例代碼如下:
說明:
代碼中,首先使用ColorIndex屬性獲取列A中單元格顏色索引值,并將這些值存儲(chǔ)在列C中的相應(yīng)行,然后對(duì)列C排序,從而達(dá)到對(duì)列A按顏色排序的效果。
ClearContents方法用于清除單元格中的內(nèi)容。
代碼運(yùn)行的過程及結(jié)果如下圖所示:
示例6:排序有部分相同數(shù)據(jù)的行
如下圖所示,課程的組合有3種,分別是“語文、數(shù)學(xué)、英語”,“數(shù)學(xué)、體育、歷史”,“體育、化學(xué)、生物”,但上課的時(shí)間不同,要求將相同組合的課程排在一起。
代碼如下:
說明:
技巧:將多列組合成一列,并將該列作為排序列,從而達(dá)到相同數(shù)據(jù)排序在一起的目的。
示例7:自定義排序
如下圖所示,我們想按單元格區(qū)域I1:I5中的順序?qū)卧駞^(qū)域A1:G10進(jìn)行排序。也就是說,無論數(shù)據(jù)如何變化,在單元格區(qū)域I1:I5中的5名同學(xué)都是按照這樣的順序排列。
代碼如下:
說明:
這段程序代碼中有3個(gè)我們以前沒有見過的方法,即Application對(duì)象的AddCustomList方法、GetCustomListNum方法、DeleteCustomList方法。與排序相匹配使用的。(注:也與自動(dòng)填充相匹配)
AddCustomList方法的語法如下:
Application對(duì)象.AddCustomList(ListArray,ByRow)
添加自定義列表,用于自定義自動(dòng)填充或自定義排序。其中,參數(shù)ListArray必需,指定自定義排序數(shù)據(jù),可以是字符串?dāng)?shù)組或者Range對(duì)象。參數(shù)ByRow可選,僅用于當(dāng)參數(shù)ListArray是Range對(duì)象時(shí);設(shè)置為True時(shí)從單元格區(qū)域中的行創(chuàng)建自定義列表,設(shè)置為False時(shí)從單元格區(qū)域的列創(chuàng)建自定義列表;如果忽略該參數(shù)且單元格區(qū)域中的列比行多,那么將從單元格區(qū)域行創(chuàng)建自定義列表。
注意,如果試圖添加的列表已存在,那么該方法不會(huì)執(zhí)行任何操作,會(huì)報(bào)出錯(cuò)消息。
GetCustomListNum方法的語法如下:
Application對(duì)象.GetCustomListNum(ListArray)
返回字符串?dāng)?shù)組的自定義列表編號(hào),可以用于匹配內(nèi)置列表和自定義列表。其中,參數(shù)ListArray必需,指定字符串?dāng)?shù)組。
注意,如果沒有相應(yīng)的列表,那么該方法將導(dǎo)致錯(cuò)誤。
DeleteCustomList方法的語法如下:
Application對(duì)象.DeleteCustomList(ListNum)
刪除自定義列表。其中,參數(shù)ListNum必需,指定自定義列表編號(hào)。編號(hào)必須大于或等于5,因?yàn)镋xcel有4個(gè)內(nèi)置的不可刪除的自定義列表。
注意,如果列表編號(hào)小于5或者沒有相匹配的自定義列表,那么該方法將導(dǎo)致錯(cuò)誤。(這是Excel 2013幫助文檔中的說明,實(shí)際上Excel 2007中就有11個(gè)內(nèi)置的不可刪除的列表。)
運(yùn)行代碼后的結(jié)果如下圖:
--------------------------------------
如果您對(duì)本文介紹的內(nèi)容還有什么好的示例,歡迎發(fā)送郵件給我:xhdsxfjy@163.com
也可以在本文下方留言,提出您的看法或建議。
本文屬原創(chuàng)文章,轉(zhuǎn)載請(qǐng)聯(lián)系我或者注明出處。
聯(lián)系客服