0

在 VBA 中,有时您可能希望将不确定数量的参数传递给函数。在 VB 世界中,paramarray 处理这些。但是,如果需要反过来将其传递给子功能怎么办?

在这里的挑战中,我有几个不同的地方可以格式化字符串,插入后续值,例如:

tx = SetSQL("UPDATE tabA SET cd={1} WHERE id={2}", "'123'", 89)

根据情况,可能有 1 个或n 个参数。

当我直接处理所有 SQL 时,这很有效。例如:

set rsNEW = currentdb.execute (SetSQL("UPDATE tabA SET cd={1} WHERE id={2}", "'123'", 89))

但是,后来我发现我有几种情况会重复相同的处理,有时我想将其中的一些重构为一个更全面的调用。我想包装SetSQL另一个例程的内部。例如:

public sub DoMyDBThing("UPDATE tabA SET cd={1} WHERE id={2}", "'123'", 89)

这使我处于需要将 a 转移paramarray到 a的情况下paramarray

4

1 回答 1

0

解决方案是编写一个包装函数,将参数数组转换为数组变体。

正如我已经使用SetSQL的那样,它仍然接受paramarray. 而它曾经的所作所为变成了SetSQLBase。这样,我的其他需要相同功能的扩展也可以采用参数数组,然后用于SetSQLBase生成文本。这样我就不必复制程序了。

因此:


Dim v() As Variant
  v = p
  SetSQL = SetSQLBase(sql, v())

End Function

这仍然处理n个尾随参数,因为它重新包装paramarrayasvariant array以传递给核心例程:


Dim ct As Long
Dim tx As String
  
  While InStr(1, sql, "{") > 0 And ct < 8
    On Error Resume Next
    tx = IIf(ct > UBound(p), "", p(ct))
    On Error GoTo 0
    ct = ct + 1
    
    sql = Replace(sql, "{" & ct & "}", tx)
  Wend
  
  SetSQLBase = sql
End Function

现在其他例程也可以调用相同的东西,也接受未知数量的参数,获取 sql 并处理。例如:

Private Function PassTag_RunSQL(ByRef ds As clsSideXDB, cdStep As String, sql As String, ParamArray p() As Variant) As Boolean

Dim v() As Variant

  v = p
  PassTag_RunSQL = True
  sql = SetSQLBase(sql, v)
  ...
于 2020-10-08T21:25:05.287 回答