ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 不打开合并多簿多表且第一行的列标题相同叠加

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-11-27 13:11 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wowo000 发表于 2022-11-27 12:20
谢谢您的指教!多谢!

Sub consolidate()

    Dim wok As Workbook

    Dim sht As Worksheet

    Dim dic1 As Object

    Set dic1 = CreateObject("scripting.dictionary")

    Dim dic2 As Object

    Set dic2 = CreateObject("scripting.dictionary")

    'dic1代表每个不重复的工作表名

    'dic2代表每个不重复的标题名

    Application.DisplayAlerts = False

    Application.ScreenUpdating = False

    With Application.FileDialog(msoFileDialogFolderPicker)

        .Title = "(select folder)"

        If .Show = -1 Then

            FolderPath = .SelectedItems(1)

            fullPath = FolderPath & "\*.xls*"

            workbookName = Dir(fullPath)

            Do While workbookName <> ""

                workbookFullName = FolderPath & "\" & workbookName

                Set wok = Workbooks.Open(workbookFullName)

                For Each sht In wok.Worksheets

                    arr1 = sht.UsedRange

                    If Not dic1.exists(sht.Name) Then

                        '下面将工作簿的表头放入字典

                         Set dic2 = CreateObject("scripting.dictionary")

                        For j = 1 To UBound(arr1, 2)

                            dic2(arr1(1, j)) = ""

                        Next j

                        

                        Set dic1(sht.Name) = dic2

                    Else

                        Set dic2 = dic1(sht.Name)

                        For j = 1 To UBound(arr1, 2)

                            dic2(arr1(1, j)) = ""

                        Next j

                        Set dic1(sht.Name) = dic2

                    End If

                Next sht

                workbookName = Dir

                wok.Close

            Loop

        End If

    End With

    For Each k1 In dic1.keys

        Dim arrResult()

        iRowNumberOfEachSheet = 1

        iColumnsNumber = 0

        '将arrResult写入表,表头就是dic1(k1)下的字典的键

        Set sht = Worksheets.Add()

        sht.Name = k1

        Erase arrResult

        ReDim Preserve arrResult(1 To dic1(k1).Count, 1 To iRowNumberOfEachSheet)

        For Each k2 In dic1(k1).keys

            iColumnsNumber = iColumnsNumber + 1

            arrResult(iColumnsNumber, iRowNumberOfEachSheet) = k2

        Next k2

        workbookName = Dir(fullPath)

        Do While workbookName <> ""

            workbookFullName = FolderPath & "\" & workbookName

            Set wok = Workbooks.Open(workbookFullName)

            Dim wsSourceWorksheet

            For Each wsSourceWorksheet In wok.Worksheets

                If wsSourceWorksheet.Name = k1 Then

                    arr1 = wsSourceWorksheet.UsedRange

                    For i = 2 To UBound(arr1, 1)

                        '将每行数据写入arrResult

                        iRowNumberOfEachSheet = iRowNumberOfEachSheet + 1

                        ReDim Preserve arrResult(1 To dic1(k1).Count, 1 To iRowNumberOfEachSheet)

                        iColumnCount = 0

                        For Each k2 In dic1(k1).keys

                        '匹配写入的列

                            iColumnCount = iColumnCount + 1

                            For j = 1 To UBound(arr1, 2)

                                If arr1(1, j) = k2 Then

                                    arrResult(iColumnCount, iRowNumberOfEachSheet) = arr1(i, j)

                                    Exit For

                                End If

                            Next j

                        Next k2

                    Next i

                End If

            Next wsSourceWorksheet

            sht.Range("a1").Resize(UBound(arrResult, 2), UBound(arrResult, 1)) = WorksheetFunction.Transpose(arrResult)

            workbookName = Dir

            wok.Close

        Loop

    Next k1

    Application.DisplayAlerts = True

        Application.ScreenUpdating = True

End Sub



这个也是论坛上的,也可以参考一下。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 15:02 | 显示全部楼层
本帖最后由 wowo000 于 2022-11-27 15:10 编辑
3190496160 发表于 2022-11-27 12:24
Set dic = Nothing这句代码是在运行过程中的,移除了字典,肯定就会出现对象变量未设置的错误提示了。尅修 ...

尊敬的春风化雨老师:可否劳烦您抽空帮俺修理修理?多谢!!!

TA的精华主题

TA的得分主题

发表于 2022-11-27 15:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
练习.rar (805.1 KB, 下载次数: 27)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

谢谢您!尊敬的fzxba老师!!虽然不是俺的意思,但还得感谢您!俺的要求将所有簿中的所有表都合并到一个工作表里。不过您这也提供了另一个不错的选择,谢谢您!!!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-11-27 15:42 | 显示全部楼层
本帖最后由 fzxba 于 2022-11-27 15:45 编辑
wowo000 发表于 2022-11-27 15:39
谢谢您!尊敬的fzxba老师!!虽然不是俺的意思,但还得感谢您!俺的要求将所有簿中的所有表都合并到一个 ...

难度不大……

我是练习试试。

TA的精华主题

TA的得分主题

发表于 2022-11-27 16:15 | 显示全部楼层
    鼓捣了一下,可以运行了

不打开合并多簿多表且列标题相同叠加.rar

875.76 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 16:32 | 显示全部楼层
fzxba 发表于 2022-11-27 15:42
难度不大……

我是练习试试。

