ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 根据条件去重后将内容用逗号隔开

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-18 16:54 | 显示全部楼层 |阅读模式
小弟刚接触VBA,在写一个按条件去重指令后将所得内容用逗号隔开的问题遇到了困难,请教下论坛各位老师;

要求如下:

1.每个人有多个属性,并且有重复
2.需要将每个人的属性去重后,合并到一起用逗号隔开后,输出到某个各自;

去重指令没问题,但是逗号隔离的指令应该怎么写呢,烦请看下附件请教一下,谢谢!!
去重求教.zip (10.72 KB, 下载次数: 13)



TA的精华主题

TA的得分主题

发表于 2019-1-18 17:11 | 显示全部楼层
不懂vba可能你也用过这个或者是否尝试一下。。
KKLM.gif

去重求教.zip

17.37 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2019-1-18 19:27 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   With Worksheets("sheet2")
  7.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.     arr = .Range("a2:b" & r)
  9.   End With
  10.   For i = 1 To UBound(arr)
  11.     If Not d.exists(arr(i, 1)) Then
  12.       Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  13.     End If
  14.     d(arr(i, 1))(arr(i, 2)) = ""
  15.   Next
  16.   With Worksheets("sheet1")
  17.     .Range("a2:b" & .Rows.Count).Clear
  18.     m = 1
  19.     For Each aa In d.keys
  20.       m = m + 1
  21.       .Cells(m, 1) = aa
  22.       .Cells(m, 2) = Join(d(aa).keys, ",")
  23.     Next
  24.   End With
  25. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-1-18 19:28 | 显示全部楼层
详见附件。

去重求教.rar

20.5 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2019-1-18 19:30 | 显示全部楼层
本帖最后由 duquancai 于 2019-1-19 12:28 编辑

三行代码 解决问题》》》》
  1. # -*- coding: utf-8 -*-
  2. # version: Python 3.7.0
  3. import pandas as pd
  4. from collections import defaultdict
  5. #读取Excel文件中的数据,注意文件路径及表名!
  6. data = pd.read_excel(r'D:\python\project\去重求教.xlsx', sheet_name='Sheet2')
  7. my_dic = defaultdict(set)
  8. for i in data.values:
  9.     my_dic[i[0]] |= {i[1]}
  10. print(my_dic)
复制代码

TA的精华主题

TA的得分主题

发表于 2019-1-18 22:22 | 显示全部楼层
本帖最后由 duquancai 于 2019-1-19 12:22 编辑
  1. # -*- coding: utf-8 -*-
  2. # version: Python 3.7.0
  3. import pandas as pd
  4. from collections import defaultdict
  5. #读取Excel文件中的数据,注意文件路径及表名!
  6. data = pd.read_excel(r'D:\python\project\去重求教.xlsx', sheet_name='Sheet2')
  7. my_dic = defaultdict(set)
  8. for i in data.values:
  9.     my_dic[i[0]] |= {i[1]}
  10. my_list = [[k, ','.join(list(v))] for k, v in my_dic.items()]
  11. #数据写入Excel文件,注意文件路径!
  12. df = pd.DataFrame(my_list, columns=['姓名','属性'])
  13. with pd.ExcelWriter(r'D:\python\project\输出结果.xlsx') as writer:
  14.     df.to_excel(writer, 'Sheet1', index=False, header=True)
复制代码

TA的精华主题

TA的得分主题

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

谢谢老师指点!!有个小问题请教的话,

1. 数据量很大,而且经常更新,比方说,如果我只想看特定的某两个人(这两个人是固定的)的属性,而不是看所有人的对应属性,应该如何修改??
2. 我尝试了一下,根据特定的人去字典寻找并赋值,不过没做出来。。能否麻烦老师在解答一下,谢谢!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-18 23:56 | 显示全部楼层
PQ小学生 发表于 2019-1-18 17:11
不懂vba可能你也用过这个或者是否尝试一下。。

非常感谢,我尝试一下这个方法,数据量非常大,而且经常更新,我觉得您这个思路非常好~感谢!

TA的精华主题

TA的得分主题

发表于 2019-1-19 08:18 | 显示全部楼层
Split函数:基于分隔符分割成特定数量的数组
a="A/B/C/D"
b=Split(a,"/")
那么b=array("A","B","C","D")

a="A啊B啊C啊D"
b=Split(a,"啊")
那么b=array("A","B","C","D")

jion函数:使用分隔符形成字串符,Split相反操作
b=array("A","B","C","D")

c=join(b,",")
那么c="A,B,C,D"
c=join(b,"+")
那么c="A+B+C+D"
c=join(b,"哦")
那么c="ABCD"


TA的精华主题

TA的得分主题

发表于 2019-1-19 11:09 | 显示全部楼层
Sub 字典汇总()
    Dim arr, brr
    Set d = CreateObject("scripting.dictionary")
    arr = Sheet2.Range("a1").CurrentRegion '数据装入数组
   
    For i = 1 To UBound(arr)
        tjz = arr(i, 1) '条件
        If d.Exists(tjz) Then '字典里存在的时候
        brr = d(tjz) '字典关键字对应的条目的值装入结果数组(可以为数组)
        If InStr(brr(2), arr(i, 2)) = 0 Then
            brr(2) = brr(2) & "," & arr(i, 2) '要汇总的列
        End If
    Else
        ReDim brr(1 To UBound(arr, 2)) '声明动态数组 装符合条件的每列数据
        For l = 1 To UBound(arr, 2)
            brr(l) = arr(i, l) '需要的字段装入结果数组
        Next l
    End If
    d(tjz) = brr '更新字典条目中的值
Next
If d.Count Then
    Sheet2.Range("d1").CurrentRegion.ClearContents '清除结果区的数据
    brr = WorksheetFunction.Transpose(WorksheetFunction.Transpose(d.Items)) '数组装置
    Sheet2.Range("d1").Resize(d.Count, UBound(brr, 2)) = brr '赋值
End If
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-4 03:48 , Processed in 0.046637 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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