我在Excel中的列中有一些数字,如下所示:
201
202
208-1
210
当我对此列进行排序时,排序列如下所示:
201
202
210
208-1
如何对此列进行排序?我希望排序列变为这样:
201
202
208-1
210
或
210
208-1
202
201
答案 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
如果您有任何问题,请与我们联系。