ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求高手帮忙写段代码,要求批量跨文件引用一个工作簿的个别特定单元格

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-19 17:03 | 显示全部楼层
本帖最后由 315297781 于 2013-12-19 17:13 编辑
zhaogang1960 发表于 2013-12-19 16:47
请上传出错的那几个工作簿分析一下

不好意思,看出来哪里错 了,那几个表里边多 了个 sheet,不好意思,不过为什么不能生成全年的呢,只有前边112天的,不好意思,麻烦你了,刚才又看出来是我的问题,从4-22开始后边的所有日报文件格式变成了.xls,之前的都是.xlsx,真的很抱歉,我还是改改文件的后缀再试试吧,应该没有问题了{:soso_e143:}

TA的精华主题

TA的得分主题

发表于 2013-12-19 17:23 | 显示全部楼层
315297781 发表于 2013-12-19 17:03
不好意思,看出来哪里错 了,那几个表里边多 了个 sheet,不好意思,不过为什么不能生成全年的呢,只有前 ...

再修改一下,循环工作簿中所有工作表,判断C6有数字时再退出循环:
  1. Sub Macro1()
  2.     Dim Fso As Object, sFileType$, i&, j&, m&, n&, na$, brr(), arrf$(), mf&, temp
  3.     Dim cnn As Object, rs As Object, SQL$, s$
  4.     Application.ScreenUpdating = False
  5.     Set Fso = CreateObject("Scripting.FileSystemObject")
  6.     sFileType = "*.xlsx"
  7.     Call GetFiles(ThisWorkbook.Path, sFileType, Fso, arrf, mf)
  8.     ReDim brr(1 To mf, 1 To 2)
  9.     For i = 1 To mf
  10.         Set cnn = CreateObject("adodb.connection")
  11.         cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='excel 12.0;hdr=no';Data Source=" & arrf(i)
  12.         Set rs = cnn.OpenSchema(20) 'adSchemaTables
  13.         Do Until rs.EOF
  14.             If rs.Fields("TABLE_TYPE") = "TABLE" Then
  15.                 s = Replace(rs("TABLE_NAME").Value, "'", "")
  16.                 If Right(s, 1) = "$" Then
  17.                     brr(i, 1) = Replace(Mid(arrf(i), InStrRev(arrf(i), "") + 1), "销售日报.xlsx", "")
  18.                     SQL = "select * from [" & s & "c6:c6]"
  19.                     temp = cnn.Execute(SQL)(0)
  20.                     If Not IsNull(temp) Then
  21.                         If IsNumeric(temp) Then
  22.                             brr(i, 2) = temp
  23.                             Exit Do
  24.                         End If
  25.                     End If
  26.                 End If
  27.             End If
  28.             rs.MoveNext
  29.         Loop
  30.     Next
  31.     [a1].CurrentRegion.Offset(1).ClearContents
  32.     [a2].Resize(i - 1, 2) = brr
  33.     Set Fso = Nothing
  34.     rs.Close
  35.     Set rs = Nothing
  36.     cnn.Close
  37.     Set cnn = Nothing
  38.     Application.ScreenUpdating = True
  39. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-12-19 17:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
下面附件中2013-1-1销售日报插入了2个空表,请测试:
求助.rar (112.86 KB, 下载次数: 16)

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-19 17:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 315297781 于 2013-12-19 17:40 编辑
zhaogang1960 发表于 2013-12-19 16:12
请测试:

请教版主,之前的两个问题我都搞明白了,一个是因为我部分表格有2个sheet,另一个是因为我的文件格式不统一,4月21号之前的日报格式是.xlsx,4月22号之后的日报格式是.xls,所以会出现错误,我现在把所有文件的日报格式都该成了.xls,然后把这段代码的里出现两次的.xlsx替换成了.xls,再运行就出现了错误了,麻烦您给指点一下,现在就差格式的问题了,之前是我做的不够规范,实在不好意思

点评

如果你不会修改,请上传所有有问题的工作簿,请说明要求  发表于 2013-12-19 17:41

TA的精华主题

TA的得分主题

发表于 2013-12-19 17:37 | 显示全部楼层
315297781 发表于 2013-12-19 17:35
请教版主,之前的两个问题我都搞明白了,一个是因为我部分表格有2个sheet,另一个是因为我的文件格式不统 ...

sFileType = "*.xlsx"改为
sFileType = "*.xls*"

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-19 17:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我按照您的替换了格式,再执行就出现“外部表格不是预期的格式”,这个怎么破?是不是因为该格式以后打开文件的这个提示

