|
- Sub SortAndInsertBlanks()
- Dim ws As Worksheet
- Dim rng As Range
- Dim arr As Variant, sortArr() As Variant
- Dim i As Long, j As Long, k As Long
- Dim colCount As Integer
-
- Set ws = ActiveSheet
- Set rng = ws.Range("A2:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row)
- colCount = rng.Columns.Count
- arr = rng.Value
-
- ' 创建排序辅助数组 [主桩号, 序号, 原始索引]
- ReDim sortArr(1 To UBound(arr), 1 To 3)
- For i = 1 To UBound(arr)
- Dim parts() As String
- parts = Split(arr(i, 1), "_")
- sortArr(i, 1) = parts(0) ' 主桩号部分
- sortArr(i, 2) = CInt(parts(1)) ' 序号部分
- sortArr(i, 3) = i ' 原始行号
- Next
-
- ' 双条件排序(主桩号升序 + 序号升序)
- For j = 1 To UBound(sortArr) - 1
- For k = j + 1 To UBound(sortArr)
- If sortArr(j, 1) > sortArr(k, 1) Or _
- (sortArr(j, 1) = sortArr(k, 1) And sortArr(j, 2) > sortArr(k, 2)) Then
- SwapRows sortArr, j, k
- SwapRows arr, j, k
- End If
- Next k
- Next j
-
- ' 写入排序结果
- rng.ClearContents
- rng.Resize(UBound(arr), colCount) = arr
-
- ' 插入空白行(从下往上处理)
- Application.ScreenUpdating = False
- Dim lastRow As Long
- lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
-
- For i = lastRow - 1 To 2 Step -1
- Dim currStake As String, nextStake As String
- currStake = Split(ws.Cells(i, 1).Value, "_")(0)
- nextStake = Split(ws.Cells(i + 1, 1).Value, "_")(0)
-
- If currStake <> nextStake Then
- ws.Rows(i + 1).Insert Shift:=xlDown
- ' 设置边框(可选)
-
- End If
- Next i
-
- Application.ScreenUpdating = True
-
- End Sub
- ' 辅助函数:交换数组行
- Private Sub SwapRows(targetArray, i As Long, j As Long)
- Dim temp
- For x = LBound(targetArray, 2) To UBound(targetArray, 2)
- temp = targetArray(i, x)
- targetArray(i, x) = targetArray(j, x)
- targetArray(j, x) = temp
- Next
- End Sub
复制代码 |
|