我维护一个 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

关于excel - 在排序宏中使用 VBA 函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50644225/

10-12 16:47
查看更多