ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 多工作簿多个工作表,全部数据汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-12-10 22:47 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub 根据客户统计男女个数及余额()
    Dim X As Long
    Dim conn As Object
    Dim Sql As String
    Dim rs As Object
    Dim ws As Worksheet
    Dim lastRow As Long

    ' 设置工作表
    Set ws = ThisWorkbook.Sheets("Sheet1") ' 假设结果输出到当前工作表

    ' 清除之前的内容
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    ws.Range("A2:F" & lastRow).ClearContents

    ' 创建数据库连接
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
              "Data Source=" & ThisWorkbook.Path & "\数据.xlsx;" & _
              "Extended Properties='Excel 12.0 Xml;HDR=YES';"

    ' 统计机构下男女个数及余额的SQL
    Sql = "SELECT 机构名称, 机构号, 身份证号, 性别, COUNT(*) AS 个数, SUM(余额) AS 总余额 " & _
          "FROM [Sheet1$] " & _
          "GROUP BY 机构名称, 机构号, 身份证号, 性别 " & _
          "ORDER BY 机构名称, 机构号, 身份证号, 性别"

    ' 执行SQL查询
    Set rs = conn.Execute(Sql)

    ' 如果查询返回了结果集
    If Not rs.EOF Then
        ' 将结果集复制到工作表
        ws.Range("a2").CopyFromRecordset rs
    End If

    ' 关闭记录集和连接
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
End Sub

我这段代码只能统计一个工作表的数据,请各位师傅帮我修改在同一个文件夹下统计所有工作簿中所有工作表,如附件中合计汇总,谢谢!

工作簿1.rar

31.42 KB, 下载次数: 20

TA的精华主题

TA的得分主题

发表于 2024-12-11 01:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
是这个效果??????????????



PQ 解决方案
捕获2.JPG
捕获.JPG

TA的精华主题

TA的得分主题

发表于 2024-12-11 08:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-12-11 08:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ykcbf1100 于 2024-12-11 08:58 编辑

附件供参考。。。

工作簿2.zip

34.17 KB, 下载次数: 14

TA的精华主题

TA的得分主题

发表于 2024-12-11 08:32 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-12-11 08:59 编辑

此题要点是从身份证号中提取性别和年龄

  1. Sub ykcbf()  '//2024.12.11
  2.     Application.ScreenUpdating = False
  3.     Set sh = ThisWorkbook.Sheets("结果")
  4.     ReDim brr(1 To 100, 1 To 4)
  5.     For Each sht In Sheets
  6.         If sht.Name <> sh.Name Then
  7.             With sht
  8.                 r = .Cells(Rows.Count, 1).End(3).Row
  9.                 arr = .[a1].Resize(r, 6)
  10.             End With
  11.             For i = 2 To UBound(arr)
  12.                 id = CStr(arr(i, 2))
  13.                 Call IDInfo(id, zr)
  14.                 Select Case zr(3)
  15.                     Case Is <= 30
  16.                         m = 1
  17.                     Case Is <= 40
  18.                         m = 2
  19.                     Case Is <= 50
  20.                         m = 3
  21.                     Case Is <= 60
  22.                         m = 4
  23.                     Case Else
  24.                         m = 5
  25.                 End Select
  26.                 brr(m, 1) = brr(m, 1) + IIf(zr(1) = "男", 1, 0)
  27.                 brr(m, 2) = brr(m, 2) + IIf(zr(1) = "女", 1, 0)
  28.                 brr(m, 3) = brr(m, 3) + IIf(zr(1) = "男", arr(i, 6), 0)
  29.                 brr(m, 4) = brr(m, 4) + IIf(zr(1) = "女", arr(i, 6), 0)
  30.             Next
  31.         End If
  32.     Next
  33.     sh.[c2].Resize(5, 4) = brr
  34.     Application.ScreenUpdating = True
  35.     MsgBox "OK!"
  36. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2024-12-11 08:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1楼代码能出正确结果?性别数据是从哪来的?分表中根本没有性别列。

