ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 提取多个工作表不重复数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-4-9 13:54 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助


实现功能:
1、提取“姓名a-e”表(可能会更多)的B列从第四行开始的工具名称,去除重复项,汇总到“汇总”表的B列中显示出来;
2、计算相对应的工具使用数量合计,显示在C列;
3、显示工具对应的单价成本,显示在D列;
其余列不动
求破解!

成本统计表.zip

130.13 KB, 下载次数: 117

TA的精华主题

TA的得分主题

发表于 2016-4-9 14:50 | 显示全部楼层
  1. Sub cs()
  2. Dim arr(1 To 999, 1 To 4)
  3. With Sheet1.UsedRange.Resize(, 3).Offset(2, 1)
  4.     .ClearContents
  5.     aa = .Value
  6. End With
  7. Set dic = CreateObject("scripting.dictionary")
  8. For Each sh In Sheets
  9.     If sh.Name Like "姓名*" Then
  10.         With sh
  11.             tmp = .UsedRange.Offset(3, 1).Resize(, 34)
  12.             For i = 1 To UBound(tmp) - 3
  13.                 If Len(tmp(i, 1)) Then
  14.                     If dic.exists(tmp(i, 1)) Then
  15.                         p = dic(tmp(i, 1))
  16.                     Else
  17.                         n = n + 1
  18.                         dic(tmp(i, 1)) = n
  19.                         p = n
  20.                         arr(p, 1) = tmp(i, 1) '名称
  21.                         arr(p, 3) = tmp(i, 34) '单价
  22.                     End If
  23.                     For j = 2 To 32
  24.                         arr(p, 2) = arr(p, 2) + tmp(i, j) '数量累计
  25.                     Next
  26.                 End If
  27.             Next
  28.         End With
  29.     End If
  30. Next
  31. For i = 1 To n
  32.     arr(i, 4) = arr(i, 2) * arr(i, 3) '总价
  33. Next
  34. Sheet1.[b3].Resize(n, 4) = arr
  35. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-4-9 14:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

“姓名*”的工作表会改成名字,不一定是从a-z什么的,也可以用这个编码吗?

TA的精华主题

TA的得分主题

发表于 2016-4-9 15:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 一指禅62 于 2016-4-9 20:28 编辑
  1. Sub 成本汇总()
  2.     Dim Sh As Worksheet, d As Object, arr(), i%, m%, n%
  3.     Set d = CreateObject("Scripting.Dictionary")
  4.     For Each Sh In ThisWorkbook.Sheets
  5.         If Sh.Name <> "经销店汇总" And Sh.Name <> "基础数据维护" And Sh.Name <> "油漆出库" Then
  6.             For i = 4 To Sh.Range("B65536").End(3).Row
  7.                 If Sh.Range("B" & i) <> 0 Then
  8.                     If Not d.Exists(Sh.Range("B" & i).Value) Then
  9.                         m = m + 1: ReDim Preserve arr(1 To 2, 1 To m)
  10.                         d.Add Sh.Range("B" & i).Value, m
  11.                         arr(1, m) = Sh.Range("AH" & i).Value
  12.                         arr(2, m) = Sh.Range("AI" & i).Value
  13.                     Else
  14.                         n = d(Sh.Range("B" & i).Value)
  15.                         arr(1, n) = arr(1, n) + Sh.Range("AH" & i).Value
  16.                        ' arr(2, n) = arr(2, n) + Sh.Range("AI" & i).Value
  17.                     End If
  18.                 End If
  19.             Next
  20.         End If
  21.     Next
  22.     With Sheet1
  23.         .Range("B3:D65536").ClearContents
  24.         .Range("B3").Resize(d.Count, 1) = WorksheetFunction.Transpose(d.keys)
  25.         .Range("C3").Resize(d.Count, 2) = WorksheetFunction.Transpose(arr)
  26.     End With
  27.     Set Sh = Nothing
  28.     Set d = Nothing
  29. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2016-4-9 15:10 | 显示全部楼层
