ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] VBA SQL连接带有密码的excel表

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-19 16:40 | 显示全部楼层
本帖最后由 betar 于 2016-10-19 16:41 编辑
jokklx 发表于 2016-10-18 17:31
不行,这种情况下,SQL不能连接,用getobject都不行,只能用workbooks.open打开

版主提供的那个链接里面有个work around, 还没尝试过,似乎应该也不可以使用?

  1. 'Open the Excel workbook to prompt for the password
  2. Dim xl As Object
  3. Set xl = GetObject(CurrentProject.Path & "" & "MASTER JAN 2009.xls")

  4. 'Now open the workbook to read/write/whatever
  5. Dim cnn1 As New ADODB.Connection
  6. Dim rst1 As ADODB.Recordset
  7. Dim strExcelName As String = "MASTER JAN 2009.xls"
  8. Dim strWkBkName As String = "[MASTER 2008$]"
  9. cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
  10. "Data Source=" & CurrentProject.Path & "" & strExcelName & ";" _
  11. "Extended Properties=""Excel 8.0;"";"
  12. Set rst1 = New ADODB.Recordset
  13. rst1.Open strWkBkName, cnn1, , , adCmdTable
  14. Do Until rst1.EOF
  15.     'process your data here
  16.     rst1.MoveNext
  17. Loop
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 10:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
有大神帮忙看看吗?代码应该怎么改才可以不报错?

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 11:37 | 显示全部楼层
microyip 发表于 2016-10-19 15:18
一样是使用原来的语句啊

烦请大神详细说明一下如何连接已经打开的工作簿,我这边的用workbooks.open打开工作簿以后,按照正常的SQL操作会出现找不到目标的错误[Sheet1$A1:DH1048576]。万分感谢!
Capture.JPG

TA的精华主题

TA的得分主题

发表于 2016-10-20 13:42 | 显示全部楼层
  1. Sub test()
  2.     Dim File As Workbook
  3.     Dim cnn
  4.     Dim SQL$
  5.     Dim Path, Text1, SheetName As String
  6.    
  7.    
  8.     Path = ThisWorkbook.Path & ""
  9.     Text1 = "test.xlsx"
  10.     SheetName = "Sheet1"
  11.    
  12.    
  13.     With Sheets("Sheet1")
  14.         .[A:E].ClearContents
  15.    
  16.         Set File = Workbooks.Open(Filename:=Path & Text1, Password:="123")
  17.         
  18.         Set cnn = CreateObject("adodb.connection")  'Create DB Connection
  19.         cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=Excel 12.0;Data Source=" & Path & Text1
  20.         
  21.         SQL = "select [Loan No#] from [" & SheetName & "$A:DH]"
  22.         .[A65536].End(xlUp).Offset(1, 0).CopyFromRecordset cnn.Execute(SQL)
  23.    
  24.         cnn.Close     'Close SQL Connection
  25.         Set cnn = Nothing    'Clean SQL from RAM
  26.    
  27.         File.Close True
  28.     End With
  29. End Sub
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 17:04 | 显示全部楼层
本帖最后由 betar 于 2016-10-20 17:19 编辑

有个小问题,这个$A:DH似乎不能支持超过65536行的数据,超过的部分不会被SQL连接捕捉到,也就不会输出。如果强制添加超过65536的行数,就会报错。比如如果写$A1:DH66666,就会提示找不到Sheet1$A1:DH66666.

TA的精华主题

TA的得分主题

发表于 2016-10-20 17:38 | 显示全部楼层
betar 发表于 2016-10-20 17:04
有个小问题,这个$A:DH似乎不能支持超过65536行的数据,超过的部分不会被SQL连接捕捉到,也就不会输出。 ...

Excel使用SQL语言是有行数限制的

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 17:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
microyip 发表于 2016-10-20 17:38
Excel使用SQL语言是有行数限制的

其实,如果目标文件没有密码,直接用Microsoft.ACE.OLEDB.12.0进行SQL连接是可以支持xlsx最大行数1048576的,所以不太明白为什么使用了workbooks.open打开文件后就不能支持了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 18:03 | 显示全部楼层
betar 发表于 2016-10-20 17:50
其实,如果目标文件没有密码,直接用Microsoft.ACE.OLEDB.12.0进行SQL连接是可以支持xlsx最大行数1048576 ...

在另一个贴子里看到了版主的解答,的确有这样的限制。感谢!


原帖由 minjiwei 于 2011-6-7 18:17 发表

很不幸,我用的是
cn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.FullName
这个是怎么回事啊?

自连接不能突破65536行限制
把要连接的工作表另存为一个新的xlsx文件后再连接就可以了,如:
cn.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=Yes';Data Source=" & ThisWorkbook.Path & "\123.xlsx"

补充内容 (2015-2-9 17:06):
2007后ADO存在一个Bug,连接工作簿处于打开状态,工作表如果指定区域,则只能查询65536行以内的数据,解决办法:
一、去掉区域,[明细$a1:p]改为[明细$]
或者
二、继续坚持指定区域([明细$a1:p]),放弃自连接,把数

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 19:02 | 显示全部楼层
想到一个笨办法,可以先用workbooks.open把目标文件打开,另存为一个无密码的版本,再直接用SQL连接进行后续操作。
  1. ActiveWorkbook.SaveAs Filename:=FilePath, FileFormat:=xlWorkbookDefault, CreateBackup:=False, Password:=""
复制代码

TA的精华主题

TA的得分主题

发表于 2016-10-20 19:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
betar 发表于 2016-10-20 17:50
其实,如果目标文件没有密码,直接用Microsoft.ACE.OLEDB.12.0进行SQL连接是可以支持xlsx最大行数1048576 ...

在打开状态下,只支持65536行
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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