尊敬的fzxba老师:劳烦您抽空帮俺整一个附件吧?

TA的精华主题

TA的得分主题

发表于 2022-11-27 18:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wowo000 发表于 2022-11-27 16:32
尊敬的fzxba老师:劳烦您抽空帮俺整一个附件吧?
  1. Sub test2() '仅供测试
  2.   Dim ar, br, i As Long, Dic As Object, Dict As Object
  3.   Dim Conn As Object, rs As Object, Cata As Object, tb As Object
  4.   Dim strConn As String, s As String, p As String, f As String, t As String
  5.    
  6.   Cells.Clear 'Contents
  7.   Application.ScreenUpdating = False
  8.   
  9.   Set Dic = CreateObject("Scripting.Dictionary")
  10.   Set Dict = CreateObject("Scripting.Dictionary")
  11.   
  12.   s = "Excel 12.0;HDR=yes;Database="
  13.   If Application.Version < 12 Then
  14.     s = Replace(s, "12.0", "8.0")
  15.     strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';Data Source="
  16.   Else
  17.     strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';Data Source="
  18.   End If
  19.   
  20.   Set Conn = CreateObject("ADODB.Connection")
  21.   Conn.Open strConn & ThisWorkbook.FullName
  22. '  Set rs = CreateObject("ADODB.Recordset")
  23.   Set Cata = CreateObject("ADOX.Catalog")
  24.   
  25.   p = ThisWorkbook.Path & "\"
  26.   f = Dir(p & "*.xls?")
  27.   While Len(f)
  28.     If p & f <> ThisWorkbook.FullName Then
  29.       Cata.ActiveConnection = strConn & p & f
  30.       For Each tb In Cata.Tables
  31.         If tb.Type = "TABLE" Then
  32.           t = Replace(tb.Name, "'", "")
  33.           If Right(t, 1) = "$" Then
  34.             Set rs = Conn.Execute("SELECT * FROM [" & s & p & f & "].[" & t & "A1:IV1] WHERE FALSE")
  35.             For i = 0 To rs.Fields.Count - 1
  36.               If Not rs.Fields(i).Name Like "F[1-9]*" Then Dic(rs.Fields(i).Name) = vbNullString
  37.             Next
  38.           End If
  39.         End If
  40.       Next
  41.     End If
  42.     f = Dir
  43.   Wend
  44.   
  45.   br = Dic.Keys
  46.   Dic.RemoveAll
  47.   For i = 0 To UBound(br)
  48.     Range("C1").Offset(0, i) = br(i)
  49.     Dic.Add br(i), i
  50.     br(i) = "NULL AS " & br(i)
  51.   Next
  52.   Range("A1").Resize(, 2) = Split("工作簿名 工作表名")
  53.   
  54.   f = Dir(p & "*.xls?")
  55.   While Len(f)
  56.     If p & f <> ThisWorkbook.FullName Then
  57.       Cata.ActiveConnection = strConn & p & f
  58.       For Each tb In Cata.Tables
  59.         If tb.Type = "TABLE" Then
  60.           t = Replace(tb.Name, "'", "")
  61.           If Right(t, 1) = "$" Then
  62.             ar = br
  63.             Set rs = Conn.Execute("SELECT * FROM [" & s & p & f & "].[" & t & "A1:IV1] WHERE FALSE")
  64.             For i = 0 To rs.Fields.Count - 1
  65.               If Not rs.Fields(i).Name Like "F[1-9]*" Then
  66.                 If Dic.Exists(rs.Fields(i).Name) Then ar(Dic(rs.Fields(i).Name)) = rs.Fields(i).Name
  67.               End If
  68.             Next
  69.             Dict.Add "SELECT '" & Split(f, ".xls")(0) & "','" & Left(t, Len(t) - 1) & "'," & Join(ar, ",") & " FROM [" & s & p & f & "].[" & t & "] WHERE LEN(客户编码)", vbNullString
  70.             If Dict.Count = 49 Then
  71.               Cells(Rows.Count, 1).End(xlUp).Offset(1).CopyFromRecordset Conn.Execute(Join(Dict.Keys(), " UNION ALL "))
  72.               Dict.RemoveAll
  73.             End If
  74.           End If
  75.         End If
  76.       Next
  77.     End If
  78.     f = Dir
  79.   Wend
  80.   Set tb = Nothing
  81.   Set Cata = Nothing

  82.   If Dict.Count Then Cells(Rows.Count, 1).End(xlUp).Offset(1).CopyFromRecordset Conn.Execute(Join(Dict.Keys(), " UNION ALL "))

  83.   Set rs = Nothing
  84.   Conn.Close
  85.   Set Conn = Nothing
  86.   Set Dic = Nothing
  87.   Set Dict = Nothing
  88.   
  89.   Application.ScreenUpdating = True
  90.   Beep
  91. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-11-27 18:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
     感觉您的程序很强大,再学习一下,看看是否是合适。

不打开合并多簿多表且列标题相同叠加.rar

1.56 MB, 下载次数: 21

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 19:16 | 显示全部楼层
本帖最后由 wowo000 于 2022-12-9 18:51 编辑
cpin 发表于 2022-11-27 18:57
感觉您的程序很强大,再学习一下,看看是否是合适。

谢谢您!亲,cpin。再次谢谢您的关注,谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 11:31 , Processed in 0.048911 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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