ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7204|回复: 22

[求助] 根据上级关系生成由高到低层级关系

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-4 14:36 | 显示全部楼层 |阅读模式
根据上级关系生成由高到低层级关系
根据上级关系生成由高到低层级关系.rar (8.07 KB, 下载次数: 59)
联系电话
代理名称
代理等级
上级代理


结果(分级缩进不是空格)
管理人数(含自已)
 
严三
3级
丁二


郑一(1级)
6
 
丁二
2级
郑一


王二(2级)
1
 
朱三
3级
丁二


丁二(2级)
3
 
郑一
1级


严三(3级)
1
 
马二
2级
郑一


朱三(3级)
1
 
金一
1级


马二(2级)
1
 
王二
2级
郑一


金一(1级)
1


TA的精华主题

TA的得分主题

发表于 2018-9-4 15:54 | 显示全部楼层
本帖最后由 ykqrs 于 2018-9-4 16:15 编辑

先留个记号。。。。。。。。。。。。。。。。。等着学习对我来说,太难

TA的精华主题

TA的得分主题

发表于 2018-9-4 16:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
留个记号,等学习

TA的精华主题

TA的得分主题

发表于 2018-9-4 16:48 | 显示全部楼层
楼主的这个问题,有无越级管理的情况,如1级直接管理3级,如果没有这种情况,可直接套用有关BOM应用的帖子或程序。论坛中这类帖子有很多。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-9-4 18:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
单一字典,递归运算,2级以下的管理人数,你自己处理

  1. Sub Test()
  2.     Dim shSource As Worksheet, rgResult As Range
  3.     Dim arr As Variant
  4.     Dim lngRow As Long, lngCol As Long
  5.     Dim objDic As Object
  6.     Dim strTemp As String
  7.     Dim arrTop() As String, strName As String, lngCount As Long
  8.     Dim strSplit() As String, arrResult() As String, intIndent As Integer
  9.    
  10.     Set shSource = Sheets("Sheet4")
  11.     shSource.Range("G2:H" & Rows.Count).ClearContents
  12.     Set rgResult = shSource.Range("G2")
  13.     arr = shSource.Range("B2:D8")
  14.     Set objDic = CreateObject("Scripting.Dictionary")
  15.    
  16.     For lngRow = LBound(arr) To UBound(arr)
  17.         If objDic.Exists(arr(lngRow, 3)) Then
  18.             objDic(arr(lngRow, 3)) = objDic(arr(lngRow, 3)) & "|" & arr(lngRow, 1) & "(" & arr(lngRow, 2) & ")"
  19.         Else
  20.             objDic(arr(lngRow, 3)) = arr(lngRow, 1) & "(" & arr(lngRow, 2) & ")"
  21.         End If
  22.     Next
  23.    
  24.     strTemp = objDic("无")
  25.     arrTop = Split(strTemp, "|")
  26.     '递归方式运算层级
  27.     For lngRow = LBound(arrTop) To UBound(arrTop)
  28.         strName = arrTop(lngRow)
  29.         strTemp = GetLevlByDIc(strName, objDic, 0)
  30.         strSplit = Split(strTemp, "|")
  31.         lngCount = UBound(strSplit) + 1
  32.         rgResult.Offset(0, 1).Value = lngCount
  33.         For lngCol = LBound(strSplit) To UBound(strSplit)
  34.             arrResult = Split(strSplit(lngCol), ",")
  35.             intIndent = arrResult(1)
  36.             rgResult.IndentLevel = intIndent
  37.             rgResult.Value = arrResult(0)
  38.             Set rgResult = rgResult.Offset(1, 0)
  39.         Next
  40.     Next
  41.    
  42.     MsgBox "OK"
  43. End Sub


  44. Function GetLevlByDIc(strNameAll As String, objDic As Object, intLevel As Integer) As String
  45.     Dim strName As String
  46.     Dim strTemp As String, strSplit() As String, strN As String
  47.     Dim intI As Integer
  48.     Dim strResult As String
  49.    
  50.     strName = Split(strNameAll, "(")(0)
  51.     If objDic.Exists(strName) = False Then
  52.         strResult = strResult & strNameAll & "," & intLevel
  53.     Else
  54.         strResult = strNameAll & "," & intLevel
  55.         strTemp = objDic(strName)
  56.         strSplit = Split(strTemp, "|")
  57.         For intI = LBound(strSplit) To UBound(strSplit)
  58.            strN = strSplit(intI)
  59.             strResult = strResult & "|" & GetLevlByDIc(strN, objDic, intLevel + 1)
  60.         Next
  61.     End If
  62.    
  63.     GetLevlByDIc = strResult
  64. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2018-9-4 18:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
