由于公司需要统计人数并且排序。但是由于表格设置的问题,里面有合并单元格,不能直接处理。如下图数据,希望按合计人数进行升序排列。这里我们用VBA代码去处理源数据:
1503910097695006.jpg
详细VBA代码:Sub sortMerge() Dim i As Integer Dim j As Integer Dim k As Integer Dim ArrTemp() As Long Dim ArrSort() As Long Application.ScreenUpdating = False i = 2 ReDim ArrTemp(1 To 4, 1 To 1) ' 以下循环将A列中各合并单元格的起始行号和终止行号保存在数组ArrTemp的第一行和第二行相应项目中, ' 同时在数组ArrTemp的第三行中写入排序标志项的内容(即各人数合计单元数值); Do While Cells(i, 1) "" k = k + 1 ReDim Preserve ArrTemp(1 To 4, 1 To k) ArrTemp(1, k) = i i = i + Cells(i, 1).MergeArea.Cells.Count ArrTemp(2, k) = i - 1 ArrTemp(3, k) = Cells(i - 1, 3) Loop ' 以下双循环通过比较标志项的方法,在数组的第4行中保存各标志项数值在所有数值中的大小顺序, ' 此处填入的数据为所有标志项数值中小于相应标志项数值的个数 For i = 1 To k - 1 For j = i + 1 To k If ArrTemp(3, i) > ArrTemp(3, j) Then ArrTemp(4, i) = ArrTemp(4, i) + 1 Else ArrTemp(4, j) = ArrTemp(4, j) + 1 End If Next j Next i ReDim ArrSort(1 To k, 1 To 2) ' 以下循环根据数组ArrTemp中第4行的数值按升序调整各合并单元格始末位置的顺序 For i = 1 To k ArrSort(ArrTemp(4, i) + 1, 1) = ArrTemp(1, i) ArrSort(ArrTemp(4, i) + 1, 2) = ArrTemp(2, i) Next i ' 以下循环按数组ArrSort的顺序复制相应行到原数据列表的下面 For i = k To 1 Step -1 Rows(ArrSort(i, 1) & ":" & ArrSort(i, 2)).Copy Rows(ArrTemp(2, k) + 1).Insert shift:=xlDown Next i Rows("2:" & ArrTemp(2, k)).Delete Application.ScreenUpdating = TrueEnd Sub
运行效果图:
1503910301114688.jpg
参考至:小智雅汇(头条号) |