ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 批量删除指定字段后,删除重复行保留唯一值且对应数量列求和。。。。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-26 11:39 | 显示全部楼层 |阅读模式
各位老师大家好,有两个问题想请教一下。
1、附件中,D列数据如图(较多),想把所有单元格的后缀“-国内”、“国外”、“-团内”、“-团外”删除,其余字段保留。
2、删除后会出现相同数据,相同数据对应的E列值进行累加后删除相同数据的行,保留唯一值。
麻烦各位了


求助.zip

7.68 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2018-7-26 11:41 | 显示全部楼层
split  ,字典,简单的应用而矣

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-26 11:47 | 显示全部楼层
@lsdongjh  可以麻烦您写一下吗?字典还没接触过...麻烦您了

TA的精华主题

TA的得分主题

发表于 2018-7-26 12:41 | 显示全部楼层
用pandas写的,参考
  1. import pandas as pd
  2. df=pd.read_excel('file',header=None)

  3. def drop_str(x):
  4.     a=x.split('-')
  5.     if len(a)>1:
  6.         del a[-1]
  7.     return ''.join(a)

  8. df[0]=df[0].apply(drop_str)

  9. grouped=df.groupby(df[0])
  10. result=grouped[1].unique()
  11. result=result.reset_index()
  12. result[1]=result[1].apply(lambda x: sum(x))

  13. result.to_excel('out.xlsx',header=None,index=False)
复制代码

TA的精华主题

TA的得分主题

发表于 2018-7-26 12:47 | 显示全部楼层
推荐讀一下藍老師的常見字典用法集錦及代碼詳解 http://club.excelhome.net/thread-868892-1-1.html
  1. Sub zz()
  2. Dim a As Variant, d As Object, k, t
  3. a = [d2].CurrentRegion.Value
  4. [d2].CurrentRegion.ClearContents
  5. Set d = CreateObject("scripting.dictionary")
  6. For i = 1 To UBound(a)
  7.     k = Split(a(i, 1), "-")(0)
  8.     If Not d.exists(k) Then
  9.         d(k) = a(i, 2)
  10.     Else
  11.         d(k) = d(k) + a(i, 2)
  12.     End If
  13. Next
  14. k = d.keys: t = d.items
  15. [d2].Resize(d.Count, 2) = Application.Transpose(Array(k, t))
  16. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-26 12:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
@sheeboard  对不起,您写的我甚至连怎么放进模块都不知道...

TA的精华主题

TA的得分主题

发表于 2018-7-26 13:00 | 显示全部楼层
sd3301621 发表于 2018-7-26 12:48
@sheeboard  对不起,您写的我甚至连怎么放进模块都不知道...

不是vba,是python,不过有很多库可以让excel执行python脚本的。
结果,图片传不上来。
  1. In [59]: result
  2. Out[59]:
  3.            0    1
  4. 0   A2132133   55
  5. 1     A21334  857
  6. 2  G52152156   74
  7. 3  H54115212   33
  8. 4    H545657  152
  9. 5   L5415419  123
  10. 6  P54541541   72
  11. 7   S5554251  123
  12. 8   Z3541551  562
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-26 18:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Chip_Kenny 发表于 2018-7-26 12:47
推荐讀一下藍老師的常見字典用法集錦及代碼詳解 http://club.excelhome.net/thread-868892-1-1.html

老师您好
使用了您的代码它提示下标越界是什么意思呢?
k = Split(a(i, 1), "-")(0)
还有再麻烦您 不需要保留原来列的数据,直接覆盖就好了,怎么操作呢,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-26 18:38 | 显示全部楼层
sheeboard 发表于 2018-7-26 13:00
不是vba,是python,不过有很多库可以让excel执行python脚本的。
结果,图片传不上来。

还是很感谢您,您说的台高大上了,真的操作不来。

TA的精华主题

TA的得分主题

发表于 2018-7-27 07:31 | 显示全部楼层
sd3301621 发表于 2018-7-26 18:37
老师您好
使用了您的代码它提示下标越界是什么意思呢?
k = Split(a(i, 1), "-")(0)

沒有實際數據, 猜是有空數據吧, 加入一個判斷看看。
  1. Sub zz()
  2. Dim a As Variant, d As Object, k, t
  3. a = [d2].CurrentRegion.Value
  4. [d2].CurrentRegion.ClearContents
  5. Set d = CreateObject("scripting.dictionary")
  6. For i = 1 To UBound(a)
  7.     If Len(a(i, 1)) > 0 Then
  8.         k = Split(a(i, 1), "-")(0)
  9.         If Not d.exists(k) Then
  10.             d(k) = a(i, 2)
  11.         Else
  12.             d(k) = d(k) + a(i, 2)
  13.         End If
  14.     End If
  15. Next
  16. k = d.keys: t = d.items
  17. [d2].Resize(d.Count, 2) = Application.Transpose(Array(k, t))
  18. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 04:18 , Processed in 0.024738 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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