ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求大师完善跨工作簿提数据并求和代码

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 10:43 | 显示全部楼层
longming3 发表于 2023-5-27 09:52
不知道能不能解决你的问题,记得送上免费的花花

谢谢老师,使用你的代码我统计表需要增设列,同时统计结果也加了公式,我数据量大增列不方便哟,能否在增列的条件下作跨表统计。

TA的精华主题

TA的得分主题

发表于 2023-5-27 10:53 | 显示全部楼层
同心/ty 发表于 2023-5-27 10:40
老师,我测试了18楼代码,能完成我要的效果,但不友好的地方是要增设辅助列6列,我表中F列-N列是有数据的 ...

那 你把18楼老师 提示选择文件的代码复制过来 就满足你需求了啊

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 11:03 | 显示全部楼层
不知道为什么 发表于 2023-5-27 10:53
那 你把18楼老师 提示选择文件的代码复制过来 就满足你需求了啊

我复制过去,运行提示有错误。

TA的精华主题

TA的得分主题

发表于 2023-5-27 11:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
同心/ty 发表于 2023-5-27 11:03
我复制过去,运行提示有错误。

。。。。。。。。。

Desktop.zip (44.6 KB, 下载次数: 9)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 11:31 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-5-27 11:31 | 显示全部楼层
同心/ty 发表于 2023-5-27 10:43
谢谢老师,使用你的代码我统计表需要增设列,同时统计结果也加了公式,我数据量大增列不方便哟,能否在增 ...

代码结果中统计表是按你设计好的表格格式做的,你增加或减少列都可以,代码中稍微修改一下就可以了。
代码中ar就是统计表的格式大小,增加减少列,调整对应的6、7这些数字即可,6就是第6列,7就是第7列。同理,br是基础表的格式大小,列数变化也是对应修改5、6这样的数字。统计表最后一列是读取的哪个表的表名,便于知道数据源是哪张表,如果不需要,直接在代码中把ar(d(gjz)),16)删掉即可,16表示第16列的数据。

TA的精华主题

TA的得分主题

发表于 2023-5-27 11:39 | 显示全部楼层
只要计算结果改成这样即可
QQ图片20230527113815.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 12:00 | 显示全部楼层
本帖最后由 同心/ty 于 2023-5-28 10:01 编辑

经过多位老师的帮助,在此表示感谢。最终代码附上。


Sub myTest()
    Dim arr, dic, i%, j%, s#, r%, brr
    Set dic = CreateObject("scripting.dictionary")
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
   file = Application.GetOpenFilename(filefilter:="EXCEL 工作表(*.xlsx;*.xlsm;*.xls),*.xlsx;*.xlsm;*.xls")
    If file <> False Then
        With Workbooks.Open(file)
            With .ActiveSheet
                r = .Cells(.Rows.Count, "G").End(xlUp).Row - 6
                arr = .[g7].Resize(r, 14)
            End With
            .Close False
        End With
        For i = 1 To UBound(arr)
            If Len(Trim(arr(i, 1))) Then
                For j = 9 To 14
                    s = s + arr(i, j)
                Next j
                dic(Trim(arr(i, 1))) = dic(Trim(arr(i, 1))) + s: s = 0
            End If
        Next i
        With Sheet1
            arr = .Range("e7:e" & .Cells(.Rows.Count, "e").End(xlUp).Row)
            ReDim brr(1 To UBound(arr), 1 To 1)
            For i = 1 To UBound(arr)
                If dic.exists(Trim(arr(i, 1))) Then brr(i, 1) = dic(Trim(arr(i, 1)))
            Next i
            With .[o7].Resize(UBound(arr), 1)
                .ClearContents
                .Value = brr
            End With
        End With
    Else
        MsgBox "没有选定工作薄!~": Exit Sub
    End If
    Set dic = Nothing
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 13:28 | 显示全部楼层
谢谢Longming3老师,代码测试成功,附上学习。

Sub test1()
    Application.ScreenUpdating = False '关闭屏幕更新
    Range("O7:O3000").Select
    Selection.ClearContents
   
    Set d = CreateObject("Scripting.Dictionary")
    With Sheets("Sheet1")
        m = .[d65536].End(3).Row
        ar = .Range("a7").Resize(m - 6, 16)
        For i = 1 To UBound(ar)
            If Len(ar(i, 4)) Then
                gjz = ar(i, 4) & ar(i, 5) '关键字为姓名+身份证号
                d(gjz) = i '记录行号
            End If
        Next
   
   
        Dim files
        Dim wb As Workbook
        Dim sht As Worksheets
        files = Application.GetOpenFilename(filefilter:="EXCEL 工作表(*.xlsx;*.xlsm;*.xls),*.xlsx;*.xlsm;*.xls", Title:="请选择要导入的工作簿", MultiSelect:=True) '选取,可以选多个excel文件
        If Not IsArray(files) Then '如果按取消,没有选择的时候,退出程序
            MsgBox "没有选定工作薄!~"
            Exit Sub
        End If
        For i = UBound(files) To LBound(files) Step -1 '循环
            Set wb = Workbooks.Open(files(i)) '依次打开
            With wb.ActiveSheet
                m = .[f65536].End(3).Row
                br = .Range("a7").Resize(m - 6, 21)
                For j = 1 To UBound(br)
                    If Len(br(j, 6)) Then
                        gjz = br(j, 6) & br(j, 7)
                        If d.exists(gjz) Then
                        For k = 15 To 20
                           ar(d(gjz), 15) = ar(d(gjz), 15) + Val(br(j, k))
                           Next
                        End If
                    End If
                Next
            End With
            wb.Close False
        Next
        
        .Range("a7").Resize(UBound(ar), UBound(ar, 2)) = ar
    End With
    Application.ScreenUpdating = True    '打开屏幕更新
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-27 13:30 | 显示全部楼层
longming3 发表于 2023-5-27 11:39
只要计算结果改成这样即可

老师,测试成功,在你代码前我加了单元格清除码。实现现清除再写入数据。谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 16:40 , Processed in 0.036392 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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