我正在嘗試在 Excel 中撰寫一個有點復雜(至少對我而言)的宏來協助作業。我有一份員工名單和他們的薪水范圍,我希望能夠按經理和他們的直接/間接下屬劃分表格。例如:John Smith 是副總裁,有 5 個直接下屬,我希望宏獲取這些直接下屬的 5 個范圍,以及這 5 個人員的直接下屬(如果有)的范圍。因此,John Smith 會收到此示例中所有人的薪水范圍,但 Sam Jones 只會收到他的 2 個直接下屬和 Jane Doe 的 3 個直接下屬,因為她是 Sam 的直接下屬。希望這有點道理!它還可以洗掉任何重復的范圍(如果多個人的職業水平、等級、區域、結構相同)。多一個,

這些將是運行宏時的預期結果,在此示例中它將輸出 3 個作業簿:
約翰史密斯輸出
山姆·瓊斯輸出
Jane Doe 輸出
uj5u.com熱心網友回復:
下面是一個示例,說明如何過濾表格以顯示給定經理 ID 的所有直接和間接報告:
Option Explicit
Const COL_EMP_ID As Long = 2 'col# with employee id
Const COL_MGR_ID As Long = 6 'col# with manager id
Sub TestReportFiltering()
Dim rngData As Range
'your "staff data" table...
With ThisWorkbook.Worksheets("aaphr")
Set rngData = .Range("A1").CurrentRegion
FilterReports rngData, .Range("T1").Value 'for example
End With
'now copy the filtered data...
End Sub
Sub FilterReports(rngData As Range, mgrId)
Dim arrEmpId, arrMgrId, arrFilt(), mgrs As New Collection, mgr
Dim r As Long, numRecs As Long
arrEmpId = rngData.Columns(COL_EMP_ID).Value
arrMgrId = rngData.Columns(COL_MGR_ID).Value
numRecs = UBound(arrEmpId)
ReDim arrFilt(1 To numRecs, 1 To 1)
arrFilt(1, 1) = "Filter"
mgrs.Add mgrId 'add the provided manager id
Do While mgrs.Count > 0
mgr = CStr(mgrs(1)) 'get the first manager id
mgrs.Remove 1 'then remove it
For r = 2 To numRecs 'loop over records
If CStr(arrMgrId(r, 1)) = mgr Then 'reports to `mgr` ?
arrFilt(r, 1) = "x" 'set flag in `arrFilt`
mgrs.Add arrEmpId(r, 1) 'in case this employee has reports...
End If
Next r
Loop
On Error Resume Next
rngData.Parent.ShowAllData 'clear any existing filtering
On Error GoTo 0
'add our array of flags and filter on that range
With rngData.Columns(rngData.Columns.Count).Offset(0, 2)
.Value = arrFilt
.AutoFilter Field:=1, Criteria1:="x"
End With
End Sub
請注意,對于存在回圈報告關系(A 向 B 報告,B 向 A 報告)的情況,沒有錯誤處理...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535472.html
標籤:擅长VBA