修改格式以后文件打开提示

修改格式以后文件打开提示

TA的精华主题

TA的得分主题

发表于 2013-12-19 17:57 | 显示全部楼层
315297781 发表于 2013-12-19 17:49
我按照您的替换了格式,再执行就出现“外部表格不是预期的格式”,这个怎么破?是不是因为该格式以后打开文件 ...

如果你的工作簿是从某些软面中导出来的,可能是老式工作簿
请上传出错工作簿分析一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-19 18:10 | 显示全部楼层
zhaogang1960 发表于 2013-12-19 17:57
如果你的工作簿是从某些软面中导出来的,可能是老式工作簿
请上传出错工作簿分析一下

报表都是手工作的,可能是不同的人用的excel版本不同

Desktop.rar

21.17 KB, 下载次数: 2

两个文件,1月的原来后缀是.xlsx,4月的后缀原来就是.xls

TA的精华主题

TA的得分主题

发表于 2013-12-19 18:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
315297781 发表于 2013-12-19 18:10
报表都是手工作的,可能是不同的人用的excel版本不同
  1. Sub Macro1()
  2.     Dim Fso As Object, sFileType$, i&, j&, m&, n&, na$, brr(), arrf$(), mf&, temp
  3.     Dim cnn As Object, rs As Object, SQL$, s$
  4.     Application.ScreenUpdating = False
  5.     Set Fso = CreateObject("Scripting.FileSystemObject")
  6.     sFileType = "*.xls*"
  7.     Call GetFiles(ThisWorkbook.Path, sFileType, Fso, arrf, mf)
  8.     ReDim brr(1 To mf, 1 To 2)
  9.     For i = 1 To mf
  10.         Set cnn = CreateObject("adodb.connection")
  11.         cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='excel 12.0;hdr=no';Data Source=" & arrf(i)
  12.         Set rs = cnn.OpenSchema(20) 'adSchemaTables
  13.         Do Until rs.EOF
  14.             If rs.Fields("TABLE_TYPE") = "TABLE" Then
  15.                 s = Replace(rs("TABLE_NAME").Value, "'", "")
  16.                 If Right(s, 1) = "$" Then
  17.                     brr(i, 1) = Replace(Replace(Mid(arrf(i), InStrRev(arrf(i), "") + 1), "销售日报.xls", ""), "销售日报.xlsx", "")
  18.                     SQL = "select * from [" & s & "c6:c6]"
  19.                     temp = cnn.Execute(SQL)(0)
  20.                     If Not IsNull(temp) Then
  21.                         If IsNumeric(temp) Then
  22.                             brr(i, 2) = temp
  23.                             Exit Do
  24.                         End If
  25.                     End If
  26.                 End If
  27.             End If
  28.             rs.MoveNext
  29.         Loop
  30.     Next
  31.     [a1].CurrentRegion.Offset(1).ClearContents
  32.     [a2].Resize(i - 1, 2) = brr
  33.     Set Fso = Nothing
  34.     rs.Close
  35.     Set rs = Nothing
  36.     cnn.Close
  37.     Set cnn = Nothing
  38.     Application.ScreenUpdating = True
  39. End Sub

  40. Private Sub GetFiles(ByVal sPath$, ByVal sFileType$, ByRef Fso As Object, ByRef arrf$(), ByRef mf&)
  41.     Dim Folder As Object
  42.     Dim SubFolder As Object
  43.     Dim File As Object
  44.     Set Folder = Fso.GetFolder(sPath)
  45.     If sPath <> ThisWorkbook.Path Then
  46.         For Each File In Folder.Files
  47.             If File.Name Like sFileType Then
  48.                 mf = mf + 1
  49.                 ReDim Preserve arrf(1 To mf)
  50.                 arrf(mf) = File
  51.             End If
  52.         Next
  53.     End If
  54.     If Folder.SubFolders.Count > 0 Then
  55.         For Each SubFolder In Folder.SubFolders
  56.             Call GetFiles(SubFolder.Path, sFileType, Fso, arrf, mf)
  57.         Next
  58.     End If
  59.     Set Folder = Nothing
  60.     Set File = Nothing
  61.     Set SubFolder = Nothing
  62. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-12-19 18:27 | 显示全部楼层
不是格式的问题,是把2007或以上文件后缀xlsx人为的修改成了xls,不用管它,按照2007文件对待即可:
Desktop.rar (46.88 KB, 下载次数: 13)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 14:56 , Processed in 0.035981 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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