ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何在同一文件夹跨工作表取数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-2-28 18:41 | 显示全部楼层 |阅读模式
q压缩文件夹中有四家公司。现在想用VBA实现公司数据汇总,汇总表里的数据,请高手帮忙! q.zip (27.98 KB, 下载次数: 31)


TA的精华主题

TA的得分主题

发表于 2013-2-28 19:03 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-2-28 19:04 编辑

前提:各个工作簿数据区完全相同,相同单元格累加:
  1. Sub Macro1()
  2.     Dim MyPath$, MyName$, arr, brr(1 To 29, 1 To 6), i&, j&
  3.     Application.ScreenUpdating = False
  4.     MyPath = ThisWorkbook.Path & ""
  5.     MyName = Dir(MyPath & "*.xls")
  6.     Do While MyName <> ""
  7.         If MyName <> ThisWorkbook.Name Then
  8.             With GetObject(MyPath & MyName)
  9.                 arr = .Sheets(1).Range("C6:H34")
  10.                 .Close False
  11.             End With
  12.             For i = 1 To 29
  13.                 For j = 1 To 6
  14.                     brr(i, j) = brr(i, j) + arr(i, j)
  15.                 Next
  16.             Next
  17.         End If
  18.         MyName = Dir
  19.     Loop
  20.     Range("C6:H34") = brr
  21.     Application.ScreenUpdating = True
  22. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-2-28 19:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请看附件
q.rar (31.1 KB, 下载次数: 68)

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-28 19:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
为什么汇总的数据跟我用公式汇总的数据不一样。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-28 19:19 | 显示全部楼层
外单位拔入(+)
拔出(-)  是公司的累加。。这个数据不一样。。

TA的精华主题

TA的得分主题

