Excel VBA基于2个变量对行重新排序

Excel VBA基于2个变量对行重新排序,vba,excel,loops,Vba,Excel,Loops,我正试图从最高层向下,根据他们的经理是谁,列出一份员工名单。棘手的部分是在进入下一个相同级别的人之前,列出所有高级职员。例如,请参见下图: 所有直接或间接向迪克汇报的人都列在他下面,然后再转到彼得——下一个与他同级的人 因此,如果表格是这样的: 是否有一个VBA可以将表格重新排序,使其看起来像第一个示例?要重新排序的表可能不是这样的-无论是谁错误地排序,它都必须工作 注:同级人员的顺序不重要 谢谢你的帮助。我喜欢这样的东西。创建一个包含两个选项卡的Excel工作表,并将其中一个命名为“输入”

我正试图从最高层向下,根据他们的经理是谁,列出一份员工名单。棘手的部分是在进入下一个相同级别的人之前,列出所有高级职员。例如,请参见下图:

所有直接或间接向迪克汇报的人都列在他下面,然后再转到彼得——下一个与他同级的人

因此,如果表格是这样的:

是否有一个VBA可以将表格重新排序,使其看起来像第一个示例?要重新排序的表可能不是这样的-无论是谁错误地排序,它都必须工作

注:同级人员的顺序不重要


谢谢你的帮助。

我喜欢这样的东西。创建一个包含两个选项卡的Excel工作表,并将其中一个命名为“输入”,另一个命名为“输出”。将示例表复制到“输入”中,然后将标题复制到“输出”中。然后插入下面的代码。这将向您展示基本递归的思想。在VBA中这样做是相当可怕的,在C中会漂亮得多

Option Explicit

Dim RawName() As Variant
Dim RawManager() As Variant
Dim RawLevel() As Variant
Dim TopNode As Integer

Sub FncSortHierarchy()

    TopNode = FncPopulateRawHierarchy("A", "B", "C")

    If TopNode <> 0 Then

        Sheets("Output").Select
        FncWritePerson (TopNode)
        FncGetSubordinates (TopNode)

    End If

End Sub

Private Function FncGetSubordinates(indexManager As Integer) As Integer

    Dim i As Integer
    Dim name As String
    Dim manager As String

    manager = RawName(indexManager)

    For i = 1 To UBound(RawName)

        If RawManager(i) = manager Then

            name = RawName(i)
            FncWritePerson (i)
            FncGetSubordinates (i)

        End If

    Next i

End Function

Private Function FncWritePerson(index As Integer)

    Dim nextRow As Integer

    nextRow = ActiveSheet.UsedRange.Rows.Count + 1

    Range("A" & nextRow) = RawName(index)
    Range("B" & nextRow) = RawManager(index)
    Range("C" & nextRow) = RawLevel(index)

End Function

Private Function FncPopulateRawHierarchy(nameCol As String, managerCol As String, levelCol As String) As Integer

    Dim i As Integer

    Sheets("Input").Select
    ReDim RawName(ActiveSheet.UsedRange.Rows.Count)
    ReDim RawManager(ActiveSheet.UsedRange.Rows.Count)
    ReDim RawLevel(ActiveSheet.UsedRange.Rows.Count)

    For i = 2 To ActiveSheet.UsedRange.Rows.Count

        RawName(i - 1) = Range(nameCol & i).Value
        RawManager(i - 1) = Range(managerCol & i).Value
        RawLevel(i - 1) = Range(levelCol & i).Value

        If RawManager(i - 1) = "N/A" Then FncPopulateRawHierarchy = i - 1

    Next i

End Function
选项显式
Dim RawName()作为变量
Dim RawManager()作为变量
Dim RawLevel()作为变量
Dim TopNode作为整数
副FncSortHierarchy()
TopNode=FncPopulateRawHierarchy(“A”、“B”、“C”)
如果TopNode为0,则
工作表(“输出”)。选择
FncWritePerson(TopNode)
FNCGet下属(TopNode)
如果结束
端接头
私有函数FNCGetSubstances(indexManager为整数)为整数
作为整数的Dim i
将名称设置为字符串
作为字符串的Dim管理器
manager=RawName(indexManager)
对于i=1到UBound(RawName)
如果RawManager(i)=经理,则
name=RawName(i)
个人(一)
FNCGETT下属(一)
如果结束
接下来我
端函数
私有函数FncWritePerson(索引为整数)
Dim nextRow为整数
nextRow=ActiveSheet.UsedRange.Rows.Count+1
范围(“A”&nextRow)=原始名称(索引)
范围(“B”&nextRow)=RawManager(索引)
范围(“C”&nextRow)=原始级别(索引)
端函数
私有函数FncPopulateRawHierarchy(nameCol为字符串,managerCol为字符串,levelCol为字符串)为整数
作为整数的Dim i
工作表(“输入”)。选择
ReDim RawName(ActiveSheet.UsedRange.Rows.Count)
ReDim RawManager(ActiveSheet.UsedRange.Rows.Count)
ReDim RawLevel(ActiveSheet.UsedRange.Rows.Count)
对于ActiveSheet.UsedRange.Rows.Count的i=2
RawName(i-1)=范围(nameCol&i).Value
RawManager(i-1)=范围(managerCol&i).值
RawLevel(i-1)=范围(levelCol&i).值
如果RawManager(i-1)=“不适用”,则FncPopulateRawHierarchy=i-1
接下来我
端函数
除非您自己编写宏,否则没有这样的“VBA”。你试过什么吗?发布代码,然后我们可以提供帮助。你不能指望我们为你写完整的代码。另外,请发布数据,而不是数据的图片。