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