三亚技师学院 海南省三亚市 572000
【摘要】
VBA对excel表格排序是通过sort对象来实现的。查看工作表中的数据是否排序,排序的相关参数,可以使用Sort对象的属性。
【关键字】
VBA excel 表格排序 sort对象
使用VBA对excel表格排序是通过sort对象来实现的。先设置好Sort对象的属性后,再调用Sort对象的方法apply,就可以了。
如果想要查看工作表中的数据是否排序,排序的相关参数,一样可以使用Sort对象的属性。
Sort对象的属性如下:
SortFields 'SortField的集合
SortField '排序的关键字、排序的依据、次序
SortMethod = xlStroke/ xlPinYin '按笔画还是拼音
MatchCase =Yes/False '是否区分大小写
Orientation = xlTopToBottom/ '排序方向:xlSortColumns或xlTopToBottom从上到下,按列排序;xlSortRows或xlLeftToRight从左到右,按行排序
Header = xlYes '是否带表头:xlYes将第一栏视作标题栏,不参与排序
下面通过实例来说明:
将右图表中的数据按“一班、二班、三班”的顺序排序,班级相同的按性别升序排列,性别相同的按姓名降序排列,按笔划排序。排序完成后通过VBA查看排序的参数,显示在新建的工作表sortcheck中。
Sub b1_Click()
Dim mySheetName As String, mySheetNameTest As String
Dim ws As Worksheet, wsr As Worksheet
mySheetName = "sortcheck"
Set ws = ThisWorkbook.Worksheets("排序")
Set wsr = ThisWorkbook.Worksheets(mySheetName)
On Error Resume Next
mySheetNameTest = Worksheets(mySheetName).Name
If Err.Number = 0 Then
MsgBox "名为 ''" & mySheetName & "'' 的工作表已存在。"
Else
Err.Clear
Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = "sortcheck"
End If
wsr.Range("A1").Value = "关键字数量"
wsr.Range("B1").Value = ws.Sort.SortFields.Count
wsr.Range("A2").Value = "数据是否包含标题"
wsr.Range("B2").Value = ws.Sort.Header
wsr.Range("A3").Value = "是否区分大小写"
wsr.Range("B3").Value = ws.Sort.MatchCase
wsr.Range("A4").Value = "排序方向"
wsr.Range("B4").Value = ws.Sort.Orientation
wsr.Range("A5").Value = "排序数据区域"
wsr.Range("B5").Value = ws.Sort.Rng.Address
wsr.Range("A6").Value = "按笔划还是字母"
wsr.Range("B6").Value = ws.Sort.SortMethod
Dim i, j As Integer
j = 1
For i = 1 To ws.Sort.SortFields.Count
wsr.Range("A" & j + 7).Value = "第" & i & "个关键字的字段名"
wsr.Range("B" & j + 7).Value = ws.Sort.SortFields.Item(i).Key(0)
j = j + 1
wsr.Range("A" & j + 7).Value = "排序依据"
wsr.Range("B" & j + 7).Value = ws.Sort.SortFields.Item(i).SortOn
j = j + 1
wsr.Range("A" & j + 7).Value = "升序还是降序"
wsr.Range("B" & j + 7).Value = ws.Sort.SortFields.Item(i).Order
j = j + 1
wsr.Range("A" & j + 7).Value = "自定义次序"
wsr.Range("B" & j + 7).Value = ws.Sort.SortFields.Item(i).CustomOrder
j = j + 1
wsr.Range("A" & j + 7).Value = "关键字中有文本格式的数字选择按数值或按文本排序"
wsr.Range("B" & j + 7).Value = ws.Sort.SortFields.Item(i).DataOption
j = j + 2
Next i
End Sub
运行结果如下:
相关数值的意义如下:
Name | Value | Description |
XlSortOrder Enumeration 升序还是降序 | ||
xlAscending | 1 | 升序排列,默认。 |
xlDescending | 2 | 降序排列。 |
XlOrientation Enumeration 排序方向 | ||
xlSortColumns | 1 | 按列排序,默认。 |
xlSortRows | 2 | 按行排序。 |
XlSortMethod Enumeration 按笔划还是拼音字母 | ||
xlPinYin | 1 | 按拼音字母顺序排列,默认。 |
xlStroke | 2 | 按笔划排列。 |
XlSortOn Enumeration 排序依据 | ||
SortOnCellColor | 1 | 按单元格颜色排序。 |
SortOnFontColor | 2 | 按字符颜色排序。 |
SortOnIcon | 3 | 按单元格图标排序。 |
SortOnValues | 0 | 按数值排序,默认。 |
xlSortDataOption 关键字中有文本格式的数字选择按数值或按文本排序 | ||
xlSortNormal | 0 | 将数字与以文本储存的数字分别排序,默认。 |
xlSortTextAsNumbers | 1 | 将以文本储存的数字与数字一样排序。 |
XlYesNoGuess Enumeration 数据是否包含标题 | ||
xlGuess | 0 | Excel自动判断数据是否包含标题。 |
xlNo | 2 | 数据不包含标题,默认。 |
xlYes | 1 | 数据包含标题。 |
结束语:
如果想要自动检查学生排序操作的结果并给出评分可以通过VBA的if或是switch case语句来实现。关键是理解SortFields.Item的意义,SortFields.Item(i)实际是关键字的种数,本例中就是有3种关键字,i从1到3。即有3个SortField,关键字的字段名分别对应班级、性别与姓名。另外如果使用python win32com来检查,结果得到的就是上面的数字,如果要排序在设置属性时也应该是对应的数字而不是xlAscending之类的变量名,python中无法识别会报错。
参考文献:
Explore Excel 2013 developer resources
SORT 函数 - Microsoft 支持
https://support.microsoft.com/zh-cn/office/sort-%E5%87%BD%E6%95%B0-22f63bd0-ccc8-492f-953d-c20e8e44b86c?rs=zh-cn&ui=zh-cn&ad=cn
Excel VBA解读(54):排序——Sort方法 卡美力软件开发组成员 Member of CAMEL Software Studio
http://www.360doc.com/content/17/0507/08/30583536_651749135.shtml