ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 关于创建新数据表,数据字典

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-18 22:53 | 显示全部楼层
本帖最后由 cunfu2010 于 2019-1-19 00:06 编辑

Sub test()
    Sheet2.UsedRange.Offset(1).ClearContents
    Application.ScreenUpdating = False
    Set d = CreateObject("scripting.dictionary")
    x = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
    arr = Sheet1.Range("A2:C" & x)
    ReDim brr(1 To UBound(arr), 1 To 3)
        For i = 1 To UBound(arr)
            If Not d.exists(arr(i, 1) & "," & arr(i, 3)) Then
               d(arr(i, 1) & "," & arr(i, 3)) = arr(i, 2)
            Else
               d(arr(i, 1) & "," & arr(i, 3)) = d(arr(i, 1) & "," & arr(i, 3)) & "," & arr(i, 2)
            End If
        Next
    For j = 0 To d.Count - 1
        For k = 1 To 2
        brr(j, k) = Split(d.keys()(j), ",")(k - 1)
        Next
        brr(j, 3) = d.items()(j)
    Next
    Sheet2.[D2].Resize(UBound(arr), 3) = brr
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2019-1-18 22:55 | 显示全部楼层
详情请见附件

reaa.rar

32.58 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2019-1-18 22:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
控件按钮在H列

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-18 23:14 | 显示全部楼层
abc123281 发表于 2019-1-18 22:36
Private Sub CommandButton1_Click()
Dim arr, brr(1 To 1000, 1 To 3)
Set d = CreateObject("scripting ...

Name79    67240254
对应的结果:SO2018120300051,SO2018120600045,SO2018122400013,SO2018121000088,SO2018121400084,SO2018122100085,SO2018121200078,SO2018120700001,SO2018122000009,SO2019010300014,SO2018121200095,SO2018120300051,SO2018122400012,SO2018120300051,SO2018122400012

还是有点问题,如上所示:红色的数据,在结果中,有重复值

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-18 23:24 | 显示全部楼层

感谢协助,还是有点问题,E列值为:67240254 所对应的F列值:SO2018120300051,SO2018120600045,SO2018122400013,SO2018121000088,SO2018121400084,SO2018122100085,SO2018121200078,SO2018120700001,SO2018122000009,SO2019010300014,SO2018121200095,SO2018120300051,SO2018122400012,SO2018120300051,SO2018122400012
有重复,这个地方如何处理呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-19 00:09 | 显示全部楼层
统一回复,不会高级办法,又多用了一次数据字典,搞定了我想要的结果,感谢各位,新年快乐

TA的精华主题

TA的得分主题

发表于 2019-1-19 00:11 | 显示全部楼层
请问四楼大师,为什么我的代码最后rept出来的  总有一些是错误值呢,感觉很纳闷啊,找不到原因,望明示,感谢

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2019-1-19 11:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
everbest2015 同学你好
    错误的原因  是字典的条目中字符超过256转置就会失败  导致出现错误值  后续转置给数组就行  
已做了修改  请测试附件  

reaa123.rar (29.01 KB, 下载次数: 3)

TA的精华主题

TA的得分主题

发表于 2019-1-19 13:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
无穷大 发表于 2019-1-18 23:14
Name79    67240254
对应的结果:SO2018120300051,SO2018120600045,SO2018122400013,SO2018121000088,SO ...
  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\aa.xlsm', sheet_name='Sheet1')
  7. my_dic = defaultdict(set)
  8. for i in data.values:
  9.     my_dic[str(i[0]) + ',' + str(i[2])] |= {str(i[1])}
  10. my_list = [[k.split(',')[0], k.split(',')[1], ','.join(list(v))] for k, v in my_dic.items()]
  11. #数据写入Excel文件,注意文件路径!
  12. df = pd.DataFrame(my_list, columns=["Name", "No", "NewOrder"])
  13. with pd.ExcelWriter(r'D:\python\project\输出结果.xlsx') as writer:
  14.     df.to_excel(writer, 'Sheet1', index=False, header=True)
复制代码

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 14:33 , Processed in 0.039861 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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