本帖最后由 一指禅62 于 2016-4-9 20:25 编辑




请测试       成本统计表.rar (115.67 KB, 下载次数: 259)




另外,建议楼主学习一些关于数据管理方面的知识,优化数据管理。







TA的精华主题

TA的得分主题

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

已经测试使用,功能都能实现,还有两个问题:
1、单件成本(D列),不需要做累加的,只是显示其中一件的成本即可,如何修改;
2、为什么不停的按按钮汇总的时候,汇总的项目一直在滚动刷新?

TA的精华主题

TA的得分主题

发表于 2016-4-9 16:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yeling922 发表于 2016-4-9 14:57
“姓名*”的工作表会改成名字,不一定是从a-z什么的,也可以用这个编码吗?

这是为了让代码能自动区分出姓名表格与其它表格,在每个人的表格姓名前加上一个相同的识别字符如“姓名”,这样,代码就会自动处理所有以“姓名“打头的工作表。

如果你在工作表命名时候添加的识别字符为“xm”,则代码中相应改为 "xm*"即可。

TA的精华主题

TA的得分主题

发表于 2016-4-9 20:27 | 显示全部楼层
yeling922 发表于 2016-4-9 16:06
已经测试使用,功能都能实现,还有两个问题:
1、单件成本(D列),不需要做累加的,只是显示其中一件的 ...

关于第一个问题,5楼已更新,请重新下载测试。

关于第二个问题,我不明白是什么意思。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-13 15:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一指禅62 发表于 2016-4-9 20:27
关于第一个问题,5楼已更新,请重新下载测试。

关于第二个问题,我不明白是什么意思。

附件的表是这个帖子之前的问题表格,已经使用你给我做的程序使用了一段时间,我也根据自己需要改过,但是不知哪里出错了,我自己实在是找不出来原因,基础数据表里面只要物料什么都是空的,点击按钮就出错,哪怕是录入一行也没问题,就是基础数据这个表不能随便增减行,也不能为空,就连表头也不能改,不然一点按钮就出错,麻烦帮我再看看,谢谢!

一键统计.zip

67.46 KB, 下载次数: 83

TA的精华主题

TA的得分主题

发表于 2016-6-14 14:35 | 显示全部楼层
yeling922 发表于 2016-6-13 15:25
附件的表是这个帖子之前的问题表格,已经使用你给我做的程序使用了一段时间,我也根据自己需要改过,但是 ...

Sub 成本汇总()
    Dim Sh As Worksheet, d As Object, arr(), i%, m%, n%
    Set d = CreateObject("Scripting.Dictionary")
    For Each Sh In ThisWorkbook.Sheets
        If Sh.Name <> "辅料成本汇总表" And Sh.Name <> "基础数据维护" Then
            For i = 4 To Sh.Range("B65536").End(3).Row
                If Sh.Range("B" & i) <> 0 Then
                    If Not d.Exists(Sh.Range("B" & i).Value) Then
                        m = m + 1: ReDim Preserve arr(1 To 2, 1 To m)
                        d.Add Sh.Range("B" & i).Value, m
                        arr(1, m) = Sh.Range("AH" & i).Value
                        arr(2, m) = Sh.Range("AI" & i).Value
                    Else
                        n = d(Sh.Range("B" & i).Value)
                        arr(1, n) = arr(1, n) + Sh.Range("AH" & i).Value
                        'arr(2, n) = arr(2, n) + Sh.Range("AI" & i).Value
                    End If
                End If
            Next
        End If
    Next
    With Sheet1
        .Range("B4:D65536").ClearContents
        If m > 0 Then
            .Range("B4").Resize(d.Count, 1) = WorksheetFunction.Transpose(d.keys)
            .Range("C4").Resize(d.Count, 2) = WorksheetFunction.Transpose(arr)
        End If
    End With
    Set Sh = Nothing
    Set d = Nothing
End Sub

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

本版积分规则

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

GMT+8, 2025-1-11 03:53 , Processed in 0.033349 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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