1. Sub WorkbooksSheetsConsolidate()
  2. Rem 设置求和区域为 sheet名称/单元格区域;sheet名称/单元格区域
  3. Const Setting As String = "Sheet1/A1:G6;Sheet1/A8:E8;Sheet1/F8:G8;Sheet2/A1:G3;Sheet2/A5:G5"
  4. Const FOLDER_NAME As String = "文件夹"
  5. Dim StartTime As Variant
  6. Dim UsedTime As Variant
  7. StartTime = VBA.Timer
  8.  
  9. AppSettings True
  10. Dim Wb As Workbook
  11. Dim Sht As Worksheet
  12. Dim Dic As Object
  13. Dim Key As String
  14. Dim OneKey
  15. Dim Brr
  16. Dim Arr As Variant
  17. Dim Rng As Range
  18. Dim FilePaths, FilePath
  19. Dim FolderPath As String
  20. Dim OpenWb As Workbook
  21. Dim OpenSht As Worksheet
  22.  
  23. Set Dic = CreateObject("Scripting.Dictionary")
  24. Set Wb = Application.ThisWorkbook
  25. FolderPath = Wb.Path & "\" & FOLDER_NAME & "\"
  26.  
  27. Dim SheetName, RngAddress
  28. Dim Areas, OneArea
  29. Areas = Split(Setting, ";")
  30. For Each OneArea In Areas
  31. SheetName = Split(OneArea, "/")(0)
  32. RngAddress = Split(OneArea, "/")(1)
  33. '解析地址 初始化数组
  34. On Error Resume Next
  35. Set Sht = Wb.Worksheets(SheetName)
  36. If Err.Number = 9 Then
  37. MsgBox "当前工作簿不存在名为【" & SheetName & "】的工作簿!", vbInformation, "Information"
  38. GoTo ErrorExit
  39. End If
  40. On Error GoTo 0
  41.  
  42. Set Rng = Sht.Range(RngAddress)
  43. Rng.ClearContents
  44. Arr = Rng.Value
  45. Debug.Print SheetName; " "; RngAddress
  46. Do
  47. If Dic.Exists(SheetName) = False Then Exit Do
  48. SheetName = SheetName & "@"
  49. Loop
  50. Dic(SheetName) = Array(RngAddress, Arr)
  51.  
  52. Next OneArea
  53.  
  54. FilePaths = FsoGetFiles(FolderPath, "*.xls*")
  55. If FilePaths(1) = "None" Then
  56. MsgBox "指定文件夹未找到任何工作簿!", vbInformation, "Information"
  57. GoTo ErrorExit
  58. End If
  59.  
  60. For Each FilePath In FilePaths
  61. Set OpenWb = Application.Workbooks.Open(FilePath)
  62. For Each OneKey In Dic.Keys
  63. SheetName = Replace(OneKey, "@", "")
  64. On Error Resume Next
  65. Set OpenSht = OpenWb.Worksheets(SheetName)
  66. If Err.Number = 9 Then
  67. MsgBox "打开工作簿不存在名为【" & SheetName & "】的工作簿!", vbInformation, "Information"
  68. OpenWb.Close False
  69. GoTo ErrorExit
  70. End If
  71. On Error GoTo 0
  72.  
  73. Ar = Dic(OneKey)
  74. RngAddress = Ar(0)
  75. Arr = Ar(1)
  76.  
  77. Set Rng = OpenSht.Range(RngAddress)
  78. Brr = Rng.Value
  79.  
  80. For i = LBound(Arr) To UBound(Arr)
  81. For j = LBound(Arr, 2) To UBound(Arr, 2)
  82. If IsNumeric(Brr(i, j)) Then
  83. '只有为数字时才可以相加
  84. Arr(i, j) = Arr(i, j) + Brr(i, j)
  85. Else
  86. MsgBox "工作簿:" & FilePath & vbCr & _
  87. "工作表:" & SheetName & vbCr & _
  88. "单元格:" & Rng.Cells(i, j).Address & "的数据不是数字,不能累加"
  89. GoTo ErrorExit
  90. End If
  91. Next j
  92. Next i
  93.  
  94. '更新求和数据
  95. Ar(1) = Arr
  96. Dic(OneKey) = Ar
  97. Next OneKey
  98. OpenWb.Close False
  99. Next FilePath
  100.  
  101. For Each OneKey In Dic.Keys
  102. SheetName = Replace(OneKey, "@", "")
  103. Ar = Dic(OneKey)
  104. RngAddress = Ar(0)
  105. Arr = Ar(1)
  106. Set Sht = Wb.Worksheets(SheetName)
  107. Set Rng = Sht.Range(RngAddress)
  108. Rng.Value = Arr
  109. Next OneKey
  110.  
  111. UsedTime = VBA.Timer - StartTime
  112. Debug.Print "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
  113. 'MsgBox "UsedTime :" & Format(UsedTime, "#0.0000 Seconds")
  114.  
  115. ErrorExit:
  116. Set Dic = Nothing
  117. Set Wb = Nothing
  118. Set Sht = Nothing
  119. Set Rng = Nothing
  120. Set OpenWb = Nothing
  121. Set OpenSht = Nothing
  122. Erase Arr
  123. Erase Brr
  124. Erase Ar
  125. AppSettings False
  126. End Sub
  127. Function FsoGetFiles(ByVal FolderPath As String, ByVal Pattern As String, Optional ComplementPattern As String = "") As String()
  128. Dim Arr() As String
  129. Dim FSO As Object
  130. Dim ThisFolder As Object
  131. Dim OneFile As Object
  132. ReDim Arr(1 To 1)
  133. Arr(1) = "None"
  134. Dim Index As Long
  135. Index = 0
  136. Set FSO = CreateObject("Scripting.FileSystemObject")
  137. On Error GoTo ErrorExit
  138. Set ThisFolder = FSO.getfolder(FolderPath)
  139. If Err.Number <> 0 Then Exit Function
  140. For Each OneFile In ThisFolder.Files
  141. If OneFile.Name Like Pattern Then
  142. If Len(ComplementPattern) > 0 Then
  143. If Not OneFile.Name Like ComplementPattern Then
  144. Index = Index + 1
  145. ReDim Preserve Arr(1 To Index)
  146. Arr(Index) = OneFile.Path
  147. End If
  148. Else
  149. Index = Index + 1
  150. ReDim Preserve Arr(1 To Index)
  151. Arr(Index) = OneFile.Path
  152. End If
  153. End If
  154. Next OneFile
  155. ErrorExit:
  156. FsoGetFiles = Arr
  157. Erase Arr
  158. Set FSO = Nothing
  159. Set ThisFolder = Nothing
  160. Set OneFile = Nothing
  161. End Function
  162. Sub AppSettings(Optional IsStart As Boolean = True)
  163. Application.ScreenUpdating = IIf(IsStart, False, True)
  164. Application.DisplayAlerts = IIf(IsStart, False, True)
  165. Application.Calculation = IIf(IsStart, xlCalculationManual, xlCalculationAutomatic)
  166. Application.StatusBar = IIf(IsStart, ">>>>>>>>Macro Is Running>>>>>>>>", False)
  167. End Sub

  

