如何将VBA变体解压缩为ParamArray的多个参数



我有一个VBA函数,它将执行参数化SQL。

Public Function Execute(connection As ADODB.connection, ByVal sql As String, ParamArray parameterValues()) As ADODB.Recordset
'Returns a connected ADODB.Recordset that contains the results of the specified parameterized query.
Dim parameters() As Variant
parameters = parameterValues

Set Execute = ExecuteInternal(connection, sql, parameters)

End Function

参数的数量在运行时可能会有所不同,我使用选定的范围动态构建sql字符串。一个示例sql字符串是:

DELETE FROM my_table WHERE id NOT IN (?, ?, ?)

我也希望将范围中的值传递给函数,但当然,将range.value传递给Execute函数的天真方法不会导致范围被解包。

With New SqlCommand
Set rs = .Execute(con, sql, myRange.value)
End With

如何将变体解压缩到ParamArray中?我基本上是在寻找Python*解包操作符。

如果这是一个愚蠢的问题,请原谅,但VBA不是我的主要语言。

在VBA中调用接受ParamArray的过程时,进行调用的行实际上并没有传递数组。它传递一个或多个谨慎的参数(作为最后一个参数(,VBA(在幕后(将这些特殊参数绑定为ParamArray。

你的代码不能做同样的事情。您正在传递一个恰好是数组的参数,而在幕后,VBA会将整个数组指定为ParamArray中唯一的元素。

为了得到你想要的结果,你的调用代码需要是这样的(假设每个范围只有一个单元格(:

Set rs = .Execute(con, sql, myRange1.Value, myRange2.Value, myRange3.Value)

你可以试试这个。这基本上是";打开包装";将paramArray转换为命令对象的parameters。

Public Function Execute(connection As ADODB.connection, ByVal sql As String, ParamArray parameterValues()) As ADODB.Recordset
'Returns a connected ADODB.Recordset that contains the results of the specified parameterized query.
Dim i As Long
Dim Cm As ADODB.Command
Set Cm = New ADODB.Command
Cm.AcctiveConnection = cn
Cm.CommandType = adCmdText
Cm.CommandText = sql
For i = LBound(parameterValues) To UBound(parameterValues
Cm.Parameters.Append Cm.CreateParameter("Param", adBigInt, adParamInput, 0, parameterValues(i))
Next i

Set Execute = Cm.Execute
Set Cm = Nothing
End Function

最新更新