ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-10-18 15:49 | 显示全部楼层 |阅读模式
本帖最后由 betar 于 2016-10-21 10:11 编辑

如题,如何使用Excel VBA SQL 连接带有密码的Excel表格?假设路径指向的工作表带有密码,为123如附件所示。如何用SQL进行连接?求大神指导。
  1. cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=Excel 12.0;Data Source=" & Path
  2.     SQL = "select [Loan Acccout No#] from [Sheet1$A1:DH1048576] "
复制代码
test.zip (8.15 KB, 下载次数: 41)

感谢大神回复,现在确定的是无法直接用SQL对带有密码的工作簿进行连接。但是还有一种思路是先用workbooks.open把目标工作簿打开,再对已经打开的工作簿进行连接。可惜个人水平有限,代码会报错,还请各路大神不吝赐教。

  1. Sub test()
  2.     Dim File As Workbook
  3.     Dim Index As Worksheet
  4.     Dim cnn
  5.     Dim rst
  6.     Dim SQL$
  7.     Dim Path, Text1, SheetName As String
  8.    
  9.     Path = ThisWorkbook.Path & ""
  10.     Text1 = "test.xlsx"
  11.     SheetName = "Sheet1"
  12.    
  13.     Set ExcelApp = CreateObject("Excel.Application")
  14.     Set File = ExcelApp.Workbooks.Open(Filename:=Path & Text1, Password:="123")
  15.     Set Index = File.Worksheets(SheetName)
  16.    
  17.     Sheets("Sheet1").Range("a2:e65536").ClearContents
  18.     Sheets("Sheet1").Select
  19.    
  20.     Set cnn = CreateObject("adodb.connection")  'Create DB Connection
  21.     Set rst = CreateObject("adodb.recordset")
  22.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=Excel 12.0;Data Source=" & Path & Text1
  23.     SQL = "select [Loan No#] from [" & SheetName & "$A1:DH1048576]"
  24.     Set rst = cnn.Execute(SQL)
  25.     Worksheets("Sheet1").Range("a" & Range("A65536").End(xlUp).Row + 1).CopyFromRecordset rst
  26.    
  27.     rst.Close
  28.     cnn.Close     'Close SQL Connection
  29.     Set rst = Nothing
  30.     Set cnn = Nothing    'Clean SQL from RAM
  31.    
  32.     File.Close True
  33.     Set ExcelApp = Nothing
  34.     Set File = Nothing
  35.       
  36. End Sub
复制代码
问题已经由大神microyip解决,详见楼下代码。目前该方法适用于行数小于等于65536的xls, xlsx工作表,对于超出65536行的表格,超过部分不会被连接。

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-18 17:31 | 显示全部楼层
不行,这种情况下,SQL不能连接,用getobject都不行,只能用workbooks.open打开

TA的精华主题

TA的得分主题

发表于 2016-10-18 22:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-10-18 23:23 | 显示全部楼层
EXCEL 2010 SQL 完全应用里提到,对于设置有密码保护的Excel工作簿,ADO无法打开,只有当工作簿已打开时,ADO才能正常连接。

TA的精华主题

TA的得分主题

发表于 2016-10-19 01:59 | 显示全部楼层
下面网站讲述:

https://www.connectionstrings.com/excel/

If the Excel workbook is protected by a password, you cannot open it for data access, even by supplying the correct password with your connection string. If you try, you receive the following error message: "Could not decrypt file."


如果您的工作簿是由密码保护的,则无法打开数据访问,即使通过提供正确的连接字符串的密码。如果您尝试,您收到以下错误信息:“无法解密文件。”

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-19 14:16 | 显示全部楼层
jokklx 发表于 2016-10-18 17:31
不行,这种情况下,SQL不能连接,用getobject都不行,只能用workbooks.open打开

感谢回复,那么如果excel表格已经用workbooks.open打开了,还可以用SQL进行连接么?

TA的精华主题

TA的得分主题

发表于 2016-10-19 14:45 | 显示全部楼层
betar 发表于 2016-10-19 14:16
感谢回复,那么如果excel表格已经用workbooks.open打开了,还可以用SQL进行连接么?

可以用SQL语句对已经打开的工作簿进行访问的

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-19 14:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 betar 于 2016-10-19 15:01 编辑
microyip 发表于 2016-10-19 14:45
可以用SQL语句对已经打开的工作簿进行访问的

感谢大神,请问如何连接已经打开的工作簿?假设工作簿名字为“test.xlsx”,工作表名字为“abc”?

TA的精华主题

TA的得分主题

发表于 2016-10-19 15:18 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-19 16:10 | 显示全部楼层
本帖最后由 betar 于 2016-10-19 16:23 编辑
microyip 发表于 2016-10-19 15:18
一样是使用原来的语句啊

因为我代码所在的工作簿与目标工作簿不是同一个,所以我在用workbook.open打开目标工作簿后,再用与之前相同的代码进行连接,会提示找不到[Sheet1$A1:DH1048576]
  1. Sub test()
  2.     Dim File As Workbook
  3.     Dim Index As Worksheet
  4.     Dim cnn
  5.     Dim rst
  6.     Dim SQL$
  7.     Dim Path, Text1, SheetName As String
  8.    
  9.     Path = ThisWorkbook.Path & ""
  10.     Text1 = "test.xlsx"
  11.     SheetName = "Sheet1"
  12.    
  13.     Set ExcelApp = CreateObject("Excel.Application")
  14.     Set File = ExcelApp.Workbooks.Open(Filename:=Path & Text1, Password:="123")
  15.     Set Index = File.Worksheets(SheetName)
  16.    
  17.     Sheets("Sheet1").Range("a2:e65536").ClearContents
  18.     Sheets("Sheet1").Select
  19.    
  20.     Set cnn = CreateObject("adodb.connection")  'Create DB Connection
  21.     Set rst = CreateObject("adodb.recordset")
  22.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=Excel 12.0;Data Source=" & Path & Text1
  23.     SQL = "select [Loan No#] from [" & SheetName & "$A1:DH1048576]"
  24.     Set rst = cnn.Execute(SQL)
  25.     Worksheets("Sheet1").Range("a" & Range("A65536").End(xlUp).Row + 1).CopyFromRecordset rst
  26.    
  27.     rst.Close
  28.     cnn.Close     'Close SQL Connection
  29.     Set rst = Nothing
  30.     Set cnn = Nothing    'Clean SQL from RAM
  31.    
  32.     File.Close True
  33.     Set ExcelApp = Nothing
  34.     Set File = Nothing
  35.       
  36. End Sub
复制代码



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 18:41 , Processed in 0.043868 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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