ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助大神帮助写个反向查找统计 的VBA或公式

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-14 12:19 | 显示全部楼层
用字典的方法记录项目对应的人员

Public Sub 反向查找()
    Dim ArrInfo, ArrProject, ArrTemp
    Dim i%, j%
    Dim dic As Object
    Excel.Application.ScreenUpdating = False
    Set dic = CreateObject("scripting.dictionary")
    ArrInfo = Range("B2").CurrentRegion
    Range("M3:Z100").ClearContents
    For i = 3 To UBound(ArrInfo, 1)
        For j = 4 To UBound(ArrInfo, 2)
            If ArrInfo(i, 2) <> "停止" Then
                If Cells(i, j).Value <> "" Then
                    If Not dic(Cells(i, j).Value) Like "*" & ArrInfo(i, 1) & "*" Then
                        dic(Cells(i, j).Value) = dic(Cells(i, j).Value) & "," & ArrInfo(i, 1)
                    End If
                End If
            End If
        Next j
    Next i
    ArrProject = dic.keys
    For i = 0 To UBound(ArrProject)
        ArrTemp = Split(dic(ArrProject(i)), ",")
        Cells(i + 3, 13).Resize(, UBound(ArrTemp) + 1) = ArrTemp
    Next i
    Range("M3").Resize(UBound(ArrProject) + 1) = Excel.Application.Transpose(ArrProject)
    Excel.Application.ScreenUpdating = True
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-14 12:22 | 显示全部楼层
现况整理.zip (15.36 KB, 下载次数: 21)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-14 13:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-14 18:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub TEST()
    Dim arr, vData, i&, j&, k, iPosCol&, strTxt$, iColSize&
    arr = [B2].CurrentRegion
    vData = Range([M2], [M2].End(xlDown))
    iColSize = 1
    For i = 2 To UBound(vData)
        iPosCol = 1: strTxt = vData(i, 1)
        For j = 2 To UBound(arr)
            For k = 3 To UBound(arr, 2)
               If arr(j, k) = strTxt And arr(j, 2) <> "停止" Then
                  iPosCol = iPosCol + 1
                  If iPosCol > UBound(vData, 2) Then
                        ReDim Preserve vData(1 To UBound(vData), 1 To iPosCol)
                        vData(i, iPosCol) = arr(j, 1)
                        iColSize = iColSize + 1
                        vData(1, iColSize) = "姓名" & iColSize - 1
                     Else
                        vData(i, iPosCol) = arr(j, 1)
                  End If
               End If
            Next k
        Next j
    Next i
    [M2].CurrentRegion.Offset(, 1) = Clear
    [M2].Resize(UBound(vData), UBound(vData, 2)) = vData
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-14 18:57 | 显示全部楼层
参与 一下。。。

现况整理.rar

18.25 KB, 下载次数: 8

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-15 12:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
也来练个手——


  1. <div>Sub 整理数据()
  2. Dim rngDB As Range, arr, arrRT()
  3. Dim dic As Object, i&, j&, k, v

  4. Set dic = CreateObject("SCRIPTING.DICTIONARY") '创建字典对象
  5. '给出对话框提示选择源数据,包含标题行
  6. Set rngDB = Application.InputBox("请选择源数据所在单元格区域:", Default:=[B2].CurrentRegion.Address, Type:=8)

  7. If Not rngDB Is Nothing Then
  8.   arr = rngDB '将源数据存入数组
  9.   For i = 2 To UBound(arr, 1) '行循环
  10.     For j = 3 To UBound(arr, 2) '列循环
  11.       If Len(arr(i, j)) > 0 And arr(i, 2) <> "停止" Then
  12.         '将姓名与项目匹配后存入字典dic
  13.         If dic.exists(arr(i, j)) Then
  14.           dic.Item(arr(i, j)) = dic.Item(arr(i, j)) & "," & arr(i, 1)
  15.         Else
  16.           dic.Add arr(i, j), arr(i, 1)
  17.         End If
  18.       End If
  19.     Next j
  20.   Next i
  21. End If

  22. ReDim arrRT(dic.Count + 1, UBound(arr)) '定义结果存储数组
  23. arrRT(0, 0) = "项目"
  24. k = dic.keys '从字典中获取项目名称数组

  25. For i = 0 To UBound(k)
  26.   arrRT(i + 1, 0) = k(i) '存储项目名称
  27.   v = Split(dic.Item(k(i)), ",") '获取项目名称对应的姓名数组
  28.   For j = 0 To UBound(v)
  29.     arrRT(0, j + 1) = "姓名" & j + 1 '存入列标题
  30.     arrRT(i + 1, j + 1) = v(j) '存入姓名
  31.   Next j
  32. Next i

  33. '提示选择单元格并存入结果
  34. With Application.InputBox("请选择存储结果的单元格:", Default:=[T2].Address, Type:=8)
  35.   Application.ScreenUpdating = False '关闭屏幕刷新
  36.   .CurrentRegion.ClearContents '清空当前单元格所在区域已在的内容
  37.   .Resize(dic.Count + 1, UBound(arr)) = arrRT '写入结果数组
  38.   .CurrentRegion.Sort key1:=.Cells(1), Header:=xlYes '按项目名称进行排序
  39.   Application.ScreenUpdating = True '打开屏幕刷新
  40. End With

  41. '打扫战场
  42. Set rngDB = Nothing
  43. End Sub</div>
复制代码


评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 07:26 , Processed in 0.036691 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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