Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel中数据块的排序_Excel_Vba_Sorting - Fatal编程技术网

Excel中数据块的排序

Excel中数据块的排序,excel,vba,sorting,Excel,Vba,Sorting,我有Excel格式的数据,如下例所示,信息块分布在3行中。有没有办法按块中的一段数据对列进行排序?i、 e.按教师或房间对A列中的区块进行排序 A列 B栏 C列 ClassA/Sc ClassA/Sc ClassB/Sp 老师A 老师A B老师 1号房间 1号房间 2号房间 ClassA/Hi ClassA/En ClassB/Sp C老师 D老师 B老师 3号房间 4号房间 2号房间 ClassA/Re ClassA/Ge ClassB/Ru C老师 B老师 F老师 5号房间 2号房间 3号房

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

A列 B栏 C列 ClassA/Sc ClassA/Sc ClassB/Sp 老师A 老师A B老师 1号房间 1号房间 2号房间 ClassA/Hi ClassA/En ClassB/Sp C老师 D老师 B老师 3号房间 4号房间 2号房间 ClassA/Re ClassA/Ge ClassB/Ru C老师 B老师 F老师 5号房间 2号房间 3号房间
我的方法是将所有数据收集到一个数组中,并确保所有属于同一行的数据加上添加列字母

那么第一行将如下所示: A、 A班/Sc,A老师,1室

然后我将使用气泡排序函数以正确的顺序获取数据,然后在工作表上再次打印数据

我不确定这是否可行,但我觉得这是个好主意:)


你觉得怎么样?

编辑:当我开始发帖时,没有看到已经有一个被接受的答案。我将把这个答案留作另一种选择


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

在下面的示例中,我使用SortedList类。函数接受我们要排序的记录“字段”。因此,如果要基于类进行排序,请为第一个元素传入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

预期的结果是什么?我编辑了这个问题,试图给出更多的想法。这可能是一个选项,但我不确定以后如何根据新排序的数组对单元格进行排序。我可能会粘贴回我认为的范围……我必须尝试一下!是的,正是我想说的,只是在在工作表上重新输入数据。祝你好运!