ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 是否可用VBA实现多层级归属业绩、人力统计

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-31 10:30 | 显示全部楼层 |阅读模式
本帖最后由 dannalhsu 于 2018-8-31 11:07 编辑

如附件所示,我有一个预备团队,每一个预备经理名下有若干预备主管,预备主管名下还有职员,职员名下还有顾问等等。层级归属不仅限于四级,实际上上千人的团队会出现五级归属、六级归属甚至更多。本来想根据归属生成虚拟团队名,然后用函数来解决,但真正写起来,单纯的用函数似乎逻辑太复杂,以我的excel功底要统计团队业绩和团队人力有些困难,请教各位大神,是否可用VBA实现这一功能?
团队业绩统计.zip (12.36 KB, 下载次数: 154)

TA的精华主题

TA的得分主题

发表于 2018-8-31 11:04 | 显示全部楼层
表格这样设计不是很好,可以交流一下吗?看消息

TA的精华主题

TA的得分主题

发表于 2018-8-31 11:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个有点复杂,可能要用到递归                                                                                       

TA的精华主题

TA的得分主题

发表于 2018-9-4 14:23 | 显示全部楼层
看到了你的问题,直接用excel不太容易实现,

感觉用数据库比较好,界面可以用excel,数据库是sqlite

上个附件你可以参考一下,只是一个简单的演示,提供一个思路吧。


Sub 建库建表()
Dim cnn As New cConnection
Dim rs As New cRecordset
Dim sql$
    cnn.CreateNewDB ThisWorkbook.Path & "\递归.db", "1"
    cnn.OpenDB ThisWorkbook.Path & "\递归.db", "1"
    sql = "CREATE TABLE T1(ID INTEGER PRIMARY KEY,姓名,职务,父id,业绩)"
    cnn.Execute sql
Set cnn = Nothing
End Sub


新增数据语句

Private Sub CommandButton10_Click()
If Me.TextBox1 = "" Then Exit Sub
Dim cnn As New cConnection, M%, j%
Dim rs As New cRecordset, sql$
cnn.OpenDB ThisWorkbook.Path & "\递归.db", "1"
sql = Me.TextBox1
Me.VSFlexGrid1.Clear 1, 1
If UCase(Left(sql, 1)) = "W" Then
    Me.VSFlexGrid1.Clear
    rs.OpenRecordset sql, cnn, True
    Me.VSFlexGrid1.Rows = rs.RecordCount + 1
        For j = 0 To rs.Fields.Count - 1
                Me.VSFlexGrid1.TextMatrix(0, j + 1) = rs.Fields(j).Name
        Next
        Do While Not rs.EOF
            M = M + 1
                For j = 0 To rs.Fields.Count - 1
                    Me.VSFlexGrid1.TextMatrix(M, j + 1) = rs.Fields(j)
                Next
            rs.MoveNext
        Loop
Else
    cnn.Execute (sql)
    Call UserForm_Initialize
End If
Set rs = Nothing
Set cnn = Nothing
End Sub


递归查询语句

with recursive re as
(select * from t1 where 姓名= 'A' union all
select T1.* from re INNER join T1 on re.id= t1.父id)
select * from re

简单演示一下。

分为4级(经理、主管、员工1级,员工2级)

为了看的更清楚,按照姓名来分组,比如 经理的名字是A ,则属于他这一组的都是A.....

1.gif


递归.rar (25.27 KB, 下载次数: 59)



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-9-5 13:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 opiona 于 2018-9-5 13:24 编辑

标准的递归解决方案:

代码不多,理论上 层级可以无数
  1. Dim DOUX As Double
  2. Dim INTX As Integer

  3. Sub opiona()
  4.     Set SHX = Worksheets(1)
  5.     MAXROW = SHX.Range("A65536").End(3).Row
  6.     SHX.Range("E2:F65536").ClearContents
  7.     For I = 2 To MAXROW
  8.         DOUX = 0
  9.         INTX = 0
  10.         Call DG(SHX.Cells(I, 2).Value)
  11.         SHX.Cells(I, 5).Value = SHX.Cells(I, 4).Value + DOUX
  12.         SHX.Cells(I, 6).Value = INTX + 1
  13.     Next
  14. End Sub

  15. Sub DG(INDEX)
  16.     Set SHX = Worksheets(1)
  17.     MAXROW = SHX.Range("A65536").End(3).Row
  18.     For I = 2 To MAXROW
  19.         If SHX.Cells(I, 3).Value = INDEX Then
  20.             DOUX = DOUX + SHX.Cells(I, 4).Value
  21.             INTX = INTX + 1
  22.             Rem 万恶的递归开始了
  23.             Call DG(SHX.Cells(I, 2).Value)
  24.         End If
  25.     Next
  26. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-9-5 13:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
递归设计QQ14885553.rar (14.32 KB, 下载次数: 84)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-11 09:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
魂断蓝桥 发表于 2018-9-4 14:23
看到了你的问题,直接用excel不太容易实现,

感觉用数据库比较好,界面可以用excel,数据库是sqlite

太强大了。我的SQL已经全部还给老师了

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-11 11:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

这个应该可行哎~可是我高估了我的智商,想要应用到我的报表里去却发现我不会改o(╥﹏╥)o 求大神赐教

TA的精华主题

TA的得分主题

发表于 2018-9-11 13:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-9-11 13:14 | 显示全部楼层
又减掉几行

  1. Dim DOUX As Double
  2. Dim INTX As Integer

  3. Sub opiona()
  4.     Sheet1.Range("E2:F65536").ClearContents
  5.     For I = 2 To Sheet1.Range("A65536").End(3).Row
  6.         DOUX = 0
  7.         INTX = 0
  8.         Call DG(Sheet1.Cells(I, 2).Value)
  9.         Sheet1.Cells(I, 5).Value = Sheet1.Cells(I, 4).Value + DOUX
  10.         Sheet1.Cells(I, 6).Value = INTX + 1
  11.     Next
  12. End Sub

  13. Sub DG(INDEX)
  14.     For I = 2 To Sheet1.Range("A65536").End(3).Row
  15.         If Sheet1.Cells(I, 3).Value = INDEX Then
  16.             DOUX = DOUX + Sheet1.Cells(I, 4).Value
  17.             INTX = INTX + 1
  18.             Rem 万恶的递归开始了
  19.             Call DG(Sheet1.Cells(I, 2).Value)
  20.         End If
  21.     Next
  22. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-15 08:04 , Processed in 0.028782 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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