excel - 在排序宏中使用 VBA 函数
问题描述
我维护一个 Excel 电子表格,其中包含多个列中的数据,可以根据每个用户认为有用的方式以各种方式进行排序。我使用带有按钮的宏来设置它,这些按钮可以执行各种操作
用户请求能够对具有字母数字组合的列进行排序,但仅按数字排序。数据是包含 1 到 3 个字母后跟 1 到 5 个数字的飞机呼号。用户想要按航班号排序,而不考虑注册字母。
我找到了一个完成此任务的函数,称为“num()”。我想使用这个函数而不改变列本身的数据。这是我正在拍摄的一个例子:
Sub sortscenarionum()
'
' sortscenarionum Macro
' Sort Aircraft by FLIGHT NUMBER then RPO TIME
'
ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range( _
"N11:N159"), SortOn:=num("N11:N159"), Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range( _
"I11:I159"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.ActiveSheet.Sort
.SetRange Range("B11:N159")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
SendKeys "{ESC}"
End Sub
这会因“类型不匹配”而失败。我也尝试过 SortOn:=num(xlSortValues) ,但结果相同。将函数移动到宏本身没有问题,但我不知道该怎么做。这是有用的功能:
Function num(rng As Range) As String
Dim n As Integer
For n = 1 To Len(rng)
If Mid(rng, n, 1) Like "[0-9]" Then
num = num & Mid(rng, n, 1)
End If
Next n
End Function
解决方案
添加一列用作帮助器;填充然后在新列上排序;删除新列。
Sub sortscenarionum()
With ActiveWorkbook.ActiveSheet
.Columns("O").Insert
With .Range(.Cells(11, "B"), .Cells(.Rows.Count, "N").End(xlUp).Offset(0, 1))
.Columns(.Columns.Count).Formula = "=numsOnly(N11)"
.Columns(.Columns.Count).Value = .Columns(.Columns.Count).Value
.Sort Key1:=.Columns(.Columns.Count), Order1:=xlAscending, _
Key2:=.Columns(8), Order2:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlNo
End With
.Columns("O").Delete
End With
End Sub
Function numsOnly(str As String)
'with rgx as static, it only has to be created once
Static rgx As Object
If rgx Is Nothing Then
Set rgx = CreateObject("VBScript.RegExp")
End If
numsOnly = vbNullString
With rgx
.Global = True
.MultiLine = False
.Pattern = "[0-9]{1,5}$"
If .test(str) Then
numsOnly = CLng(.Execute(str)(0))
End If
End With
End Function
推荐阅读
- c# - 如何将 DataGridViewCellEventArgs 设置为已处理?
- mysql - 测试相互双边一对一连接
- python - 防止动画按钮在 on_press 或 on_release 上改变颜色(无 kv / Python 部分)
- python - OpenCV 无法在 init.py 中找到 cv2.Face 来分配识别器
- c# - 泛型作为参数,我做错了什么?
- ubuntu - 如何检查正在运行的服务的版本?
- javascript - d3 each() .method 这个上下文使用 TypeScript
- python - 如何将光栅文件直接合并到 ENVI 或 LAN
- android - Android Firebase 云消息传递问题 - 仅当我在应用程序中断开/重新连接到互联网时才有效
- python - 选择查询运行时重命名表和索引的策略