ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-11-27 10:44 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wowo000 于 2022-11-27 10:46 编辑

打搅各位老师周末休息,劳烦斧正附件里(不打开合并多簿多表且第一行的列标题名称如果相同则往下面叠加堆放,不同的列标亦罗列出来且数据也要)VBA代码,多谢!!!

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

793.9 KB, 下载次数: 30

TA的精华主题

TA的得分主题

发表于 2022-11-27 11:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我的贴i这里 有个 合并拆分工具可以的

TA的精华主题

TA的得分主题

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

=A15=============
Attribute VB_Name = "模块1"
Sub 不打开合并多簿多表且列标题相同叠加在下()
    Dim mp, mn, aw, WbN, wn
    Dim wb As Workbook, Num
    Dim ge, e, endRow, endColumn
    Dim arr, i&, j&, k&, dic As Object, iRow&, iCol&, vItem
    Dim sht As Worksheet, brr
    Set dic = CreateObject("Scripting.Dictionary")
'    Dim brr(1 To 1048576, 1 To 100)
    Application.ScreenUpdating = False
    mp = ActiveWorkbook.Path
    mn = Dir(mp & "\" & "*.xls?")
    aw = ActiveWorkbook.Name
    Num = 0
    Do While mn <> ""
    If mn <> aw Then
       Set wb = Workbooks.Open(mp & "\" & mn)
       ge = ge + 1
       With Workbooks(1).ActiveSheet
            For i = 1 To Sheets.Count
                wb.Sheets(i).AutoFilterMode = False
                endColumn = wb.Sheets(i).UsedRange.Columns.Count
                endRow = wb.Sheets(i).UsedRange.Rows.Count '- 1
            Next
            ReDim brr(1 To 1048576, 1 To 100)
            iCol = 1: iRow = 1: brr(1, 1) = "数据源"
            
''            下面代码判定第一行的列标是否相同
            For i = 1 To Worksheets.Count
'                arr = wb.Sheets(i).Range(wb.Sheets(i).Cells(1, 1), wb.Sheets(i).Cells(endRow, endColumn))
                arr = wb.Sheets(i).UsedRange
                For j = 1 To UBound(arr, 2)
                debug.print j
                                debug.print arr(1,j)
                                stop
                                rem 在本地窗口看看是否 arr没有设置
                    If Not dic.exists(arr(1, j)) Then '这句代码通不过,提示如表里截图错别???
                       iCol = iCol + 1
                       brr(1, iCol) = arr(1, j)
                       dic(arr(1, j)) = iCol
                    End If
                Next j
            Next i
            
''            下面代码合并数据且如果列标相同则往下叠加
            For i = 1 To Sheets.Count
'                arr = wb.Sheets(i).Range(wb.Sheets(i).Cells(1, 1), wb.Sheets(i).Cells(endRow, endColumn))
                arr = wb.Sheets(i).UsedRange
                For j = 2 To UBound(arr)
                    iRow = iRow + 1
                    brr(iRow, 1) = wb.Name & wb.Sheets(i).Name
                    For k = 1 To UBound(arr, 2)
                        vItem = dic(arr(1, k))
                        brr(iRow, vItem) = arr(j, k)
                    Next k
                Next j
            Next i
            
''       将合并数据赋给当前工作表
       Set dic = Nothing
            Cells.Clear
            [a1].Resize(iRow, iCol) = brr
'            With [a1].CurrentRegion
'                  .HorizontalAlignment = xlCenter
'                  .Borders.LineStyle = xlContinuous
'                  .Rows(1).Font.Bold = True
'                  .EntireColumn.AutoFit
'                  .EntireRow.AutoFit
'            End With
            WbN = WbN & Chr(13) & wb.Name
            wb.Close False
       End With
    End If
    mn = Dir
    Loop
    Range("a1").Select
    Application.ScreenUpdating = True
    MsgBox "共合并了" & ge & "个工作薄下全部工作表。如下:" & vbCrLf & WbN, vbInformation, "提示"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 11:14 | 显示全部楼层
捞屎人 发表于 2022-11-27 11:07
我的贴i这里 有个 合并拆分工具可以的

谢谢您的关注!你可能还没理解俺附件里的要求。可否劳烦理解后给整整???

TA的精华主题

TA的得分主题

发表于 2022-11-27 11:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wowo000 发表于 2022-11-27 11:14
谢谢您的关注!你可能还没理解俺附件里的要求。可否劳烦理解后给整整???

看你级别也不是这种小儿科问题能难住的 ,呵呵 。

TA的精华主题

TA的得分主题

发表于 2022-11-27 11:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-11-27 12:13 | 显示全部楼层
    把Set dic = CreateObject("Scripting.Dictionary")放在过程中,比如 ReDim brr后面,试下,我是猜测的。ReDim brr(1 To 1048576, 1 To 100)数组太大了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 12:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cpin 发表于 2022-11-27 12:13
把Set dic = CreateObject("Scripting.Dictionary")放在过程中,比如 ReDim brr后面,试下,我是猜测的 ...

谢谢您指教!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-27 12:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zpy2 发表于 2022-11-27 11:12
=A15=============
Attribute VB_Name = "模块1"
Sub 不打开合并多簿多表且列标题相同叠加在下()

谢谢您的指教!多谢!

TA的精华主题

TA的得分主题

发表于 2022-11-27 12:24 | 显示全部楼层
Set dic = Nothing这句代码是在运行过程中的,移除了字典,肯定就会出现对象变量未设置的错误提示了。尅修改为,dic.RemoveAll,也就是清空字典,而不是移除字典,
只能是试试看看吧,你目前的代码,其实,整体思路就是不对的

评分

1

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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