20180830xlVBA_合并计算的更多相关文章

  1. 20161227xlVBA多文件合并计算

    Sub NextSeven_CodeFrame() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAlerts = Fal ...

  2. Excel合并计算

    office版本为2013,数据来源:我要自学网,曾贤志老师 计算之前,光标定在空白位置,不要定在数据源. 将汇总的类型居于首列(不可以跨区域选择,可以把不需要汇总的移动到其他列). 要有删除原来数据 ...

  3. iOS tableView 数据处理,数据分类相同数据整合、合并计算总数总价

    // 数据下载得到数组数据 modelArray = [MZPriceModel mj_objectArrayWithKeyValuesArray:data[@"info"]]; ...

  4. Java的几个同步辅助类

    Java为我们提供了一些同步辅助类,利用这些辅助类我们可以在多线程编程中,灵活地把握线程的状态. CountDownLatch CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行 ...

  5. CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  6. java多线程--同步屏障CyclicBarrier的使用

    CyclicBarrier的概念理解: CyclicBarrier的字面上的意思是可循环的屏障,是java并发包java.util.concurrent 里的一个同步工具类,在我下载的JDK1.6的中 ...

  7. 【分布式】Zookeeper应用场景

    一.前言 在上一篇博客已经介绍了Zookeeper开源客户端的简单实用,本篇讲解Zookeeper的应用场景. 二.典型应用场景 Zookeeper是一个高可用的分布式数据管理和协调框架,并且能够很好 ...

  8. 【干货分享】前端面试知识点锦集02(CSS篇)——附答案

    二.CSS部分 1.解释一下CSS的盒子模型? 回答一:a.标准的css盒子模型:宽度=内容的宽度+边框的宽度+加上内边具的宽度b.网页设计中常听的属性名:内容(content).填充(padding ...

  9. 探索C#之微型MapReduce

    MapReduce近几年比较热的分布式计算编程模型,以C#为例简单介绍下MapReduce分布式计算. 阅读目录 背景 Map实现 Reduce实现 支持分布式 总结 背景 某平行世界程序猿小张接到B ...

随机推荐

  1. GDPR

    http://column.caijing.com.cn/20180523/4457753.shtml

  2. L2-001:dijskstra + 多条最短路径 + 记录中间路径

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 思路: dijkstra算出最短路 ...

  3. [HDU 1976] Software Version

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1976 #include<iostream> #include<cstdio> ...

  4. 《WEB渗透一.信息收集》

    一.操作系统 Windows服务器  和 Linux服务器. 1.大小写敏感 Windows大小写不敏感 , Linux大小写敏感 如    www.xxxx.com/index.php   和  w ...

  5. CSS-形变 动画 表格

    一.形变 /*1.形变参考点: 三轴交界点*/ transform-origin: x轴坐标 y轴坐标; ​ /*2.旋转 rotate deg*/ transform: rotate(720deg) ...

  6. 3、使用keepalived高可用LVS实例演示

    回顾: keepalived: vrrp协议的实现: 虚拟路由器: MASTER,BACKUP VI:Virtual Instance keepalived.conf GLOBAL VRRP LVS ...

  7. Linux命令之sudo

    在 Linux  系统中,由于 root 的权限过大,一般情况下都不使用它.只有在一些特殊情况下才采用登录root 执行管理任务,一般情况下临时使用 root 权限多采用 su 和 sudo 命令. ...

  8. 测试驱动android

    测试驱动android开发 在安卓模拟器或者真机上跑测试用例速度很慢.构建.部署.启动app,通常需要花费一分钟或者更久.这不是TDD(测试驱动开发)模式.Robolectric提供一种更好的方式. ...

  9. LCA 模板

    关于LCA: LCA 指树上两点的公共祖先. 如何 “暴力” 找两点的 LCA : 可以先 DFS 一遍求出每个点的 dep (深度).然后从深度大的点先往上跳,跳到与另一个点相同的深度,如果还没有到 ...

  10. 关于python的“重载”

    首先,关于python和java的区别: 1.Java有是通过方法名和方法列表来定义一个函数,python是通过方法名来定义一个函数(不允许方法名相同的函数存在) 2.java是通过定义多个相同方法名 ...