TA的精华主题

TA的得分主题

发表于 2024-12-11 09:16 | 显示全部楼层
Sub hz()
Dim i, t, y, yy, kk, m, n, p, q, s, a, irow, icolumn
Dim tepar, ar, br, cr
Dim sht As Worksheet
Dim tt
tt = Timer
Dim d1, d2, d3 As Object
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
Set d3 = CreateObject("scripting.dictionary")
For Each sht In Sheets
  If sht.Name <> "结果" Then
  irow = sht.[a65536].End(xlUp).Row
  tepar = sht.[a1].Resize(irow, 8)
  For i = 2 To irow
  s = Val(Mid(tepar(i, 2), 17, 1))
  If s Mod 2 = 1 Then
    tepar(i, 7) = "男"
     Else
       tepar(i, 7) = "女"
   End If
   t = Val(Mid(tepar(i, 2), 7, 4))
   y = Year(Now())
   yy = y - t
   If yy <= 30 Then
       tepar(i, 8) = "0-30"
      Else
        If yy <= 40 Then
       tepar(i, 8) = "31-40"
        Else
         If yy <= 50 Then
         tepar(i, 8) = "41-50"
         Else
         If yy <= 60 Then
         tepar(i, 8) = "51-60"
           Else
            tepar(i, 8) = "60以上"
        End If
      End If
     End If
   End If
   d1(tepar(i, 1) & tepar(i, 8) & tepar(i, 7)) = d1(tepar(i, 1) & tepar(i, 8) & tepar(i, 7)) + 1
   d2(tepar(i, 1) & tepar(i, 8) & tepar(i, 7)) = d2(tepar(i, 1) & tepar(i, 8) & tepar(i, 7)) + tepar(i, 6)
   d3(tepar(i, 1) & "," & tepar(i, 8)) = ""
Next
End If
Next

ReDim ar(1 To d3.Count, 1 To 2)
For Each kk In d3.keys
   m = m + 1
    For n = 1 To 2
    ar(m, n) = Split(kk, ",")(n - 1)
    Next
Next
Sheets("结果").[a2].Resize(100, 2).ClearContents
Sheets("结果").[a2].Resize(m, 2) = ar
br = Sheets("结果").[a1].Resize(1 + m, 6)
ReDim cr(1 To m, 1 To 4)
For p = 2 To m + 1
   For q = 3 To 4
     cr(p - 1, q - 2) = d1(br(p, 1) & br(p, 2) & Left(br(1, q), 1))
    Next
    For q = 5 To 6
     cr(p - 1, q - 2) = d2(br(p, 1) & br(p, 2) & Left(br(1, q), 1))
    Next
Next
Sheets("结果").[c2].Resize(100, 4).ClearContents
Sheets("结果").[c2].Resize(m, 4) = cr
MsgBox Timer - tt
MsgBox "ok"
End Sub

TA的精华主题

TA的得分主题

发表于 2024-12-11 09:18 | 显示全部楼层
供参考,欢迎批评指正

工作簿1.zip

40.06 KB, 下载次数: 8

样稿

TA的精华主题

TA的得分主题

发表于 2024-12-11 11:04 | 显示全部楼层
更新了一下代码,实现 小计 及 总计。