三坛老窖 发表于 2018-9-4 16:48
楼主的这个问题,有无越级管理的情况,如1级直接管理3级,如果没有这种情况,可直接套用有关BOM应用的帖子 ...

老窖老师,拜读过你用递归处理BOM的帖子,这道题目不知用递归如何处理?如果没有越级管理的情况,能否写一个让我学习一下,谢谢你!

TA的精华主题

TA的得分主题

发表于 2018-9-5 13:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-9-5 15:10 | 显示全部楼层
东拼西凑,终于写出一个,能得到结果,不过感觉需优化的东西太多
  1. Option Explicit
  2. Dim d, aa, n%, jg(), x%
  3. Sub qq()
  4. Dim i&, arr, j%, z$, z1, d1, r0%, j1%, y%, m%, t$
  5. i = [b65536].End(xlUp).Row
  6. arr = Range("b2:d" & i)
  7. Set d = CreateObject("Scripting.Dictionary")
  8. Set d1 = CreateObject("Scripting.Dictionary")
  9. Range("g2:h100").ClearContents
  10. For i = 1 To UBound(arr)
  11. If arr(i, 3) = "无" Then
  12. Set d(arr(i, 1)) = CreateObject("Scripting.Dictionary")
  13. End If
  14. Next
  15. For Each aa In d.keys
  16. x = 0: Erase jg: d1.RemoveAll
  17. For i = 1 To UBound(arr)
  18. If arr(i, 3) <> "无" Then
  19. If Not d.exists(arr(i, 3)) Then
  20. Set d(arr(i, 3)) = CreateObject("Scripting.Dictionary")
  21. End If
  22. d(arr(i, 3))(arr(i, 1)) = ""
  23. End If
  24. Next
  25. m = d(aa).Count
  26. If m = 0 Then
  27. r0 = [g65536].End(xlUp).Row
  28. Cells(r0 + 1, "g") = aa & "(1级)"
  29. Cells(r0 + 1, "h") = 1
  30. Else
  31. Call digui(aa, 1, "")
  32. r0 = [g65536].End(xlUp).Row
  33. z = Join(jg, ",")
  34. z1 = Split(z, ",")
  35. For j = 0 To UBound(z1)
  36. If Not d1.exists(z1(j)) Then d1(z1(j)) = ""
  37. Next
  38. For j = 0 To d1.Count - 1
  39. z1 = Split(d1.keys()(j), "(")
  40. x = Val(z1(1))
  41. Cells(r0 + 1 + j, "g").IndentLevel = x - 1
  42. Cells(r0 + 1 + j, "g") = d1.keys()(j)
  43. Next
  44. For j = r0 + 1 To [g65536].End(xlUp).Row
  45. For j1 = j + 1 To [g65536].End(xlUp).Row + 1
  46. If Cells(j1, "g") = "" Then
  47. Exit For
  48. Else
  49. If Cells(j1, "g").IndentLevel > Cells(j, "g").IndentLevel Then
  50. y = y + 1
  51. Else
  52. Exit For
  53. End If
  54. End If
  55. Next
  56. Cells(j, "h") = y + 1: y = 0
  57. Next
  58. End If
  59. Next
  60. End Sub
  61. Sub digui(Pid, n, s)
  62. Dim i&, key, temp2
  63. If d.exists(Pid) Then
  64. temp2 = s & Pid & "(" & n & "级" & ")" & ","
  65. key = d(Pid).keys
  66. For i = 0 To UBound(key)
  67. If InStr(temp2, key(i) & "(" & n & "级" & ")" & ",") = 0 Then Call digui(key(i), n + 1, temp2)
  68. Next
  69. Else
  70. x = x + 1
  71. ReDim Preserve jg(1 To x)
  72. jg(x) = s & Pid & "(" & n & "级" & ")"
  73. End If
  74. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-9-5 15:12 | 显示全部楼层
又要审核。。。。。。。。。。。。。。。 根据上级关系生成由高到低层级关系.rar (21.18 KB, 下载次数: 39)

TA的精华主题

TA的得分主题

发表于 2018-9-5 15:15 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-13 15:54 , Processed in 0.028965 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表