excel - 运行时错误“3706”:找不到提供程序 - Excel VBA“Provider=Microsoft.Jet.OLEDB.4.0”
问题描述
我看到这个错误并不新鲜,但我找不到解决方案。
我有一个 xls 文件,它使用一张像 db 这样的工作表,使用 ADODB 我得到了我需要的记录集。
代码非常简单,适用于我测试的每台 pc(5),使用 WIN7、WIN10、32 或 64 位。
但是我在PC上,是客户PC,给我这个错误:Run time error '3706': Provider cannot be found
,我检查了WIN版本,Office版本,它们和其他PC一样,WIN10 64位,MS Office 32Bit
为了解决这个问题,我需要做更多的控制?!?!感谢您的任何建议法布里齐奥
我的 xls 文件有 2 张,第 1 张名为“dati”,有两列(Anno,Pezzi),第 2 张名为“test”为空,这是代码:
Sub testConn()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strsql As String
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
Set rs = New ADODB.Recordset
#If Win64 Then
cn.Open "Provider=Microsoft.Jet.OLEDB.12.0; Data Source=" & ThisWorkbook.FullName & "; Extended Properties=""Excel 8.0;HDR=Yes;"";"
#Else
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & ThisWorkbook.FullName & "; Extended Properties=""Excel 8.0;HDR=Yes;"";"
#End If
strsql = "SELECT anno, Sum(Pezzi)as Tpz from [dati$] group by anno"
rs.Open strsql, cn, adOpenStatic, adLockReadOnly, adCmdUnspecified
rs.MoveFirst
With Worksheets("test")
.Cells.ClearContents
.Range("A1") = "Anno"
.Range("B1") = "T.Pz"
.Range("A2").CopyFromRecordset rs
.Activate
.Select
End With
End Sub
这些引用已添加到文件中:
Microsoft ActiveX Data Objects 6.1 Library
Microsoft ActiveX Data Recordset 2.8 Library
解决方案
这行得通,有一些你使用的小细节不适合。版本 12,驱动程序是 ace 而不是 jet,扩展属性也是 Excel 12.0
并且无需添加库。
Sub testConn()
Dim cn As Object
Dim rs As Object
Dim strsql As String
Dim connString
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
If Application.Version < 12 Then
connString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & ThisWorkbook.FullName & "; Extended Properties=""Excel 8.0;HDR=Yes;"";"
Else
connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & ThisWorkbook.FullName & "; Extended Properties=""Excel 12.0;HDR=Yes;"";"
End If
cn.Open connString
strsql = "SELECT anno, Sum(Pezzi) as Tpz from [dati$] group by anno"
Set rs = cn.Execute(strsql)
With Worksheets("test")
.Cells.ClearContents
.Range("A1") = "Anno"
.Range("B1") = "T.Pz"
.Range("A2").CopyFromRecordset rs
.Activate
.Select
End With
End Sub
推荐阅读
- php - PHP递归函数输出选择
- java - Apache pdfbox 将 tiff 转换为 PDF - 多线程还是顺序方法?
- azure - Microsoft 身份验证库 (msal.js) 多租户注册流程
- arrays - 过滤网格中的问题
- angularjs - 如何在html和angular js中捕获输入文本字段区域外的点击
- laravel-5.6 - 继承的多态关系
- c - 这段代码符合 MISRA C 标准吗?
- rabbitmq - RabbitMQ 管理查看队列或交换导致找不到对象
- mongodb - 如何退出 mongo-express BasicAuth
- javascript - 如何使用 JS 从 CSS 属性中获取默认值?