是这个效果吗? 好就上花!
  1. let
  2.       源 = Table.SelectRows(
  3.             Excel.Workbook(File.Contents("C:\Users\飞飞\Desktop\VBA\12-11-1.xlsx"), null, true),
  4.             each [Name] <> "结果"
  5.       )[Data],
  6.       Tab1 = Table.SelectRows(
  7.             Table.SelectColumns(
  8.                   Table.Combine(List.Transform(源, each Table.PromoteHeaders(_))),
  9.                   {"机构", "身份证号码", "收入"}
  10.             ),
  11.             each [机构] <> null
  12.       ),
  13.       fx = (R) =>
  14.             [
  15.                   a = Text.From(R{1}),
  16.                   Year = Number.From(Text.Range(a, 6, 4)),
  17.                   Mon = Number.From(Text.Range(a, 10, 2)),
  18.                   Day = Number.From(Text.Range(a, 12, 2)),
  19.                   Old = Number.Round(
  20.                         Duration.TotalDays(
  21.                               Date.From(DateTime.FixedLocalNow()) - Date.From(#date(Year, Mon, Day))
  22.                         )
  23.                               / 365,
  24.                         2
  25.                   ),
  26.                   gx = (S, T) =>
  27.                         if T < 30 then
  28.                               "0-30"
  29.                         else if S > T then
  30.                               Text.Format("#{0}-#{1}", {Text.From(T + 1), Text.From(T + 10)})
  31.                         else
  32.                               @gx(S, T - 10),
  33.                   O = gx(Old, 60),
  34.                   Sex = if Number.IsEven(Number.From(Text.Range(a, 16, 1))) then "女" else "男",
  35.                   H = {R{0}, O, Sex, R{2}}
  36.             ][H],
  37.       Lst = List.Transform(Table.ToRows(Tab1), each fx(_)),
  38.       Tab2 = Table.FromRows(Lst),
  39.       Group = Table.Group(
  40.             Tab2,
  41.             "Column1",
  42.             {
  43.                   "c",
  44.                   (z) =>
  45.                         Table.Group(
  46.                               z,
  47.                               "Column2",
  48.                               {
  49.                                     "d",
  50.                                     each [
  51.                                           Mal = List.Count(List.Select([Column3], (x) => x = "男")),
  52.                                           Fam = List.Count([Column3]) - Mal,
  53.                                           MM = List.Sum(
  54.                                                 Table.SelectRows(_, (y) => y[Column3] = "男")[
  55.                                                       Column4
  56.                                                 ]
  57.                                           ),
  58.                                           FM = List.Sum([Column4]) - MM,
  59.                                           k = Table.FromRows(
  60.                                                 {{Mal, Fam, MM, FM}},
  61.                                                 {"男数", "女数", "男收", "女收"}
  62.                                           )
  63.                                     ][k]
  64.                               }
  65.                         )
  66.             }
  67.       ),
  68.       Expand = Table.TransformColumns(
  69.             Group,
  70.             {
  71.                   "c",
  72.                   each [
  73.                         a = Table.Sort(
  74.                               Table.ExpandTableColumn(_, "d", {"男数", "女数", "男收", "女收"}),
  75.                               {(x) => Text.BeforeDelimiter(x[Column2], "-"), 0}
  76.                         ),
  77.                         b = Table.Group(
  78.                               a,
  79.                               {},
  80.                               List.Transform(
  81.                                     Table.ColumnNames(a),
  82.                                     (y) =>
  83.                                           {y, (z) => try List.Sum(Table.Column(a, y)) otherwise "小计"}
  84.                               )
  85.                         ),
  86.                         c = a & b
  87.                   ][c]
  88.             }
  89.       ),
  90.       Res = [
  91.             a = Table.ExpandTableColumn(Expand, "c", {"Column2", "男数", "女数", "男收", "女收"}),
  92.             b = Table.SelectRows(a, each [Column2] = "小计"),
  93.             c = Table.Group(
  94.                   b,
  95.                   {},
  96.                   List.Transform(
  97.                         List.Skip(Table.ColumnNames(b)),
  98.                         each {_, (x) => try List.Sum(Table.Column(b, _)) otherwise "总计"}
  99.                   )
  100.             ),
  101.             d = a & c
  102.       ][d]
  103. in
  104.       Res
复制代码

捕获2.JPG
捕获.JPG

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-12-11 12:50 | 显示全部楼层
本帖最后由 快人一步 于 2024-12-11 12:51 编辑

多谢各位师傅,无意思上错附件,现重新上传。

新建文件夹.rar

1.67 MB, 下载次数: 9

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

本版积分规则

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

GMT+8, 2024-12-25 15:33 , Processed in 0.037127 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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