ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 按照标题字段汇集所选定文件件里的所有工作簿

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-6 08:18 | 显示全部楼层 |阅读模式
论坛里的各位老师:早上好!劳烦斧正附件里的代码使其符合里面所表述的要求(现有代码只能选一个簿导一个簿,请改成选定某文件将其所有簿一次性导入),谢谢!

选择文件夹且按标题字段汇集数据.zip

46.86 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2024-4-6 09:01 | 显示全部楼层
本帖最后由 shiruiqiang 于 2024-4-6 09:03 编辑

说实话,改别人的代码比自己写还比较麻烦。
练个手吧,不包售后

image.jpg

选择文件夹且按标题字段汇集数据.rar

48.55 KB, 下载次数: 18

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-6 09:06 | 显示全部楼层
还是新写一个吧,没有多大修改的意义。

选择文件夹且按标题字段汇集数据.7z

34.24 KB, 下载次数: 21

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-6 09:08 | 显示全部楼层
参与一下。。。

  1. Sub ykcbf()  '//2024.4.6
  2.     Application.ScreenUpdating = False
  3.     Application.AskToUpdateLinks = False
  4.     Application.DisplayAlerts = False
  5.     Dim tm: tm = Timer
  6.     Set fso = CreateObject("Scripting.FileSystemObject")
  7.     Set d = CreateObject("Scripting.Dictionary")
  8.     Set sh = ThisWorkbook.Sheets("汇集表")
  9.     With sh
  10.         c = .UsedRange.Columns.Count
  11.         arr = .[a1].Resize(1, c)
  12.     End With
  13.     For j = 1 To UBound(arr, 2)
  14.         If arr(1, j) <> Empty Then
  15.             s = arr(1, j)
  16.             d(s) = j
  17.         End If
  18.     Next
  19.     ReDim brr(1 To 10000, 1 To 100)
  20.     With Application.FileDialog(msoFileDialogFolderPicker)
  21.         .Title = "请选择文件夹"
  22.         .InitialFileName = ThisWorkbook.Path & ""
  23.         If .Show = -1 Then
  24.             p = .SelectedItems(1) & ""
  25.         End If
  26.     End With
  27.     For Each f In fso.GetFolder(p).Files
  28.         If f.Name Like "*.xls*" Then
  29.             If InStr(f.Name, ThisWorkbook.Name) = 0 Then
  30.                 fn = fso.GetBaseName(f)
  31.                 Set wb = Workbooks.Open(f, 0)
  32.                 With wb.Sheets(1)
  33.                     .AutoFilterMode = False
  34.                     arr = .UsedRange
  35.                     wb.Close False
  36.                 End With
  37.                 For i = 2 To UBound(arr)
  38.                     If arr(i, 1) <> Empty Then
  39.                         m = m + 1
  40.                         For j = 1 To UBound(arr, 2)
  41.                             s = arr(1, j)
  42.                             If s <> Empty Then
  43.                                 If Not d.exists(s) Then
  44.                                     d(s) = d.Count
  45.                                 End If
  46.                                 brr(m, d(s)) = arr(i, j)
  47.                             End If
  48.                         Next
  49.                     End If
  50.                 Next
  51.             End If
  52.         End If
  53.     Next f
  54.     With sh
  55.         .UsedRange.Clear
  56.         .[a1].Resize(1, d.Count) = d.keys
  57.         .[a1].Resize(1, d.Count).Interior.Color = 49407
  58.         If m Then
  59.             .[a2].Resize(m, d.Count) = brr
  60.             .Range("A1").Resize(m + 1, d.Count).Borders.LineStyle = 1
  61.         End If
  62.     End With
  63.     Set d = Nothing
  64.     Application.ScreenUpdating = True
  65.     Application.AskToUpdateLinks = True
  66.     Application.DisplayAlerts = True
  67.     MsgBox "共用时:" & Format(Timer - tm) & "秒!"
  68. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2024-4-6 09:21 | 显示全部楼层

TA的精华主题

TA的得分主题

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

