目录
示例:
如图所示,该表为某医院医务人员一览表。现在希望能够将该表数据以C列(科室)按照“外妇科l手术室l内儿科l西医科l中医科l耳鼻喉科I放射科l检验科l超室|口腔科l针灸科I西药房l中药房l收费室J疾控科l合管办|后勤科”的依次顺序进行排序,如何利用VBA实
现?
序号 | 姓名 | 科室 | 级别 | 身份 | 职称 | 受聘专业 | 参工时间 | 工作年限 | 入院时间 | 入院年限 | 职务 |
1 | 张1张 | 后勤科 | 中级 | 干部 | 主治医师 | 医生 | 1970/9/1 | 40 | 1970/7/1 | 40 | |
2 | 李2李 | 外妇科 | 中级 | 干部 | 主治医师 | 医生 | 1991/8/1 | 19 | 2008/10/1 | 2 | 院长.书记 |
3 | 江3江 | 外妇科 | 工人 | 医生 | 1993/9/1 | 17 | 1999/1/1 | 12 | |||
4 | 陈4陈 | 外妇科 | 初级 | 干部 | 医士 | 医生 | 1999/10/1 | 11 | 1999/10/1 | 11 | 医务科长 |
5 | 周5周 | 外妇科 | 合同 | 医生 | 2009/2/13 | 2 | 2009/2/13 | 2 | |||
6 | 吴6吴 | 外妇科 | 中级 | 干部 | 主治医师 | 医生 | 1977/2/1 | 34 | 1977/7/1 | 33 | 副院长 |
7 | 张7张 | 外妇科 | 中级 | 干部 | 主治医师 | 医生 | 1978/4/1 | 33 | 1985/1/1 | 26 | |
8 | 李8李 | 外妇科 | 初级 | 干部 | 护师 | 护士 | 1987/2/1 | 24 | 1989/3/1 | 22 | |
9 | 江9江 | 外妇科 | 合同 | 护士 | 2007/4/26 | 4 | 2008/4/1 | 3 | |||
10 | 陈10陈 | 外妇科 | 干部 | 护士 | 2000/8/1 | 10 | 1999/5/1 | 12 | |||
11 | 周11周 | 外妇科 | 初级 | 干部 | 护士 | 护士 | 2007/6/6 | 4 | 2007/6/1 | 4 | |
12 | 吴12吴 | 外妇科 | 干部 | 医生 | 2006/3/1 | 5 | 2006/4/1 | 5 | |||
13 | 张13张 | 外妇科 | 合同 | 医生 | 2009/5/7 | 2 | 2009/5/7 | 2 | |||
14 | 李14李 | 外妇科 | 合同 | 护士 | 2009/9/9 | 1 | 2009/9/9 | 1 | |||
15 | 江15江 | 手术室 | 干部 | 医生 | |||||||
16 | 陈16陈 | 手术室 | 合同 | 医生 | 2009/7/11 | 1 | 2009/6/11 | 2 | |||
17 | 周17周 | 手术室 | 初级 | 干部 | 医师 | 护士 | 1981/12/1 | 29 | 1981/12/1 | 29 | 护士长 |
18 | 吴18吴 | 内儿科 | 初级 | 干部 | 主治医师 | 医生 | 1988/8/1 | 22 | 1988/7/1 | 22 | 医务科副科长兼中医科科长 |
19 | 张19张 | 内儿科 | 初级 | 干部 | 主治医师 | 医生 | 1997/10/1 | 13 | 1997/10/1 | 13 | 内科主任 |
20 | 李20李 | 内儿科 | 干部 | 医生 | 2000/8/1 | 10 | 2008/8/1 | 2 | |||
21 | 江21江 | 内儿科 | 初级 | 干部 | 护师 | 护士 | 1981/12/1 | 29 | 2006/10/1 | 4 | |
22 | 陈22陈 | 内儿科 | 初级 | 干部 | 护士 | 护士 | 2000/12/1 | 10 | 2002/1/1 | 9 | |
23 | 周23周 | 内儿科 | 合同 | 护士 | 护士 | 2007/11/14 | 3 | 2007/11/1 | 3 | ||
24 | 吴24吴 | 内儿科 | 干部 | 医生 | 2009/2/10 | 2 | 2009/2/10 | 2 | |||
25 | 张25张 | 内儿科 | 干部 | 护士 | 2009/5/18 | 2 | 2009/5/19 | 2 | |||
26 | 李26李 | 内儿科 | 合同 | 护士 | 2009/9/12 | 1 | 2009/9/12 | 1 | |||
27 | 江27江 | 内儿科 | 合同 | 护士 | 2009/5/18 | 2 | 2009/5/19 | 2 | |||
28 | 陈28陈 | 内儿科 | 合同 | 护士 | 2009/5/18 | 2 | 2009/5/19 | 2 | |||
29 | 周29周 | 西医科 | 中级 | 干部 | 主治医师 | 医生 | 1972/3/1 | 39 | 1986/1/1 | 25 | 工会主席 |
30 | 吴30吴 | 西医科 | 中级 | 干部 | 主治医师 | 医生 | 1984/7/1 | 26 | 1986/1/1 | 25 | |
31 | 张31张 | 中医科 | 初级 | 干部 | 医师 | 医生 | 2009/2/1 | 2 | 2009/4/11 | 2 | |
32 | 李32李 | 耳鼻喉科 | 合同 | 医生 | |||||||
33 | 江33江 | 放射科 | 中级 | 干部 | 主治医师 | 医生 | 1979/3/1 | 32 | 1989/12/1 | 21 | |
34 | 陈34陈 | 放射科 | 初级 | 干部 | 医师 | 医生 | 1990/1/1 | 21 | 1992/8/1 | 18 | 门诊部主任 |
35 | 周35周 | 放射科 | 初级 | 干部 | 医士 | 医生 | 1997/9/1 | 13 | 2009/3/21 | 2 | |
36 | 吴36吴 | 检验科 | 干部 | 医生 | 1992/6/1 | 19 | 1992/5/1 | 19 | |||
37 | 张37张 | 检验科 | 干部 | 医生 | 2010/4/12 | 1 | |||||
38 | 李38李 | B超室 | 工人 | 医生 | 2000/8/1 | 10 | 1999/5/1 | 12 | |||
39 | 江39江 | B超室 | 干部 | 医生 | 2010/4/12 | 1 | |||||
40 | 陈40陈 | 口腔科 | 初级 | 干部 | 医师 | 医生 | 1999/7/1 | 11 | 2001/1/1 | 10 | |
41 | 周41周 | 口腔科 | 中级 | 干部 | 主治医师 | 医生 | 1993/7/1 | 17 | 1993/1/1 | 18 | |
42 | 吴42吴 | 针灸科 | 初级 | 干部 | 医师 | 医生 | 1998/9/1 | 12 | 1999/2/1 | 12 | |
43 | 张43张 | 西药房 | 初级 | 干部 | 医士 | 药剂 | 1993/12/1 | 17 | 1993/12/1 | 17 | |
44 | 李44李 | 西药房 | 初级 | 干部 | 药剂师 | 药剂 | 1985/10/1 | 25 | 1987/9/1 | 23 | |
45 | 江45江 | 西药房 | 初级 | 干部 | 医师 | 药剂 | 1997/1/1 | 14 | 1997/10/1 | 13 | |
46 | 陈46陈 | 西药房 | 初级 | 干部 | 医士 | 药剂 | 1998/12/1 | 12 | 2006/1/1 | 5 | |
47 | 周47周 | 中药房 | 初级 | 干部 | 医士 | 药剂 | 1993/12/1 | 17 | 1993/12/1 | 17 | |
48 | 吴48吴 | 收费室 | 合同 | 收费员 | 2011/4/1 | 0 | |||||
49 | 张49张 | 收费室 | 合同 | 收费员 | 2006/1/1 | 5 | 2006/1/1 | 5 | |||
50 | 李50李 | 收费室 | 合同 | 收费员 | 2008/3/1 | 3 | 2008/3/1 | 3 | |||
51 | 江51江 | 收费室 | 初级 | 干部 | 医士 | 收费员 | 1988/10/1 | 22 | 2007/11/1 | 3 | |
52 | 陈52陈 | 疾控科 | 中级 | 干部 | 主治医师 | 医生 | 1977/4/1 | 34 | 1977/4/1 | 34 | |
53 | 周53周 | 疾控科 | 初级 | 干部 | 医士 | 医生 | 1989/12/1 | 21 | 1989/1/1 | 22 | 预防保健科 科长 |
54 | 吴54吴 | 疾控科 | 初级 | 干部 | 医师 | 医生 | 1979/7/1 | 31 | 2003/1/1 | 8 | |
55 | 张55张 | 疾控科 | 初级 | 干部 | 医士 | 医生 | 1990/3/1 | 21 | 1997/1/1 | 14 | |
56 | 李56李 | 疾控科 | 中级 | 干部 | 主管护师 | 护士 | 1989/7/1 | 21 | 1989/8/1 | 21 | 护士长 |
57 | 江57江 | 合管办 | 初级 | 工人 | 工人初级 | 合管办 | 2000/9/1 | 10 | 2000/1/1 | 11 | |
58 | 陈58陈 | 合管办 | 中级 | 干部 | 主管护师 | 合管办 | 1989/7/1 | 21 | 1992/9/1 | 18 | 护理部主任 |
59 | 周59周 | 合管办 | 初级 | 干部 | 医士 | 合管办 | 1997/10/1 | 13 | 2009/3/21 | 2 | |
60 | 吴60吴 | 后勤科 | 合同 | 清洁工 | 1995/2/15 | 16 | 1995/2/1 | 16 | |||
61 | 张61张 | 后勤科 | 初级 | 干部 | 医士 | 财务 | 1997/12/1 | 13 | 1997/10/1 | 13 | |
62 | 李62李 | 后勤科 | 工人 | 办公室 | 2002/12/1 | 8 | 2009/3/23 | 2 | 办公室主任 | ||
63 | 江63江 | 后勤科 | 合同 | 驾驶员 | 2009/12/7 | 1 | 2009/12/6 | 1 | |||
64 | 陈64陈 | 后勤科 | 合同 | 洗浆工 | 2009/12/24 | 1 | 2009/12/24 | 1 | |||
65 | 周65周 | 后勤科 | 合同 | 清洁工 | 2008/8/1 | 2 | 2008/7/1 | 2 | |||
66 | 吴66吴 | 后勤科 | 合同 | 清洁工 | 2009/8/16 | 1 | 2009/8/16 | 1 | |||
67 | 张67张 | 后勤科 | 中级 | 干部 | 会计师 | 财务 | 1996/10/1 | 14 | 1999/9/1 | 11 |
实现代码
Option Explicit
'辅助列法
Sub 自定义排序()
Dim RowN As Long
Range("O1").Value = "外妇科"
Range("O2").Value = "手术室"
Range("O3").Value = "内儿科"
Range("O4").Value = "西医科"
Range("O5").Value = "中医科"
Range("O6").Value = "耳鼻喉科"
Range("O7").Value = "放射科"
Range("O8").Value = "检验科"
Range("O9").Value = "B超室"
Range("O10").Value = "口腔科"
Range("O11").Value = "针灸科"
Range("O12").Value = "西药房"
Range("O13").Value = "中药科"
Range("O14").Value = "收费室"
Range("O15").Value = "疾控科"
Range("O16").Value = "合管办"
Range("O17").Value = "后勤科"
'将辅助列数据添加入自定义列表
Application.AddCustomList Range("O1:O17")
'执行排序
Range("A1").CurrentRegion.Sort key1:=Range("C1"), order1:=xlAscending, Header:=xlYes, _
orderCustom:=Application.CustomListCount + 1
'删除辅助列
Range("O1:O17").Clear
'删除自定义列表
Application.DeleteCustomList Application.CustomListCount
End Sub
单元格对象的Sort方法
Sort方法可以用来对单元格进行排序,其语法为:
Rng.Sort([Keyl],[Order1],[Key2],[Type],[Order2],[Key3],[Order3],[ Header],
[OrderCuStom],[ MatchCase],[Orientation],[SortMethod],[ DataOptionl],[ DataOption2],[DataOption3])
其中,Rng是需要进行排序的单元格区域。
- 参数Key1、Key2和Key3为排序的关键字,可以为数据的标题或者该数据标题下所表示的任意数据的单元格对象。参数Order1、Order2、Order3分别为关键字排序顺序,可以为xIDescending(降序)或者xIAscending(升序)。
- 参数DataOptionl、DataOption2、DataOption3分别表示对应关键字的数据类型,可以为xISortTextAsNumbers(将文本作为数字型数据排序)或者xISortNormal(分别对数字和文本数据进行排序)。
- 参数Header表示数据区域是否含有标题,可以为xIGuess(由Excel自行判断)、xIYes(含有标题)或者xINo(无标题)。
- 参数OrderCustom为自定义序列的序列号,如本例中,当需要使用按照自定义列表进行排序时,使用该选项。
- 参数MatchCase为是否区分大小写,可以为True(区分大小写)或者False(不区分大小写)。
- 参数Orientation表示排序的方向,可以为xISortRows或xITopToButtom(默认值,按行排序,即数据标题为首行),以及xISortColumns或xILeftToRight(按列排序,即数据标题为首列)。
- 参数SortMethod表示排序的类型,可以为xIPinYin(按拼音顺序)或者xIStroke(按笔画顺序)。
- 参数Type在对数据透视表排序时有效,其指定要排序的元素。可以为xISortLabels(按标签对数据透视表排序)或者xISortValues(按值对数据透视表排序)。
本例需要对部门列进行排序,仅有一个关键字,因而参数Keyl设为Range(“C1”),Header设为xIYes,表示含有标题行,OrderCustom设为自定义列表的序号,表示按照自定义序列排序。
添加和删除自定义序列CustomList
自定义序列CutomList是Excel程序对象级(Application)的一个特殊对象,VBA中提供了几个方法和属性来供开发者访问自定义序列,如表所示。
表 Validation Add方法的Operator参数
方法或属性 | 说 明 |
AddCustomList(ListArray, [Byrow]) | 添加自定义序列 参数ListArray可以为数组或者单元格区域对象 参数Byrow表示当ListArray为单元格区域时,按行取值(设置为True)或者按列取值(设置为False) |
DeleteCustomList(ListNum) | 删除自定义序列。参数ListNum表示自定义序列的序号 |
GetCustornListContents(ListNum) | 教取自定义序列内容。参数ListNum表示自定义序列的序号 |
GetCustomListNum(ListArray) | 获取自定义序列的序号。参数ListArray表示自定义序列的数组 |
CustomListCount | 返回自定义序列数量 |
本例中,首先利用程序创建一个序列的临时区域列表,然后通过AddCustomList方法将该区域添加至自定义序列中,待排序完成后,再次利用DeleteCustomList方法删除。
当有新的自定义序列添加时,新添加的自定义序列序号始终等于添加完该序列后的自定义序列数量,因而可以用CustomListCount来获取该自定义序列的序号。
使用自定义序列排序
在使用自定义序列排序时,参数OrderCustom使用的是自定义序列所在的序号。值得注意的是,此处的序号除了考虑自定序列之外,还包括“新序列”选项,因而此处使用的序号必须为自定义序列的序号+1。因而本例中该参数设置为Application. CustomListCount+1才能正确排序。
实现代码2
Sub 自定义排序2()
With ActiveSheet.Sort
'清除原有排序
.SortFields.Clear
'添加排序字段
.SortFields.Add _
Key:=Range("C2", Cells(Rows.Count, "C").End(xlUp)), _
CustomOrder:="外妇科,手术室,内儿科,西医科,中医科,耳鼻喉科,检验科,B超室,口腔科," & _
"针炙科,西药房,中药房,收费室,疾控科,合管办,后勤科"
'设置排序区域
.SetRange Range("A1").CurrentRegion
'含标题行
.Header = xlYes
'区分大小写
.MatchCase = False
'排序方式为拼音
.SortMethod = xlPinYin
'应用排序
.Apply
End With
End Sub
Sort对象
自Excel 2007版本开始,Sort对象被引入并用于排序操作。Sort对象是工作表(Worksheet)的一个属性。Sort对象是在Sort方法的基础上发展而来的。Sort对象的属性几乎和使用Sort方法时所使用的参数相同,不同的是与关键字相关的参数在Sort对象中以排序字段(SortFields)表示。因而在使用Sort对象进行排序时,首先需要创建排序字段,待设置完各属性后,使用Appy方法应用排序。
排序字段SortField
创建排序字段可以使用SortFields. Add方法,当需要删除排序字段时使用SortFields. Clear方法。SortFields. Add方法可以返回一个SortField对象,其语法如下:
SortFields.Add (Key,[SortOn],[Order],[CustomOrder],[DataOption])
- 参数Key表示排序字段(关键字)所代表的单元格对象(Range)。
- 参数SortOn表示排序的方法,可以为xISortOnValues(按值排序)、xISortOnCeIIColor(按单元格填充颜色排序)、xISortOnFontColor(按字体颜色排序)、xISortOnlcon(按图标排序)。
- 参数Order表示排序顺序,可以为xIDescending(降序)或者xIAscending(升序)。
- 参数CustomOrder表示是否按自定义列表进行排序,当需要此方法时,只需将该参数设为自定义列表所组成的文本(字符串)即可。该文本按照先后顺序排列列表项,各项目之间以逗号隔开。
- 参数DataOption表示数据类型,可以为xISortTextAsNumbers(将文本作为数字型数据排序)或者xISortNormal(分别对数字和文本数据进行排序)。
按颜色排序
使用Sort对象进行排序时,允许开发者按照颜色排序。在添加排序字段(SortFields)时,需要将添加的排序字段(SordField)中SortOnValue的Colort值设置为所需要排序的颜色值,该值可以利用RGB函数得到。如需要将填充色为红色的单元格排在前面,则可以使用以下语句:
Sort.SortFields.Add(Rng,xlSortOnCellColor,xlAscending,,xlSortNormal).SortOnValue .Color=RGB(255,0,0)
当需要对多个颜色进行排序时,序字段,依次设置排序颜色为红色、比如红色在最前,蓝色随后,绿色最后,需要添加3个排蓝色和绿色。
设置排序区域SetRange方法
使用Sort对象进行排序,需要使用SetRange方法设置需要排序的数据区域。其语法为:
Sort.SetRange(Rng)
其中,Rng为单元格区域对象。