ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA SQL 跨工作簿查询时的首行数据丢失

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-3-14 08:20 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 rhzwan123 于 2019-3-14 08:22 编辑

现有三个excel工作表,分别为,
1、当前工作簿为    D:\N.xls
2、要查询文件的1  D:\1.xls
2、要查询文件的2  D:\2.xls
【已知】
当前excel版本为2010,而且
1.xls的sheet1的[A1:C3]内容为
|张三|男|36|
|李四|男|35|
|赵一|女|25|
2.xls的sheet1的[A1:C3]内容为
|胡六|男|37|
|季七|男|45|
|丁十|女|35|

【要求】利用SQL方法,把1.xls的sheet1的[a1:c3]、2.xls的sheet1的[a1:c3],通过Union查询,存放到当前工作簿中,(vba代码在D:\N.xls中)
【代码如下】
  1. Option Explicit
  2. Sub Test()
  3. Dim Cnn As Object, Rst As Object
  4. Dim strCnn$, strSQL$, FilePath1$, FilePath2$
  5. FilePath1$ = ThisWorkbook.Path & "\1.xls"
  6. FilePath2$ = ThisWorkbook.Path & "\2.xls"
  7. Set Cnn = CreateObject("adodb.connection")
  8. Set Rst = CreateObject("adodb.recordset")
  9. strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=NO;IMEX=1';Data source=" & ThisWorkbook.FullName
  10. Cnn.Open strCnn

  11. strSQL = "select * from [" & FilePath1 & "].[sheet1$A1:c3] Union All select * from [" & FilePath2 & "].[sheet1$A1:c3]"
  12. Set Rst = Cnn.Execute(strSQL)
  13. With Sheets("sheet1")
  14.     .Range("a1").CurrentRegion.ClearContents
  15.     .Range("A1").CopyFromRecordset Rst
  16. End With
  17. Rst.Close
  18. Cnn.Close
  19. Set Rst = Nothing
  20. Set Cnn = Nothing
  21. End Sub
复制代码




【结果如下】
李四
35
赵一
25
季七
45
丁十
35


【问题】
跨工作簿查询时,如果被查询的工作表无表头,即使设置HDR=NO,第一行数据仍然会被视为表头而忽略。这个问题出在哪里,怎么解决?

【扩展问题】
如果把
strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=NO;IMEX=1';Data source=" & ThisWorkbook.FullName
中的数据源改为data source=Filepath1

结果也是一样。



N.rar

16.73 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2019-3-15 21:28 | 显示全部楼层
select * from....
*表示表所有字段,也就是第一行的名称。相当于select 张三,男,36 from....
虽然你认为第一行是记录,但是计算机不知道。

TA的精华主题

TA的得分主题

发表于 2019-3-17 11:34 | 显示全部楼层
strSQL = "select * from [" & FilePath1 & "].[sheet1$A1:c3] Union All select * from [" & FilePath2 & "].[sheet1$A1:c3]" 这句改一下

strSQL = "select * from [" & FilePath1 & ";extended properties='Excel 12.0;HDR=no;IMEX=1'].[sheet1$A1:c3] Union All select * from [" & FilePath2 & ";extended properties='Excel 12.0;HDR=no;IMEX=1'].[sheet1$A1:c3]"
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 11:42 , Processed in 0.030444 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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