Excel/VBA/公式:按循环首数字规则重排唯一四位数序列
解决Excel I列四位数循环按首数字1-7选取排序问题
VBA代码实现循环选取逻辑
- 核心逻辑:循环遍历首数字1到7,每次从I列里揪出首个没被用过的对应首数字的四位数,放到J列,直到所有数据都处理完。
- 完整代码:
Sub CycleSortByFirstDigit() Dim ws As Worksheet Dim sourceRng As Range, cell As Range Dim usedCells As Collection Dim firstDigit As Integer, i As Integer Dim targetRow As Integer ' 指定工作表,可根据实际修改 Set ws = ThisWorkbook.ActiveSheet ' 用来记录已经选过的单元格 Set usedCells = New Collection ' 结果从J列第1行开始放 targetRow = 1 ' 获取I列所有非空数据的范围 Set sourceRng = ws.Range("I1:I" & ws.Cells(ws.Rows.Count, "I").End(xlUp).Row) ' 循环到所有数据都被选取为止 Do While usedCells.Count < sourceRng.Cells.Count ' 按1-7的顺序遍历首数字 For firstDigit = 1 To 7 ' 逐个检查I列的数据 For Each cell In sourceRng ' 匹配首数字 If Left(cell.Value, 1) = CStr(firstDigit) Then On Error Resume Next ' 尝试把单元格加入集合,重复的会报错,以此判断是否已使用 usedCells.Add cell, Key:=CStr(cell.Address) If Err.Number = 0 Then ' 没报错说明是未使用的,写入J列 ws.Cells(targetRow, "J").Value = cell.Value targetRow = targetRow + 1 Exit For End If On Error GoTo 0 End If Next cell Next firstDigit Loop MsgBox "排序完成,结果已写入J列!" End Sub
- 使用步骤:
- 打开Excel,按
Alt+F11打开VBA编辑器 - 右键插入新模块,粘贴上面的代码
- 运行宏
CycleSortByFirstDigit,结果会自动输出到J列
- 打开Excel,按
公式实现方案(无需VBA)
如果不想用宏,可以借助辅助列实现:
- 插入辅助列K,在K1单元格输入以下公式,然后下拉填充到I列数据末尾:
=MOD(COUNTIF($I$1:I1,"^"&LEFT(I1,1)&".*")-1,7)+1
这个公式会给每个首数字的条目标记循环序号(1-7重复)
2. 在J1单元格输入数组公式(Excel 365直接回车,旧版本按Ctrl+Shift+Enter),下拉填充直到出现错误值:
=INDEX($I:$I,MATCH(SMALL(--($K:$K&LEFT($I:$I,1)),ROW(A1)),--($K:$K&LEFT($I:$I,1)),0))
这样就能得到按首数字1-7循环选取的排序结果
内容的提问来源于stack exchange,提问作者randomguy
相关产品推荐
相关产品推荐

