【发布时间】:2020-01-02 05:35:02
【问题描述】:
我有一张需要按字母数字列排序的 Excel 表格。我目前可以做到这一点,但这是一种丑陋的方法,我想要一个 vba 宏来代替。它是数字 3-22 和字母 A-Z,目前我只能让 vba 对其进行排序 3-22 并且它忽略了字母部分。我需要 3(A-Z) 然后 4(A-Z) 等,它需要对整张纸进行排序。
目前我可以按如下方式完成:创建两个新列,第一个
=IF(LEN(A4)=2,"0"&LEFT(A4,1),LEFT(A4,2))
“0”是允许 excel 将新拆分数字视为数字并允许我处理一位数和两位数的必要条件。
第二栏:
=RIGHT(A3,1)
这很有效,因为我总是将字母作为第二个数字。然后我必须按 B 列排序,然后按 C 排序。所以我使用 GUI 来“按时排序”。
我想要一个可以自动执行我上面提到的 GUI 点击和公式输入的宏
我录制了一个宏来做这件事,这就是我得到的:
Columns("C:C").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("C3").Select
ActiveCell.FormulaR1C1 = _
"=IF(LEN(RC[-1])=2,""0""&LEFT(RC[-1],1),LEFT(RC[-1],2))"
Range("B3").Select
Selection.End(xlDown).Select
Range("C162").Select
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown
Range("D3").Select
ActiveCell.FormulaR1C1 = "=RIGHT(RC[-2],1)"
Range("C3").Select
Selection.End(xlDown).Select
Range("D162").Select
Range(Selection, Selection.End(xlUp)).Select
Selection.FillDown
Range("A1:E162").Select
Range("D162").Activate
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("C1:C162" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add2 Key:=Range("D1:D162" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:E162")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
我真的希望它更简洁,这样我就可以按字母数字列对数据表进行排序,这样我得到 1(A-Z)然后是 2(A-Z)。 理想输出: 1A 2B 3C 2A 2B 2C 等等
【问题讨论】:
-
对于一些好的阅读/帮助,请参阅How to Avoid using Select。这将极大地帮助您清理记录的代码。
标签: excel vba sorting alphanumeric