老师,请教一下,如果是这种情况,用sql汇总,需要增加字段怎么处理?谢谢

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-6 09:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
shiruiqiang 发表于 2024-4-6 09:36
老师,请教一下,如果是这种情况,用sql汇总,需要增加字段怎么处理?谢谢
  1. Sub test2() '给你写个,仅供你参考
  2.   
  3.   Dim dict(1) As New Dictionary
  4.   Dim Conn As New ADODB.Connection
  5.   Dim rs As New ADODB.Recordset
  6.   
  7.   Dim ar, br, i As Integer
  8.   Dim strSQL(1) As String, strConn As String, strField As String
  9.   Dim s As String, p As String, f As String
  10.   'Const adStateOpen As Long = 1
  11.   'Const adOpenKeyset As Long = 1
  12.   'Const adLockOptimistic As Long = 3
  13.   
  14.   Rows("2:" & Rows.Count).ClearContents
  15.   Application.ScreenUpdating = False
  16.   
  17.   s = "Excel 12.0;HDR=YES;Database="
  18.   If Application.Version < 12 Then
  19.     s = Replace(s, "12.0", "8.0")
  20.     strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES';Data Source="
  21.   Else
  22.     strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=YES';Data Source="
  23.   End If
  24.   Conn.Open strConn & ThisWorkbook.FullName
  25.   
  26.   p = ThisWorkbook.Path & "\数据文件夹\"
  27.   f = Dir(p & "*.xls*")
  28.   Do
  29.     If p & f <> ThisWorkbook.FullName Then
  30.       strSQL(0) = "SELECT * FROM [" & s & p & f & "].[$A1:Z1] WHERE FALSE"
  31.       Set rs = Conn.Execute(strSQL(0))
  32.       For i = 0 To rs.Fields.Count - 1
  33.         strField = rs.Fields(i).Name
  34.         If Not strField Like "F[1-9]*" Then
  35.           strField = "`" & strField & "`"
  36.           If Not dict(0).Exists(strField) Then dict(0).Add strField, dict(0).Count
  37.         End If
  38.       Next
  39.     End If
  40.     f = Dir
  41.   Loop While f <> ""
  42.   
  43.   br = dict(0).Keys
  44.   For i = LBound(br) To UBound(br)
  45.     br(i) = "NULL AS " & br(i)
  46.   Next
  47.   
  48.   f = Dir(p & "*.xls*")
  49.   Do
  50.     If p & f <> ThisWorkbook.FullName Then
  51.       strSQL(0) = "SELECT * FROM [" & s & p & f & "].[$A1:Z1] WHERE FALSE"
  52.       strSQL(1) = "SELECT [.Fields] FROM [" & s & p & f & "].[$A1:Z]"
  53.       ar = br
  54.       Set rs = Conn.Execute(strSQL(0))
  55.       For i = 0 To rs.Fields.Count - 1
  56.         strField = "`" & rs.Fields(i).Name & "`"
  57.         If dict(0).Exists(strField) Then ar(dict(0)(strField)) = strField
  58.       Next
  59.       dict(1).Add Replace(strSQL(1), "[.Fields]", Join(ar, ",")), ""
  60.     End If
  61.     f = Dir
  62.   Loop While f <> ""
  63.   
  64.   If rs.State = adStateOpen Then rs.Close
  65.   rs.Open Join(dict(1).Keys, " UNION ALL "), Conn, adOpenKeyset, adLockOptimistic
  66.   
  67.   With Range("A3")
  68.     For i = 0 To rs.Fields.Count - 1
  69.       .Offset(0, i) = rs.Fields(i).Name
  70.     Next
  71.     .Offset(1).CopyFromRecordset rs
  72. '    With .CurrentRegion
  73. '      .Font.Name = "微软雅黑"
  74. '      .Font.Size = 11
  75. '      .Rows(1).Font.Bold = True
  76. '      .HorizontalAlignment = xlCenter
  77. '      .Borders.LineStyle = xlContinuous
  78. '    End With
  79.   End With
  80.   
  81.   If rs.State = adStateOpen Then rs.Close
  82.   Set rs = Nothing
  83.   If Conn.State = adStateOpen Then Conn.Close
  84.   Set Conn = Nothing
  85.   For i = 0 To UBound(dict)
  86.     Set dict(i) = Nothing
  87.   Next
  88.   
  89.   Application.ScreenUpdating = True
  90.   Beep
  91. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-4-6 09:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ykcbf1100 发表于 2024-4-6 09:06
还是新写一个吧,没有多大修改的意义。

大侠:如果想导入各簿的所有表,怎么修改代码?
谢谢大侠!

TA的精华主题

TA的得分主题

发表于 2024-4-6 10:01 | 显示全部楼层
jjmysjg 发表于 2024-4-6 09:59
大侠:如果想导入各簿的所有表,怎么修改代码?
谢谢大侠!

再加个表循环

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-6 10:03 | 显示全部楼层
尊敬的baofa2老师和shiruiqiang老师及ykcbf1100老师:假如“汇集表”第一行的标题字段VBA代码自动生成咋整??劳烦赐教,多谢!!!

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 18:47 , Processed in 0.052753 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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