在 Excel 中对数据块进行排序

阿拉斯泰尔

我有 Excel 格式的数据,如下例所示,信息块分布在 3 行中。有没有办法按块中的一条数据对列进行排序?即按老师或房间对 A 列中的块进行排序?

A栏 B栏 C栏
A/Sc级 A/Sc级 B类/Sp
老师A 老师A 乙老师
房间 1 房间 1 房间 2
A级/嗨 A类/英文 B类/Sp
C老师 丁老师 乙老师
房间 3 房间 4 房间 2
A类/Re A类/Ge B类/Ru
C老师 乙老师 F老师
5号房 房间 2 房间 3

我精通 VBA,但我无法找出任何适用于这种数据排列的排序方法。

非常感谢您的帮助。

编辑:结果将使每一列根据列出的字符之一独立排序,因此在上面的数据中,可以看到列 A 已按房间 (1,3,5) 排序,而列 B 不是 (1, 4,2)。

巴索德

编辑:当我开始发布时,没有看到已经接受的答案。我将把这个答案作为一种替代方法。


由于我们知道在将数据添加到数组时需要对数据进行排序,因此我只使用可用的 Sorted List 类之一。您必须包含有关记录高度的一些信息,以及有关如何将其存储回工作表的一些详细信息。

在下面的示例中,我使用了 SortedList 类。一个函数采用我们想要排序的记录“字段”。因此,如果您想根据 Class 进行排序,请为第一个元素传入 1。对于老师,为第二个元素传递 2,等等(我肯定会包括一些边界检查以确保有人不会传递太大的数字。

由于数据最终已排序,因此您只需将数据推回工作表即可。

如果您有任何后续问题,请告诉我。

Const HEIGHT_OF_RECORD As Integer = 3

Private Function SortColumnCuston(rng As Range, nSortElement As Integer) As Object
    Dim oList As Object
    Dim oTempDict As Object
    Dim startingCell As Range
    
    'Below just takes the first cell of the passed range and stores it to a variable
    'Doesn't matter if it's actually range("A1")
    Set startingCell = rng.Range("A1")
    
    Set oList = CreateObject("System.Collections.SortedList")
    
    For i = 0 To rng.Rows.Count - HEIGHT_OF_RECORD Step HEIGHT_OF_RECORD
        Set oTempDict = CreateObject("Scripting.Dictionary")
        oTempDict.Add "Class", startingCell.Offset(i).Value
        oTempDict.Add "Teacher", startingCell.Offset(i + 1).Value
        oTempDict.Add "Room", startingCell.Offset(i + 2).Value
        
        oList.Add rng.Range("A1").Offset(i + nSortElement - 1).Value, _
            oTempDict
    Next i
    
    Set SortColumnCuston = oList
End Function

Sub Test()
    Dim oDang As Object
    Dim sortDestinationStart As Range
    
    Set oDang = SortColumnCuston(Range("A1:A9"), 3)
    
    'This is where you want to paste the sorted data.
    'Note: it WILL overwrite what's there now, so be aware
    'of formulas, etc.
    Set sortDestinationStart = Range("F1")
    
    For i = 0 To oDang.Count - 1
        sortDestinationStart.Offset(i * HEIGHT_OF_RECORD).Value = _
            oDang.GetByIndex(i)("Class")
        sortDestinationStart.Offset(i * HEIGHT_OF_RECORD + 1).Value = _
            oDang.GetByIndex(i)("Teacher")
        sortDestinationStart.Offset(i * HEIGHT_OF_RECORD + 2).Value = _
            oDang.GetByIndex(i)("Room")
    Next i
End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Excel中根据日期对数据进行排序

对数据进行排序以匹配列表列的顺序-Excel VBA

Microsoft Excel查找匹配项,无需对数据进行排序

Excel公式可根据独特的个人对数据进行排序?

如何在Excel 2013中对数字进行排序

Excel:在 Excel 中对数据进行分组和重组

VBA - 对 Excel 中的数据进行排序

Excel自定义列表对数据透视表的数据透视字段(列)进行排序

如何在Excel中按数据对列进行排序/排序

用包含将不会排序的数据的块对Excel列表进行排序

有没有办法根据excel上的值对数据进行排序

对Excel行列的数据进行排序

如何在Excel中对3列数据进行排序

在Excel中对列进行排序

Excel按数字对数字列进行排序

如何使用pandas对excel文件中的数据进行排序。并对重复项进行排序

如何在 Excel 中对数据进行分组后添加具有 ID 数字范围的列

在Reducer操作中对数据进行排序

MySQL从表中对数据进行排序

在Angular中对数据进行排序

在iOS应用中对数据进行排序

在Matlab中对数据进行排序

Excel:基于Bin系统对数据进行分类

Excel - 基于 3 个变量对数据行进行分类

根据1列的值对数据进行分组,然后使用宏在Excel中以行格式打印数据

像使用数据透视表一样在excel中对这些数据进行排序

在VBA Excel中对组合框进行排序

通过在Excel中对数据进行分组,从一列中的不同值创建饼图

Excel排序不对数值排序