ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请老师优化一下代码

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-10 09:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykcbf1100 发表于 2024-3-9 20:53
没有附件,要改成通用,不太现实。首先:标题行有变化,其次,数据列有变化,第三,数据复制到目标表的位置 ...

Sub 合并目录下所有工作簿()
  Dim MyPath, MyName, AWbName, titleRow
  Dim Wb As Workbook, WbN As String
  Dim G As Long
  Dim Num As Long
  Dim T
  T = Timer
  Application.ScreenUpdating = False
  titleRow = InputBox("请输入标题行数", "默认行数", "3") '默认标题行数
    If titleRow = "" Then
    Exit Sub
    End If
  wjj = InputBox("请输入文件夹名称", "默认文件夹", "拆分文件") '需汇总的文件夹
  If wjj = "" Then Exit Sub
  MyPath = ThisWorkbook.Path & "\" & wjj
  If Len(Dir(MyPath, vbDirectory)) = 0 Then MkDir MyPath ' MkDir创建目录或文件夹
  MyName = Dir(MyPath & "\" & "*.xls*")
  AWbName = ActiveWorkbook.Name
  Sheets("汇总表").UsedRange.Offset(titleRow, 0).Clear '清除汇总表原数据保留标题
  Num = 0
  Do While MyName <> ""
  If MyName <> AWbName Then
    Set Wb = Workbooks.Open(MyPath & "\" & MyName)
    Num = Num + 1
    With Workbooks(1).ActiveSheet
      'For G = 1 To Sheets.Count
      MaxRow = .UsedRange.Rows.Count
      ActiveSheet.Range("A" & titleRow + 1 & ":E" & MaxRow).Copy .Cells(.Range("B65536").End(xlUp).Row + 1, 1)
      'Next
      WbN = WbN & Chr(13) & Wb.Name
      Wb.Close False
    End With
  End If
  MyName = Dir
  Loop
  MaxRow2 = Sheets("汇总表").Range("A" & titleRow).End(xlDown).Row '行数
  Sheets("汇总表").Activate
  Cells(MaxRow2 + 1, 1).Value = "合计"
  Cells(MaxRow2 + 1, 2).Value = Application.WorksheetFunction.Sum(Range(Cells(titleRow + 1, 2), Cells(MaxRow2 + 1, 2)))
  Range("B1").Select
  Application.ScreenUpdating = True
  MsgBox "用时" & Format((Timer - T), "0.0000") & "秒,共合并了" & Num & "个工作薄如下:" & Chr(13) & WbN, vbInformation, "提示"
' 添加边框()
MaxCol = ActiveSheet.Range("A1").CurrentRegion.Columns.Count '获取列数
Range(Cells(titleRow, 1), Cells(MaxRow2 + 1, MaxCol)).Select
  With Selection.Borders
  .LineStyle = xlContinuous
  .ColorIndex = xlAutomatic
  .TintAndShade = 0
  .Weight = xlThin
  End With
End Sub
参考大师们的代码,基本实现了变量,但这句的E:麻烦修改一下 ActiveSheet.Range("A" & titleRow + 1 & ":E" & MaxRow).Copy .Cells(.Range("B65536").End(xlUp).Row + 1, 1)

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-10 09:13 | 显示全部楼层
本帖最后由 wcj6376tcp 于 2024-3-10 09:15 编辑

已上传附件,请老师修改一下这句中的E:为变量  ActiveSheet.Range("A" & titleRow + 1 & ":E" & MaxRow).Copy .Cells(.Range("B65536").End(xlUp).Row + 1, 1)

汇总拆分打印统计表.rar

30.46 KB, 下载次数: 3

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-10 09:18 | 显示全部楼层
本帖最后由 wcj6376tcp 于 2024-3-10 09:26 编辑
ykcbf1100 发表于 2024-3-9 20:53
没有附件,要改成通用,不太现实。首先:标题行有变化,其次,数据列有变化,第三,数据复制到目标表的位置 ...

请老师把:E这处修改为变量,感觉就应该适应行列变化通用了,谢谢
QQ截图20240310092017.png

汇总拆分打印统计表.rar

30.46 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-3-10 09:27 | 显示全部楼层
wcj6376tcp 发表于 2024-3-9 17:45
麻烦老师发一下代码呢?

Sub 合并目录下所有工作簿()
    Dim MyPath, MyName, Arr
    Dim Wb As Workbook, WbN As Workbook
    Dim G As Long, MaxRow%, MaxCol%
    Dim Num As Long, WbList As String  
   
    Application.ScreenUpdating = False
    G = InputBox("请输入表头行数")  '自定义表头行数
    Set WbN = ThisWorkbook
    WbN.Sheets("汇总表").UsedRange.Offset(G, 0).Clear   '清除汇总表原有数据,保留前三行表头
    With Application.FileDialog(msoFileDialogFolderPicker)
      .InitialFileName = ThisWorkbook.Path               '默认路径为现有路径
      .Title = "选择文件夹"
      If .Show = False Then
         MsgBox "您选择""取消"",即将退出程序!"
         Exit Sub
      End If
      MyPath = .SelectedItems(1)
      MyName = Dir(MyPath & "\" & "*.xls*")
      Do While MyName <> ""
        If Split(MyName, ".xls")(0) <> WbN.Name Then  '如果和汇总表工作薄在同一文件夹,则排除汇总表
           Num = Num + 1
           WbList = WbList & Chr(13) & Split(MyName, ".xls")(0)
           Set Wb = Workbooks.Open(MyPath & "\" & MyName)
            With Wb.Sheets(1)     '第一个工作表
               MaxRow = .UsedRange.Rows.Count
               MaxCol = .UsedRange.Columns.Count
               Arr = .Range(.Cells(G + 1, 1), .Cells(MaxRow, MaxCol)).Value '将第四行及以下的数据读入数组(去掉表头)
               Wb.Close False
            End With
        End If
        With WbN.Sheets("汇总表")
            MaxRow = .UsedRange.Rows.Count
            .Cells(MaxRow, 1).Resize(UBound(Arr), UBound(Arr, 2)) = Arr '将数组读入汇总表中
        End With
        MyName = Dir
      Loop

      With WbN.Sheets("汇总表")
            MaxRow = .UsedRange.Rows.Count
            MaxCol = .UsedRange.Columns.Count
            .Cells(MaxRow + 1, 1) = "合计"
            .Cells(MaxRow + 1, 2) = "=sum(R[-" & MaxRow - 3 & "]C:R[-1]C)"
            With .Range(.Cells(G, 1), .Cells(MaxRow, MaxCol)).Borders ' 添加边框
              .LineStyle = xlContinuous
              .ColorIndex = xlAutomatic
              .TintAndShade = 0
              .Weight = xlThin
            End With
            .Activate
      End With
    End With
    Application.ScreenUpdating = True
    MsgBox "共合并了" & Num & "个工作薄如下:" & Chr(13) & WbList, vbInformation, "提示"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-10 10:04 | 显示全部楼层
本帖最后由 wcj6376tcp 于 2024-3-10 10:06 编辑
excel玉米 发表于 2024-3-9 13:33
适用于自定义表头行数数量统一的情形。

老师按照你的运行好像只能汇总到最后一个,而且汇总表里会越来越长呢?
2.png

TA的精华主题

TA的得分主题

发表于 2024-3-10 10:51 | 显示全部楼层
wcj6376tcp 发表于 2024-3-10 09:18
请老师把:E这处修改为变量,感觉就应该适应行列变化通用了,谢谢

大约这样吧

image.png

TA的精华主题

TA的得分主题

发表于 2024-3-10 11:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wcj6376tcp 发表于 2024-3-10 10:04
老师按照你的运行好像只能汇总到最后一个,而且汇总表里会越来越长呢?

没有附件,我只是在你的代码基础上做修改,并没有经过测试。根据你的附图我无法知道原因。
你可以将你的部分数据脱敏后上传,以供测试

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-10 12:03 来自手机 | 显示全部楼层
excel玉米 发表于 2024-3-10 11:17
没有附件,我只是在你的代码基础上做修改,并没有经过测试。根据你的附图我无法知道原因。
你可以将你的 ...

附件已上传,汇总2就是搬的你的代码

TA的精华主题

TA的得分主题

发表于 2024-3-10 20:09 | 显示全部楼层
没有源数据不好测试,附件供参考,代码在下一楼。

汇总拆分打印统计表.7z

26.16 KB, 下载次数: 2

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-10 20:09 | 显示全部楼层
代码如下:
  1. Sub 合并目录下所有工作簿()
  2.     Dim MyPath, MyName, AWbName, titleRow
  3.     Dim wb As Workbook, WbN As String
  4.     Dim G As Long
  5.     Dim Num As Long
  6.     Dim T
  7.     T = Timer
  8.     Application.ScreenUpdating = False
  9.     titleRow = InputBox("请输入标题行数", "默认行数", "3") '默认标题行数
  10.     If titleRow = "" Then Exit Sub
  11.     wjj = InputBox("请输入文件夹名称", "默认文件夹", "拆分文件") '需汇总的文件夹
  12.     If wjj = "" Then Exit Sub
  13.     Set ws = ThisWorkbook
  14.     Set sh = ws.Sheets("汇总表")
  15.     MyPath = ThisWorkbook.Path & "" & wjj
  16.     If Len(Dir(MyPath, vbDirectory)) = 0 Then MkDir MyPath ' MkDir创建目录或文件夹
  17.     MyName = Dir(MyPath & "" & "*.xls*")
  18.     Sheets("汇总表").UsedRange.Offset(titleRow, 0).Clear '清除汇总表原数据保留标题
  19.     Num = 0
  20.     Do While MyName <> ""
  21.         If MyName <> ws.Name Then
  22.             Set wb = Workbooks.Open(MyPath & "" & MyName)
  23.             Num = Num + 1
  24.             With wb.Sheets(1)
  25.                 MaxRow = .UsedRange.Rows.Count
  26.                 MaxCol = .UsedRange.Columns.Count
  27.                 r = Cells(Rows.Count, 1).End(3).Row
  28.                 .Range("A" & titleRow + 1 & ":E" & MaxRow).Copy sh.Cells(r + 1, 1)
  29.                 WbN = WbN & Chr(13) & wb.Name
  30.                 wb.Close False
  31.             End With
  32.         End If
  33.         MyName = Dir
  34.     Loop
  35.     With sh
  36.         MaxRow2 = .Cells(Rows.Count, 1).End(3).Row '行数
  37.         .Cells(MaxRow2 + 1, 1).Value = "合计"
  38.         .Cells(MaxRow2 + 1, 2).Value = Application.WorksheetFunction.Sum(.Range(.Cells(titleRow + 1, 2), .Cells(MaxRow2 + 1, 2)))
  39.         .Range("B1").Select
  40.         Application.ScreenUpdating = True
  41.         MsgBox "用时" & Format((Timer - T), "0.0000") & "秒,共合并了" & Num & "个工作薄如下:" & Chr(13) & WbN, vbInformation, "提示"
  42.         ' 添加边框()
  43.         MaxCol = .UsedRange.Columns.Count  '获取列数
  44.         Range(.Cells(titleRow, 1), .Cells(MaxRow2 + 1, MaxCol)).Select
  45.         With Selection.Borders
  46.             .LineStyle = xlContinuous
  47.             .ColorIndex = xlAutomatic
  48.             .TintAndShade = 0
  49.             .Weight = xlThin
  50.         End With
  51.     End With
  52. End Sub
复制代码


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

本版积分规则

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

GMT+8, 2024-11-18 08:22 , Processed in 0.047505 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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