微软.ACE.OLEDB.12.0;可能的连接字符串格式错误导致“找不到可安装的 ISAM 文件”错误?

Posted

技术标签:

【中文标题】微软.ACE.OLEDB.12.0;可能的连接字符串格式错误导致“找不到可安装的 ISAM 文件”错误?【英文标题】:Microsoft.ACE.OLEDB.12.0; possible connection string formatting error causes "Could not find installable ISAM file" error? 【发布时间】:2020-09-08 18:11:06 【问题描述】:

我遇到问题的宏是在 Word VBA 编辑器中编写的,并且是从 Word 中提取的。

它的目标是通过 Microsoft.ACE.OLEDB.12.0 链接到 Excel .xlsm 文件(被视为客户数据库);连接,甚至在不打开文件的情况下,将整个工作表从该文件(工作表名称 =“数据”)读取到一个动态数组中,稍后将对其进行搜索。

我编写了一些代码来执行此操作,但它在连接字符串上崩溃,可能是因为我不知道如何格式化它 - 我的意思是这些引号,我只是不明白它们是如何放置的以及为什么。

最重要的是代码是在 Word VBA 编辑器中编写的,并且是从 Word .docm 文件中提取的。

Option Explicit

Private Sub UseADOSelect()

Dim connection As New ADODB.connection
Dim recSet As New ADODB.Recordset    'All the results of the query are placed in a record set;

Dim exclApp As Excel.Application
Dim exclWorkbk As Excel.Workbook
Dim mySheet As Excel.Worksheet
Dim wordDoc As Word.Document
Dim cntCntrl As ContentControl
Dim strPESELfromWord As String
Dim strQuery As String
Dim intWiersz As Integer
Dim intRemainder As Integer
Dim intRow As Integer
Dim arraySize As Integer
Dim strSexDigit As String
Dim strArray() As String
Dim i As Integer


'Set exclApp = GetObject(, "Excel.Application")   'When no Excel Workbook is open an error 429 will be returned.
'Debug.Print exclApp

Set wordDoc = Word.ActiveDocument
Debug.Print wordDoc

'Set mySheet = exclApp.ActiveWorkbook.ActiveSheet
'Debug.Print mySheet.Name

'Set mySheet = exclApp.ActiveWorkbook.Sheets("sample")
'Debug.Print mySheet.Name

strPESELfromWord = Trim(Selection.Text)
Debug.Print strPESELfromWord
Word.Application.Visible = True

strSexDigit = Mid(strPESELfromWord, 10, 1)      'Extract 10th digit from PESEL number
Debug.Print strSexDigit
intRemainder = strSexDigit Mod 2
Debug.Print intRemainder

connection.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm"; & _
                Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1;"";"            'something is wrong in the syntax
                                


'strQuery = "SELECT * From [Simple$]"   '[Simple$] is the table name; in this case it's the sheet name;
strQuery = "SELECT * From [data$]"     '[data$]   is the table name; in this case it's the sheet name;
recSet.Open strQuery, connection
Debug.Print " RecordCount = " & recSet.RecordCount
arraySize = recSet.RecordCount

ReDim strArray(1 To arraySize)
For i = 1 To arraySize
   strArray(i) = recSet(i)
Next i


intRow = 2

为什么是private sub??我可以让它只是子吗?这不是我写的。我从here下载了这段代码。

我从here得到了连接字符串。

我也读过this,但他们讨论了不同的代码结构,我无法将答案转移到我自己的示例中。

Set Conn = New ADODB.Connection
With Conn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & strWorkbook & "; Extended Properties=""Excel 12.0 Macro; HDR=YES"""
.Open
End With

【问题讨论】:

顺便说一句,我忘记了您问题的“私人子”部分。它不必是私人潜艇。 【参考方案1】:

你说得对,这里的语法有问题:

connection.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm"; & _
            
                Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1;"";"        

因为字符串的格式不正确。至少,您需要将其更改为:

connection.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm;" & _
            
                "Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1;"";"        

(为了打破它,如果你希望你的连接字符串看起来像这样:

Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm;Extended Properties="Excel 12.0 Macro;HDR=YES;IMEX=1;";

那么在 VBA 中你需要它看起来像这样

Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm;Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1;"";

那么,如果你像这样把它分成两部分

Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm;

扩展属性=""Excel 12.0 宏;HDR=YES;IMEX=1;"";

你可以想象你的作业应该是这样的:

connection.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm;" & "Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1;"";"

在VBA中,当你想将一条语句分成两行时,你在第一行的末尾放了一个空格,后跟“_”,这意味着你最终得到了:

connection.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source = X:\Roesler\Excel\FW 1\customer's_dummy_data.xlsm;" & _
"Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1;"";"

(我不确定在这种情况下您是否需要这些扩展属性)。

除此之外,你的

strQuery = "SELECT * From [data$]"

对于名为“数据”的工作表是正确的

recSet.Open strQuery, connection

没问题。

但您不能假设该查询实际上会返回工作表中的记录数。您在 recSet.RecordCount 中看到的部分取决于您在打开 RecordSet 时指定的“光标”类型。例如当我在这里测试时,recSet.RecordCount 是-1。为了查看任何数据,我不得不考虑测试 recSet.EOF 并使用 recSet.MoveNext 移动到数据集中的第一条记录。

FWIW 我希望这里的其他人有一个通过 ADO 访问 Excel 的可靠模式,您可以将其插入到您的代码中。我不。但是在使用 ADO 时几乎可以肯定需要处理的另一件事是,当您尝试检索字段值时,您始终必须考虑它们可能为“null”的可能性,并且尝试使用 null 值可能会抛出一个错误。

回复。 “私人子”的东西,不是它不一定是私人子。

【讨论】:

【参考方案2】:

最终找到导致我的系统崩溃的原因的答案.. 当它是在字符串中的字符串周围放置引号的问题时。这在其他任何地方都没有清楚地显示。

我已经为此工作了好几个小时,但我得到的只是 Msgbox Msgbox 以防万一图像无法通过这是错误状态。 “错误 Microsoft Access 数据库引擎 --> 找不到可安装的 ISAM。”

对于简单的语法错误,这是非常烦人且令人费解的不合逻辑消息。

缺少 " "" ;"";"大部分是 ;"";" 在结尾。

即使在 Excel 2013 上,以下内容也可以阅读 引用来自上述同一站点This is where you can see there is no ";" on the end stringhttps://www.connectionstrings.com/excel-2013/ Xlsm 文件 使用 Xlsm 文件扩展名连接到 Excel 2007(及更高版本)文件。那是启用了宏的 Office Open XML 格式。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsm;Extended Properties="Excel 12.0 Macro;HDR=YES";

“HDR=是的;”表示第一行包含列名,而不是数据。 “HDR=否;”表示相反。

【讨论】:

以上是关于微软.ACE.OLEDB.12.0;可能的连接字符串格式错误导致“找不到可安装的 ISAM 文件”错误?的主要内容,如果未能解决你的问题,请参考以下文章

导入Excel 2013到vs,本机没有注册微软ACE.OLEDB.12.0

Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别

Microsoft.Jet.OLEDB.4.0和Microsoft.ACE.OLEDB.12.0的区别(转)

Microsoft.ACE.OLEDB.12.0 提供程序未注册

Microsoft.ACE.OLEDB.12.0 提供程序未注册

从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法