ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 相同的SQL语句| 有时可以运行|有时报错|VBA或使用“现有连接”方法都出现过

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-10-28 15:38 | 显示全部楼层 |阅读模式
本帖最后由 autumnalRain 于 2015-10-29 10:33 编辑

我在EXCLE中直接用SQL语句,运行没有问题
  1. Select 序号,姓名,性别,null as 学历,年龄 from [部门A$] UNION ALL
  2. Select 序号,姓名,性别,null as 学历,年龄 from [部门B$] UNION ALL
  3. Select 序号,姓名,性别,学历,年龄 from [部门C$]
复制代码

但当我把它粘贴至VBA SQL中时却常报错,提示“未定义变量”……什么也没有修改……过了半小时重新打开——竟然可以运行!


  1. Sub INNERJOIN()
  2. Dim ADORST As Object
  3. Set AdoConn = CreateObject("ADODB.Connection")
  4. conn = "provider=microsoft.ACE.OLEDB.12.0;extended properties='Excel 12.0;hdr=yes';data source=" & ThisWorkbook.FullName
  5. Sql = "Select 序号,姓名,性别,null as 学历,年龄 from [部门A$] UNION ALL Select 序号,姓名,性别,null as 学历,年龄 from [部门B$] UNION ALL Select 序号,姓名,性别,学历,年龄 from [部门C$]"
  6. AdoConn.Open conn
  7. Set ADORST = AdoConn.Execute(Sql)
  8. For k = 0 To ADORST.Fields.Count - 1
  9.   Sheets("全部合并").Cells(14, k + 1) = ADORST.Fields(k).Name
  10. Next k
  11. Sheets("全部合并").Range("A15").CopyFromRecordset ADORST
  12. ADORST.Close
  13. AdoConn.Close
  14. Set ADORST = Nothing
  15. Set AdoConn = Nothing
  16. End Sub
复制代码
各位老师指导,这是什么原因?



EXCEL SQL.rar

11.34 KB, 下载次数: 17

VBA SQL.rar

13.86 KB, 下载次数: 19

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-28 15:48 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-10-29 10:35 编辑

可惜报错的界面忘了截图,总之感觉很蹊跷。
还有EXCEL中用“数据--现有连接”方法时也经常报错,但是重开机或是过段时间就正常了。
上面的代码,一直认为是“NULL AS 学历”出错,所以删了,运行成功。只是未达到结果;等把这句又加上去,运行成功,也是想要的结果。
这就出现这种情况:一旦运行成功,再换以前报错的SQL语句也没有问题。
相同的语句,不做任何修改,有时可以运行,有时却报错,实在想不通…………………………………………………………

TA的精华主题

TA的得分主题

发表于 2015-10-28 16:31 | 显示全部楼层
Sub INNERJOIN()
Application.ScreenUpdating = False
Set conn = CreateObject("adodb.connection")
conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1';data source=" & ActiveWorkbook.FullName

Range("A2:G50").ClearContents

Sql = "Select 序号,姓名,性别,学历,年龄 from " & _
      "(Select 序号,姓名,性别,'' as 学历,年龄 from [部门A$] UNION ALL " & _
      "Select 序号,姓名,性别,'',年龄 from [部门B$] UNION ALL " & _
      "Select 序号,姓名,性别,学历,年龄 from [部门C$])"

[A2].CopyFromRecordset conn.Execute(Sql)

conn.Close
Set conn = Nothing
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-28 16:42 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-10-28 17:04 编辑
lzqmsy 发表于 2015-10-28 16:31
Sub INNERJOIN()
Application.ScreenUpdating = False
Set conn = CreateObject("adodb.connection")

感谢老师。因为这里仅仅就是将三个表合并在一起,所以我没有用子查询。疑问还是:我的写法为什么刚开始运行不了,后来却可以运行了呢?我根本没有改动过的!请您指导!

TA的精华主题

TA的得分主题

发表于 2015-10-28 17:21 | 显示全部楼层
Sub INNERJOIN()
Application.ScreenUpdating = False
Set conn = CreateObject("adodb.connection")
Set rst = CreateObject("Adodb.Recordset")
conn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1';data source=" & ActiveWorkbook.FullName

Range("A2:G50").ClearContents

Sql = "Select 序号,姓名,性别,学历,年龄 from " & _
      "(Select 序号,姓名,性别,'' as 学历,年龄 from [部门A$] UNION ALL " & _
      "Select 序号,姓名,性别,'',年龄 from [部门B$] UNION ALL " & _
      "Select 序号,姓名,性别,学历,年龄 from [部门C$])"
rst.Open Sql, conn, 1, 1
[A2].CopyFromRecordset rst

For i = 0 To rst.Fields.Count - 1
    Cells(1, 1 + i) = rst.Fields.Item(i).Name
Next

rst.Close: conn.Close
Set rst = Nothing: Set conn = Nothing
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2015-10-28 17:22 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-28 17:29 | 显示全部楼层

除了有时确实是代码写错了之外……

本帖最后由 autumnalRain 于 2015-10-29 12:31 编辑

关于EXCEL中用现有连接方法运行SQL语句,显示“数据库引擎无法打开或无法写入数据他已经被其他用户以独占方式打开,或者您没有查看或写入其数据的权限”这种情况就是数据库被打开了。它目前是锁定状态,你不能对数据库做任何操作。
下面给出了办法,但不一定完全有效。================================================================================================================================
第一:在SQL中是否增加了路径试试?如果可以正确就保留路径。
第二:在“我的文档”-----“我的数据源”中会出现对应的数据库文件,可以把原来的全部删掉,再做一次会产生全新的对应的数据库文件在那个地方。
第三:请把做好的表格保存好后再打开,若刷新时再出现原来的错误信息,就找到对应的数据库文件,选中后进行多次刷新,然后再去刷新原表(不需要关闭原表)。
第四:可重复以上操作。。。。。。
===============================================================================
我按照这些办法还是无法消除错误时,惯常的做法就是:先不管它,等过段时间再重新打开。就象我的提问中VBA中用SQL的情况一样,也是先不管它,等过段时间再运行代码,就不会报错。


个中原因,实在不明白啊……




1.png
2.png
3.png
4.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-29 10:21 | 显示全部楼层
有段时间我都有点想放弃使用SQL-现有链接方法,因为不断地报错,忙的时候,实在让人崩溃啊。
我现在都使用MICROSOFT QUERY连接,无非多操作两步。但至现在还没有报过错!
也算是找到了一种替代方法

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-29 10:22 | 显示全部楼层
转字专家的例子
http://club.excelhome.net/thread-1061487-1-1.html
MQ实现双表动态查询.gif

MQ实现双表动态查询.rar

12.89 KB, 下载次数: 16

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-29 10:47 | 显示全部楼层
lzqmsy 发表于 2015-10-28 17:21
Sub INNERJOIN()
Application.ScreenUpdating = False
Set conn = CreateObject("adodb.connection")

感谢老师!现在的问题是我的SQL语句有时可以运行,有时报错。说明语句没有问题。但为什么会出现这种情况呢?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-5 03:24 , Processed in 0.038654 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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