执行我的 select 查询时出错 - 参数类型错误,超出可接受范围

getting error while executing my select query - Arguments are of wrong type , are out of acceptable range

我在 VBA 中执行 SQL select 查询时出错。 错误:参数类型错误,超出可接受范围,或者在一个 another.Please 中找到我的代码

Public Function Get Invoices()

Dim objConn As Object

Dim objRecordSet As Object

Dim objRecCmd As Object

strQuery = "Select Distinct [RECHNR] from [Sheet1$]"

strFolderPath = "\test1"

Set objConn = CreateObject("ADODB.Connection")

Set objRecCmd = CreateObject("ADODB.Command")

objConn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFolderPath & ";Extended Properties=""Excel 12.0;IMEX=1""")

Set objRecordSet = CreateObject("ADODB.Recordset")

objRecordSet.CursorLocation = adUseClient

objRecCmd.ActiveConnection = objConn

objRecCmd.CommandText = strQuery

objRecordSet.Open objRecCmd, , adOpenKeyset, adLockOptimistic

End Function

行中出现错误 - objRecordSet.CursorLocation = adUseClient

您的代码引用了以下内容:

adUseClient
adOpenKeyset
adLockOptimistic

Excel 无法识别这些枚举(枚举的缩写 - 您可能会将它们视为常量或特定数字的代码字 - Google“什么是枚举”以获取更多信息) , 所以它会假设它们是变量。

如果您在代码中使用 Option Explicit,Excel 会告诉您这一点。

因为这些变量不存在,Excel 将它们解释为 0。您将在下面看到,0 不是您想要在任何情况下使用的值。您需要使用正确的 number/code 让您的脚本请求正确的东西。

您有以下三种选择:

选项 1

您可以创建与枚举同名的变量。您可以将以下内容放在代码的开头:

adUseClient = 3
adOpenKeyset = 1
adLockOptimistic = 3

这确实有效,但不推荐 - 虽然不太可能,但理论上 Microsoft 可以更改他们的编码并且您的脚本会开始请求非常奇怪的东西,直到您意识到并采取修复措施。

选项 2

您可以用实际值替换对枚举的使用。用上面的值交换枚举名称将解决问题。但同样,如果 Microsoft 在 ADO 的更高版本中进行更改,混乱可能随之而来。

选项 3

在项目的引用中引用必要的库。转到工具 > 参考和 tick/select:

Microsoft ActiveX 数据对象记录集x.x库

在这样做的过程中,Excel 变为 'aware' 真实值 - 来自图书馆 - 因此应始终使用正确的值。