ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 相同格式的多工作簿多工作表求和请教

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-23 07:43 | 显示全部楼层 |阅读模式

最近在汇总多个相同格式的工作簿的多工作表的时候,希望将结果累计写入到内部结构一致的汇总工作簿时,调试到以下这一句时出错了,请老师们帮助我,谢谢。
summarySheet.Range(summarySheet.Cells(startRow, startCol), summarySheet.Cells(endRow, endCol)).Value = summarySheet.Range(summarySheet.Cells(startRow, startCol), summarySheet.Cells(endRow, endCol)).Value + currentSheet.Range(currentSheet.Cells(startRow, startCol), currentSheet.Cells(endRow, endCol)).Value

相同格式的多工作簿多工作表求和工具.rar

37.06 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2023-4-23 08:06 | 显示全部楼层
我感觉你把问题想复杂了:VBA对自身工作簿的操作简单得多。所以分二步走,第一步将多个工作簿上的表汇总到带宏的工作簿上;第二步进行统计,此时的统计就方便多了。

你能写那么复杂的代码,感觉你的水平比我高!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-23 08:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wengjl 发表于 2023-4-23 08:06
我感觉你把问题想复杂了:VBA对自身工作簿的操作简单得多。所以分二步走,第一步将多个工作簿上的表汇总到 ...

你建议的先提取各表格数据,后期再汇总,是可行的。我现在就是希望一步到位。我是初学者水平。

TA的精华主题

TA的得分主题

发表于 2023-4-23 08:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
看你的代码不可能弄得清楚你想如何汇总,
目前的代码搞得过于复杂了,有点简单问题复杂化处理的感觉,而且,对于初学者而言,说点个人之见:变量不要搞得这么复杂,一个变量很多个字母,

TA的精华主题

TA的得分主题

发表于 2023-4-23 09:04 | 显示全部楼层
cqcbc 发表于 2023-4-23 08:18
你建议的先提取各表格数据,后期再汇总,是可行的。我现在就是希望一步到位。我是初学者水平。

一步到位是高水平的人才能做到的。
别人总是把复杂问题简单化,你却想把简单问题复杂啊,不可思议的想法啊。
另外,我也同意4楼老师的意见,不要把变量搞那么多长,看着头晕,看你的代码得看半天,顿失写代码的兴趣。

TA的精华主题

TA的得分主题

发表于 2023-4-23 15:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-23 16:01 | 显示全部楼层
Sub SummarizeWorkbooksData()
    Dim selectedFolder As Object
    Dim queue As New Collection
    ' 选择待汇总求和的工作簿所在的文件夹
    Set selectedFolder = Application.FileDialog(msoFileDialogFolderPicker)
    selectedFolder.AllowMultiSelect = False
    If selectedFolder.Show <> -1 Then Exit Sub
    queue.Add selectedFolder.SelectedItems.Item(1)
    ' 创建汇总工作簿
    Dim summaryWorkbook As Workbook
    Set summaryWorkbook = Workbooks.Add
    ' 遍历队列中的文件夹
    Do While queue.Count > 0
        Dim currentFolder As String
        currentFolder = queue.Item(1)
        queue.Remove 1
        ' 遍历当前文件夹下的所有文件
        Dim currentFile As String
        currentFile = Dir(currentFolder & "\*.*")
        Do While currentFile <> ""
            ' 判断文件类型:只处理xlsx和xls文件
            If Right(currentFile, 4) = ".xlsx" Or Right(currentFile, 4) = ".xls" Then
                Dim currentWorkbook As Workbook
                Set currentWorkbook = Workbooks.Open(currentFolder & "\" & currentFile)
                ' 遍历工作簿中的所有工作表
                Dim currentSheet As Worksheet
                For Each currentSheet In currentWorkbook.Worksheets
                    Dim sheetName As String
                    sheetName = currentSheet.Name
                    ' 在汇总工作簿中查找是否存在相同名称的工作表
                    Dim summarySheet As Worksheet
                    Set summarySheet = Nothing
                    On Error Resume Next
                    Set summarySheet = summaryWorkbook.Worksheets(sheetName)
                    On Error GoTo 0
                    If summarySheet Is Nothing Then
                    ' 如果不存在相同名称的工作表,则在汇总工作簿中新建一个工作表
                        currentSheet.Copy after:=summaryWorkbook.Sheets(summaryWorkbook.Sheets.Count)
                        Set summarySheet = summaryWorkbook.Sheets(summaryWorkbook.Sheets.Count)
                        summarySheet.Name = sheetName
                    Else
                        ' 如果已经存在相同名称的工作表,则将数字求和
                        Dim startRow As Long, startCol As Long, endRow As Long, endCol As Long
                        startRow = currentSheet.UsedRange.Row
                        startCol = currentSheet.UsedRange.Column
                        endRow = currentSheet.UsedRange.Row + currentSheet.UsedRange.Rows.Count - 1
                        endCol = currentSheet.UsedRange.Column + currentSheet.UsedRange.Columns.Count - 1
                        currentSheet.Range(currentSheet.Cells(startRow, startCol), currentSheet.Cells(endRow, endCol)).CurrentRegion.Copy
                        summarySheet.Range(summarySheet.Cells(startRow, startCol), summarySheet.Cells(endRow, endCol)).PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
                    End If
                Next currentSheet
                ' 关闭当前工作簿
                currentWorkbook.Close False
            ElseIf (GetAttr(currentFolder & "\" & currentFile) And vbDirectory) = vbDirectory And currentFile <> "." And currentFile <> ".." Then
                ' 如果是文件夹,则将其添加到队列中
                queue.Add currentFolder & "\" & currentFile
            End If
            currentFile = Dir
        Loop
    Loop
End Sub
修改为选择性粘贴,可以累计一个文件夹的了。

谢谢老师们的帮助。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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