【问题标题】:Excel crashes on ADODB connection open commandExcel 在 ADODB 连接打开命令上崩溃
【发布时间】:2020-09-01 07:54:42
【问题描述】:

我正在尝试在 Excel (2013) 中使用 vba 来使用 ADODB 连接和 SQL 从另一个选项卡查询和整理数据。我的笔记本电脑运行的是 Windows 10 Pro 64 位 (10.0.17763) 和 Excel Standard 2013 64 位 (15.0.5233.1000)

我已尝试删除并重新添加我的 Active X 引用,但仍未解决问题。我还尝试删除所有可能的引用并一一重新添加它们,并尝试使用旧版本。所有结果都相同。我选择的参考是:Visual Basic for Applications、Microsoft Excel 15.0 对象库、OLE 自动化、Microsoft Office 15.0 对象库、Microsoft Forms 2.0 对象库、Microsoft ActiveX 数据对象 6.1 库、Microsoft ActiveX 数据对象 Recordset 6.0 库。

当我在下面的代码中访问 c​​nExcel.Open 时,excel 只是崩溃(即关闭)而没有错误消息。

Dim cnExcel As Connection
Dim rsExcel As Recordset
   .....
strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""C:\Users\trheinsc\Desktop\InProgress\Error Dashboard_TEMPLATE.xlsm"";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
Set cnExcel = CreateObject("ADODB.Connection")
Set rsExcel = CreateObject("ADODB.Recordset")
rsExcel.CursorLocation = adUseClient
cnExcel.Open strCon                     ' <=  This is where Excel blows up and shuts down.

' Populate Iteration Columns
sqlSelect = "SELECT DISTINCT [Iteration]"
sqlFrom = "FROM [ErrorDetail$]"
sqlWhere = "WHERE [Iteration] Is Not NULL"
sqlGroup = ""
sqlOrder = "ORDER BY [Iteration] DESC"
sqlString = sqlSelect & " " & sqlFrom & " " & sqlWhere & " " & sqlGroup & " " & sqlOrder
rsExcel.Open sqlString, cnExcel
cDashRow = 1
cDashCol = FirstIterCol
Do
    If rsExcel.EOF Then Exit Do
    shDashboard.Cells(cDashRow, cDashCol) = "Iter " & rsExcel(0) & Chr(10) & "# Errors"
    shDashboard.Cells(cDashRow, cDashCol).Columns.AutoFit
    aIterArray(cDashCol) = rsExcel(0)
    cDashCol = cDashCol + 1
    rsExcel.MoveNext
Loop Until rsExcel.EOF
LastIterCol = cDashCol - 1
If rsExcel.State = 1 Then rsExcel.Close

任何帮助将不胜感激。

【问题讨论】:

  • 我认为您不需要在数据源周围使用双引号 ",只需要在扩展属性周围。如果我没记错的话,扩展属性也应该是Excel 12.0 Xml;
  • "Excel 12.0 Xml" 仅适用于非宏文件类型,不适用于 OPs 情况。
  • @timlash 谢谢,不知道。
  • @Kostas K. - np。您对双引号的观察很有趣,但我也会这样做,因为文件名中有一个空格,特别是如果我不能只重命名文件。我避免使用像瘟疫这样的空格的文件名,因为很难预测不同的程序解析器将如何处理它们。
  • @timlash 那些连接字符串让我头疼。我从来没有通过 ADO 打开 .xlsm,只有 .xlsx,但我仍然不明白为什么需要区分 Excel 12.0 MarcoExcel 12.0 Xml。这背后的驱动力是什么?它会抑制宏吗?我不这么认为。

标签: sql excel vba activex adodb


【解决方案1】:

显然是连接字符串的问题(不是总是这样吗?)。在 Excel 2013 中连接到 XLSM 文件时,扩展属性需要包含“Excel 12.0 Marco”,而不是您拥有的“Excel 12.0”。

【讨论】:

  • 并可能删除 Kostas 上面提到的数据源周围的双引号。
  • 实际上,12.0 应该可以工作,包括12.0 Xml。可能,问题更多的是路径周围的引号。
  • 尝试不带引号(在需要的地方,或者出现特定的错误),并将路径放入变量中,并得到同样的结果。
  • 尝试按照建议将连接字符串更改为“Excel 12.0 宏”,这导致“运行时错误 3706:找不到提供程序”问题。
【解决方案2】:

我就是这样用的。

Dim Rs As Object
Dim strConn As String
Dim i As Integer

strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & ThisWorkbook.FullName & ";" & _
        "Extended Properties=Excel 12.0;"


Set Rs = CreateObject("ADODB.Recordset")
Rs.Open strSQL, strConn

【讨论】:

  • 得到了 -3001-参数的类型与推荐的代码错误
【解决方案3】:

在广泛搜索解决此问题的解决方案后,我发现其他提供商建议进行连接。使用 JET 的原始(第 1 次)和第 2 次不起作用,但使用 MSDASQL 的第 3 次确实起作用。

所以我在我的代码中留下了所有 3 种类型的调用,只是注释掉了那些不起作用的调用。

strFile = ThisWorkbook.FullName
'Using Microsoft.ACE.OLEDB Provider - If you get an issue with ACE OLEDB Provider try JET Provider
'strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

'Using Microsoft.Jet.OLEDB Provider - If you get an issue with Jet OLEDB Provider try MSDASQL Provider (above statement)
'strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

'Using MSDASQL Provider
strCon = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & strFile & ";HDR=Yes';"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多