ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

多个excel如何合并成一个,excel中的列不是完全相同,可能列的顺序不同

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-5-14 18:08 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
多个excel如何合并成一个,excel中的列不是完全相同,可能列的顺序不同,如何把相同的项合并到一列中,并且在每个excel中新增一列,把表名插入到那一列中

test.zip

34.99 KB, 下载次数: 25

TA的精华主题

TA的得分主题

发表于 2015-5-14 20:25 | 显示全部楼层
每个表的字段数量必须相同,就是说不能缺项,顺序可以打乱。
  1. Sub ado()
  2.     Dim cnn As Object, rs As Object, sql$, ks&
  3.     Dim bt, s$, mypath$, mynm$, myfile$, arr, j%, r&, bm$
  4.     Set cnn = CreateObject("Adodb.Connection")
  5.     Set rs = CreateObject("adodb.recordset")
  6.     If Application.Version * 1 <= 11 Then
  7.         cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties='Excel 8.0;imex=1;hdr=yes';Data Source=" & ThisWorkbook.FullName
  8.     Else
  9.         cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;imex=1;hdr=yes';Data Source=" & ThisWorkbook.FullName
  10.     End If
  11.     With Sheets("汇总")
  12.     .[a2:r60000] = ""
  13.         arr = .[a1:q1]: s = arr(1, 1)
  14.         For j = 2 To UBound(arr, 2)
  15.             s = s & "," & arr(1, j)
  16.         Next
  17.         mypath = ThisWorkbook.Path & ""
  18.         mynm = Dir(mypath & "*.xls")
  19.         Do While mynm <> ""
  20.             If mynm <> ThisWorkbook.Name Then
  21.                 myfile = mypath & mynm
  22.                 bm = Split(mynm, ".x")(0)
  23.                 sql = "select " & s & " from [Excel 8.0;hdr=yes;Database=" & myfile & "].[" & bm & "$] where xm is not null"
  24.                 'Debug.Print sql
  25.                 Set rs = cnn.Execute(sql)
  26.                 r = .Cells.Find("*", Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row + 1
  27.                 .Range("a" & r).CopyFromRecordset rs
  28.                 ks = r
  29.                 r = .Cells.Find("*", Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row + 1
  30.                 .Range("r" & ks).Resize(r - ks) = bm
  31.             End If
  32.             mynm = Dir
  33.         Loop
  34.     End With
  35.     rs.Close: cnn.Close
  36.     Set rs = Nothing
  37.     Set cnn = Nothing
  38. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-5-14 20:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
。。。。。
test.zip (75.21 KB, 下载次数: 55)

TA的精华主题

TA的得分主题

发表于 2015-5-14 21:01 | 显示全部楼层
这样???????????
  1. Sub GetData()
  2.     Call Sum
  3.     Dim arr, brr, crr, fileArr, d As Object
  4.     Dim sht As Worksheet, sh As Worksheet, wd As Workbook
  5.     Dim rng As Range
  6.     Dim thePath$, i&, j&, n
  7.     Set sh = ActiveSheet
  8.     sh.UsedRange.Offset(1).ClearContents
  9.     sh.Range("A1:C1") = Array("文件夹名", "工作簿名", "工作表名")
  10.     arr = Range("A1").CurrentRegion
  11.     Set d = CreateObject("Scripting.Dictionary")
  12.     For i = 1 To UBound(arr, 2)
  13.         d(arr(1, i)) = i
  14.     Next
  15.     With Application.FileDialog(msoFileDialogFolderPicker)
  16.         .InitialFileName = ThisWorkbook.Path & ""
  17.         If .Show = False Then Exit Sub
  18.         thePath = .SelectedItems(1) & ""
  19.     End With

  20.     Application.ScreenUpdating = False
  21.     Application.DisplayAlerts = False
  22.     Application.Calculation = xlManual

  23.     If Right(thePath, 1) <> "" Then thePath = thePath & ""
  24.     ReDim brr(1 To 90000, 1 To UBound(arr, 2))
  25.     fileArr = GetName(thePath)
  26.     For k = 0 To UBound(fileArr)
  27.         Set wb = Workbooks.Open(fileArr(k))
  28.         For Each sht In wb.Worksheets
  29.             Set rng = sht.Cells.Find("*")
  30.             If Not rng Is Nothing Then
  31.                 r = sht.Cells.Find("*", , , , xlByRows, xlPrevious).Row
  32.                 c = sht.Cells.Find("*", , , , xlByColumns, xlPrevious).Column
  33.                 crr = sht.Range(sht.Cells.Find("*", sht.Cells(Rows.Count, Columns.Count), , , xlByRows, xlNext), sht.Cells(r, c))
  34.                 For i = 2 To UBound(crr)
  35.                     x = x + 1
  36.                     For j = 1 To UBound(crr, 2)
  37.                         n = d(crr(1, j))
  38.                         If n <> "" Then
  39.                             m = 1
  40.                             brr(x, 1) = Mid(wb.Path, InStrRev(wb.Path, "") + 1)
  41.                             If Right(wb.Name, 4) = ".xls" Then brr(x, 2) = Left(wb.Name, Len(wb.Name) - 4) Else brr(x, 2) = Left(wb.Name, Len(wb.Name) - 5) '自动适用版本!!!
  42.                             brr(x, 3) = sht.Name
  43.                             brr(x, n) = crr(i, j)
  44.                         End If
  45.                     Next
  46.                     If m = 0 Then x = x - 1
  47.                     m = 0
  48.                 Next
  49.             End If
  50.         Next
  51.         wb.Close False
  52.     Next
  53.     sh.Range("A2").Resize(x, UBound(arr, 2)) = brr
  54.     Application.ScreenUpdating = True
  55.     Application.Calculation = xlAutomatic
  56.     Application.DisplayAlerts = True
  57.     MsgBox "OK!"
  58. End Sub

  59. Sub Sum()
  60. Dim sh As Worksheet, arr, d As Object, i&, j&, MyPath$, Filepath, r&, c&
  61. Cells.ClearContents
  62. With Application.FileDialog(msoFileDialogFolderPicker)
  63.     .InitialFileName = ThisWorkbook.Path & ""
  64.     If .Show = False Then Exit Sub
  65.     MyPath = .SelectedItems(1) & ""
  66. End With
  67. Application.ScreenUpdating = False
  68. Set d = CreateObject("Scripting.Dictionary")
  69. Filepath = GetName(MyPath)
  70.     For kk = 0 To UBound(Filepath)
  71.         Set wb = Workbooks.Open(Filepath(kk))
  72.         For Each sh In wb.Sheets
  73.             If Application.CountA(sh.UsedRange) Then
  74.                         r = sh.Cells.Find("*", , , , xlByRows, xlPrevious).Row
  75.                         c = sh.Cells.Find("*", , , , xlByColumns, xlPrevious).Column
  76.                         arr = sh.Range(sh.Cells.Find("*", sh.Cells(Rows.Count, Columns.Count), , , xlByRows, xlNext), sh.Cells(r, c))
  77.                     For j = 1 To UBound(arr, 2)
  78.                         If Len(arr(1, j)) Then
  79.                             If Not d.Exists(arr(1, j)) Then d(arr(1, j)) = ""
  80.                         End If
  81.                     Next
  82.             End If
  83.         Next
  84.         wb.Close
  85.     Next
  86. Range("D1").Resize(, d.Count) = d.Keys
  87. Application.ScreenUpdating = True
  88. End Sub

  89. Function GetName(lj As String)
  90.     Dim MyName, dic, Did, i, t, F, tt, MyFileName
  91.     Set dic = CreateObject("Scripting.Dictionary")
  92.     Set Did = CreateObject("Scripting.Dictionary")
  93.     dic.Add (lj), ""
  94.     i = 0
  95.     Do While i < dic.Count
  96.         Ke = dic.Keys
  97.         MyName = Dir(Ke(i), vbDirectory)
  98.         Do While MyName <> ""
  99.             If MyName <> "." And MyName <> ".." Then
  100.                 If (GetAttr(Ke(i) & MyName) And vbDirectory) = vbDirectory Then
  101.                     dic.Add (Ke(i) & MyName & ""), ""
  102.                 End If
  103.             End If
  104.             MyName = Dir
  105.         Loop
  106.         i = i + 1
  107.     Loop
  108.     For Each Ke In dic.Keys
  109.         MyFileName = Dir(Ke & "*.xls*")
  110.         Do While MyFileName <> ""
  111.             If MyFileName <> ThisWorkbook.Name Then Did.Add (Ke & MyFileName), ""
  112.             MyFileName = Dir
  113.         Loop
  114.     Next
  115.     GetName = Did.Keys
  116. End Function

复制代码


get.rar

47.61 KB, 下载次数: 52

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-15 14:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
feiren228 发表于 2015-5-14 20:27
。。。。。

用上次传的excel可以正常运行,但是excel文件多了以后,有问题,提示运行时错误‘-2147217904’,至少一个参数没有被指定值,我重新传一个附件,麻烦给看看什么原因吧

TEST1.zip

823.79 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2017-1-31 11:43 | 显示全部楼层
张雄友 发表于 2015-5-14 21:01
这样???????????

各表字段不在一个行次的,也能筛选出来。留下

TA的精华主题

TA的得分主题

发表于 2018-8-9 11:23 | 显示全部楼层
本帖最后由 LMY123 于 2018-8-13 09:43 编辑

ADO,同夹多薄首表合并
字段名相同,顺序不同
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-10 02:36 , Processed in 0.029024 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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