当数字包含短划线时,在excel中对数字进行排序' - '

时间:2014-06-17 12:03:53

标签: excel sorting

我在Excel中的列中有一些数字,如下所示:

201
202
208-1
210

当我对此列进行排序时,排序列如下所示:

201
202
210
208-1

如何对此列进行排序?我希望排序列变为这样:

201
202
208-1
210

210
208-1
202
201

1 个答案:

答案 0 :(得分:4)

一个选项是隐藏列,例如,如果上面列出的值在A2:A5中,在右侧插入一列,在B2中输入下面的公式并将其复制到其他B单元格:

=IFERROR(VALUE(LEFT(A2,FIND("-",A2)-1)),VALUE(A2))

或@ Gary'sStudent建议的替代方法,它处理连字符后的值以及转换为小数:

=IFERROR(VALUE(SUBSTITUTE(A2,"-",".")),VALUE(A2))

这会删除第一个连字符的数字。选择两列中的所有值,选择sort,然后按columnB排序。然后,您可以右键单击B列并选择隐藏。

如果您不想使用隐藏列,那么我认为您唯一的选择是编写一些VBA来执行自定义排序过程。然后,您还需要一种触发方式,例如电子表格中的控件或键盘快捷键。

<强>更新

我已经接受了VBA程序,它没有我预期的那么直接,所以可能有更简单的方法来做到这一点。

我经历的基本步骤是提示用户输入单元格区域(您只需在提示时选择单元格),将值存储到字符串数组中,创建一个等效的数字数组,其中连字符被替换为小数点,对数值数组进行排序,然后按顺序循环粘贴值中的初始范围。

我很惊讶地发现VBA没有用于排序数组的内置方法,但发现了一些可以使用的代码here。这会创建一个临时工作表并使用工作表函数,那里还有一个纯VBA解决方案的代码,但它非常冗长。

要创建VBA过程,您需要使用alt F11打开VBA编辑器并创建一个新模块,然后将下面的代码粘贴到模块中(创建一个新模块 - 右键单击​​右侧的模块并插入)然后粘贴下面的代码。

您需要致电的程序是sort_with-hyphens

您需要创建一个控件或创建一个键盘快捷键才能触发此操作。对于其中一种,您需要通过文件&gt;选项启用开发人员功能区选项卡。对于控件,请执行开发人员&gt;控制&gt;按钮并右键单击以指定宏。对于键盘快捷键开发人员&gt;宏,从宏列表中选择VBA过程名称并选择选项。

Sub sort_with_hyphens()
On Error GoTo sort_with_hyphens_err
   Dim vRange As Range
   Dim vCell As Variant
   Dim vStrArray(), vNumArray()
   Dim i As Long, vStart As Long, vEnd As Long
   Dim vStep As String: vStep = "Initialising values"

   ' prompt user to specify range
   Set vRange = Application.InputBox("Select a range to be sorted", _
                                     "Obtain Range Object", _
                                     Type:=8)
   vStrArray = vRange.Value
   vStart = LBound(vStrArray)
   vEnd = UBound(vStrArray)
   ReDim vNumArray(vStart To vEnd)
   vStep = "Populating Numeric Array"

   ' loop through array copying strings with hyphen to decimal equivalent
   For i = vStart To vEnd
       vNumArray(i) = Val(Replace(vStrArray(i, 1), "-", "."))
       Debug.Print i, vNumArray(i)
   Next i

   ' sort numeric array
   vStep = "Sorting Numeric Array"
   SortViaWorksheet vNumArray

   ' write out sorted values
   vStep = "Writing out Sorted Values"
   For i = vStart To vEnd
       ' convert back to string and switch periods back to hyphens
       vRange.Cells(i, 1).Value = Replace(CStr(vNumArray(i)), ".", "-")
   Next

sort_with_hyphens_exit:
    Exit Sub

sort_with_hyphens_err:
    If vStep = "Writing out Sorted Values" Then
        MsgBox ("An error has occurred, the original values will " & _
                "be restored. Error in Step: " & vStep & vbCrLf & _
                "Error Details:" & vbCrLf & err.Number & " - " & _
                err.Description)
        For i = vStart To vEnd
            ' replace with original value incase of error
            vRange.Cells(i, 1).Value = vStrArray(i)
        Next
    Else
        MsgBox ("An error has occurred in Step: " & vStep & vbCrLf & _
                "Aborting sort procedure." & vbCrLf & _
                "Error Details:" & vbCrLf & err.Number & " - " & _
                err.Description)
   End If
End Sub

Sub SortViaWorksheet(pArray)
    Dim WS As Worksheet ' temporary worksheet
    Dim R As Range
    Dim N As Long

    Application.ScreenUpdating = False

    ' create a new sheet
    Set WS = ThisWorkbook.Worksheets.Add

    ' put the array values on the worksheet
    Set R = WS.Range("A1").Resize(UBound(pArray) - LBound(pArray) + 1, 1)
    R = Application.Transpose(pArray)

    ' sort the range
    R.Sort key1:=R, order1:=xlAscending, MatchCase:=False

    ' load the worksheet values back into the array
    For N = 1 To R.Rows.Count
        pArray(N) = R(N, 1)
    Next N

    ' delete the temporary sheet
    Application.DisplayAlerts = False
    WS.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    ' test/debug/confirmation
    Debug.Print vbCrLf & "Sorted Array:" & vbCrLf & "------------"
    For N = LBound(pArray) To UBound(pArray)
        Debug.Print N, pArray(N)
    Next N
End Sub

如果您有任何问题,请与我们联系。