Microsoft.ACE.OLEDB.12.0;可能的连接字符串格式错误导致 "Could not find installable ISAM file" 错误?

Microsoft.ACE.OLEDB.12.0; possible connection string formatting error causes "Could not find installable ISAM file" error?

我遇到问题的宏 是用 Word VBA 编辑器编写的,它是从 Word 中下载的。

它的目标是通过 Microsoft.ACE.OLEDB.12.0 link 进入 Excel .xlsm 文件(被视为客户数据库);连接,甚至不打开文件,从该文件 (sheet name = "data") 中读取整个 sheet 到动态数组中,稍后将搜索该数组。

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

最重要的是代码是用 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?我可以把它变成 sub 吗??这不是我写的。我从 here.

下载了这段代码

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

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

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

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

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中,当你想把一个语句分成两行时,你在第一行的末尾放一个space后跟“_”,这意味着你结束了有了这个:

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

很好。

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

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

回复。 “私人潜艇”的事情,不是它不一定是私人潜艇。

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

我已经为此工作了几个小时,但我得到的只是 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=否;”表示相反。