发表于 2013-2-28 19:30 | 显示全部楼层

  1. '*********************************
  2. '*******  北极狐工作室出品  ******
  3. '*******  QQ:14885553      ******
  4. '*********************************

  5. Sub Opiona()

  6. 'On Error Resume Next    '// 发生错误,自动执行下一句,就是忽略错误
  7. Application.ScreenUpdating = False '//关闭屏幕刷新
  8. Application.DisplayAlerts = False '//关闭系统提示

  9. t = Timer   '//开始时间

  10.     Str1 = "企管01表"
  11.     Set SH1 = Sheets(Str1)
  12.     Set SH2 = Sheets("临时表")
  13.     SH1.Range("C6:Z34").ClearContents
  14.     SH2.Range("A4:Z65536").ClearContents
  15.     arr = FileAllArr(ThisWorkbook.Path, "*.xls", ThisWorkbook.Name)
  16.     For I = 0 To UBound(arr)
  17.         StrCoon = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=NO';Data Source=" & arr(I)   '//OFFICE2003
  18.         StrSQL = "SELECT * FROM [" & Str1 & "$A6:Q65536] WHERE LEN(F1)>0"
  19.         If I = 0 Then R = 4 Else R = SH2.Range("A65536").End(3).Row + 1
  20.         SH2.Range("A" & R).CopyFromRecordset GET_SQLRS(StrSQL, StrCoon)
  21.     Next
  22.     StrCoon = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=NO';Data Source=" & ThisWorkbook.FullName
  23.     StrSQL = "SELECT B.BT2,B.BT3,B.BT4,B.BT5,B.BT6,B.BT7 FROM"
  24.     StrSQL = StrSQL & " (SELECT F1 AS BT1 FROM [" & SH1.Name & "$A6:A65536]) AS A LEFT JOIN"
  25.     StrSQL = StrSQL & " (SELECT F1 AS BT1,SUM(F3) AS BT2,SUM(F9)+SUM(F11)+SUM(F13) AS BT3,SUM(F10)+SUM(F12)+SUM(F14) AS BT4,SUM(F15) AS BT5,SUM(F16) AS BT6,SUM(F17) AS BT7 FROM [" & SH2.Name & "$A4:Q65536] WHERE LEN(F1)>0 GROUP BY F1) AS B"
  26.     StrSQL = StrSQL & " ON TRIM(A.BT1)= TRIM(B.BT1)"
  27.     SH1.Range("C6").CopyFromRecordset GET_SQLRS(StrSQL, StrCoon)
  28. Application.ScreenUpdating = True '//恢复屏幕刷新
  29. Application.DisplayAlerts = True '//恢复系统提示
  30. MsgBox "一共用时:" & Format(Timer - t, "#0.0000") & " 秒", , "北极狐提示!!"  '//提示所用时间
  31. End Sub

  32. '*****************************************************************************************
  33. '函数名:    GET_SQLRS
  34. '函数功能:  获得指定SQL的查询结果,修改CN连接字符串,可以连接各种数据库
  35. '返回值:    返回一个recordset数据集
  36. '参数1:     StrSQL   字符类型   SQL查询语句
  37. '使用方法: Set RS = CreateObject("adodb.recordset")  '//先引用ADO:Microsoft ActiveX Data Objects 2.5 或更高版本
  38.             'Set RS = GET_SQLRS(StrSQL,StrCoon)
  39.             'Sh1.Range("A2").CopyFromRecordset RS
  40. '*****************************************************************************************
  41. Public Function GET_SQLRS(ByVal StrSQL As String, ByVal Str_coon As String) As ADODB.Recordset
  42. On Error Resume Next    ' 改变错误处理的方式。
  43. Dim CN, RS
  44.     Err.Clear
  45.     Set CN = CreateObject("Adodb.Connection") '//新建一个ADO连接
  46.     Set RS = CreateObject("adodb.recordset")
  47.     CN.Open Str_coon
  48.     RS.Open StrSQL, CN, 1, 3
  49.     Set GET_SQLRS = RS
  50. GET_SQLRS_Exit:
  51.     Exit Function
  52. GET_SQLRS_Error:
  53.     MsgBox Err.Description
  54.     Resume GET_SQLRS_Exit
  55. End Function

  56. '****************************************************************
  57. '功能:    查找指定文件夹含子文件夹内所有文件名(含路径)
  58. '函数名:  FileAllArr
  59. '参数1:   Filename    需查找的文件夹名 不含最后的""
  60. '参数2:   FileFilter  需要过滤的文件名,可省略,默认为:[*.*]
  61. '参数3:   Liwai       剔除例外的文件名,可省略,默认为:空,一般为:ThisWorkbook.Name
  62. '返回值:  一个字符型的数组
  63. '使用方法:arr = FileAllArr(ThisWorkbook.Path, "*.xls", ThisWorkbook.Name)

  64. Public Function FileAllArr(ByVal Filename As String, Optional ByVal FileFilter As String = "*.*", Optional ByVal Liwai As String = "") As String()
  65.     Set Dic = CreateObject("Scripting.Dictionary")    '创建一个字典对象
  66.     Set Did = CreateObject("Scripting.Dictionary")
  67.     Dic.Add (Filename & ""), ""
  68.     I = 0
  69.     Do While I < Dic.Count
  70.         Ke = Dic.keys   '开始遍历字典
  71.         MyName = Dir(Ke(I), vbDirectory)    '查找目录
  72.         Do While MyName <> ""
  73.             If MyName <> "." And MyName <> ".." Then
  74.                 If (GetAttr(Ke(I) & MyName) And vbDirectory) = vbDirectory Then    '如果是次级目录
  75.                     Dic.Add (Ke(I) & MyName & ""), ""  '就往字典中添加这个次级目录名作为一个条目
  76.                 End If
  77.             End If
  78.             MyName = Dir    '继续遍历寻找
  79.         Loop
  80.         I = I + 1
  81.     Loop
  82.   
  83. I = 0
  84. Dim arrx() As String
  85.     For Each Ke In Dic.keys '以查找总表所在文件夹下所有excel文件为例
  86.         MyFileName = Dir(Ke & FileFilter) '过滤器:EXCEL2003为:*.xls,excel2007为:*.xlsx
  87.         Do While MyFileName <> ""
  88.            If MyFileName <> Liwai Then '排除例外文件
  89.               ReDim Preserve arrx(I)
  90.               arrx(I) = Ke & MyFileName
  91.               I = I + 1
  92.            End If
  93.             MyFileName = Dir
  94.         Loop
  95.     Next
  96.     FileAllArr = arrx
  97. End Function
  98. '****************************************************************


复制代码

TA的精华主题

TA的得分主题

发表于 2013-2-28 19:32 | 显示全部楼层
q.rar (38.88 KB, 下载次数: 42)
A工作簿少有修改,要注意哟!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-2-28 19:41 | 显示全部楼层
cuang2002 发表于 2013-2-28 19:19
外单位拔入(+)
拔出(-)  是公司的累加。。这个数据不一样。。

我不认识公式,全部完成了累加,请说明怎么计算

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-28 19:54 | 显示全部楼层
A公司(外单位拔入(+)拔出(-) +    外单位拔入(+)拔出(-) +     外单位拔入(+)拔出(-))+公司(外单位拔入(+)拔出(-) +    外单位拔入(+)拔出(-) +     外单位拔入(+)拔出(-))+公司(外单位拔入(+)拔出(-) +    外单位拔入(+)拔出(-) +     外单位拔入(+)拔出(-))我是想三家公司三个部门中的拨入拨出数相加。。。帐面拨入拨出数也相加。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-28 19:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-8 03:00 , Processed in 0.029307 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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