Excel 在vba中,一个函数如何将收到的paramarray参数传递给另一个函数?

Excel 在vba中,一个函数如何将收到的paramarray参数传递给另一个函数?,excel,vba,ms-access,paramarray,Excel,Vba,Ms Access,Paramarray,在VBA中,有时可能需要将数量不确定的参数传递给函数。在VB世界中,paramarray处理这样的问题。但如果一个人需要,反过来又把这些传递给一个子函数呢 在这里的挑战中,我有两个不同的地方格式化字符串,插入后续值,例如: Private Function PassTag_RunSQL(ByRef ds As clsSideXDB, cdStep As String, sql As String, ParamArray p() As Variant) As Boolean Dim v() As

在VBA中,有时可能需要将数量不确定的参数传递给函数。在VB世界中,paramarray处理这样的问题。但如果一个人需要,反过来又把这些传递给一个子函数呢

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

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)
  ...
tx=SetSQL(“更新tabA SET cd={1},其中id={2},“'123',89”)

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

当我直接处理所有的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)
  ...
set rsNEW=currentdb.execute(SetSQL(“更新tabA set cd={1},其中id={2}”,“123',89))

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

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)
  ...
public sub-DoMyDBThing(“UPDATE tabA SET cd={1}其中id={2},“'123',89”)


这使我处于一种需要将
paramarray
转换为
paramarray

的情况下,解决方案是编写一个包装函数,将paramarray转换为数组变量

由于我已经使用了
SetSQL
,它仍然接受
paramarray
。它曾经做过的就是
SetSQLBase
。这样,我的其他需要相同功能的扩展也可以使用paramarray,然后使用
SetSQLBase
生成文本。这样我就不必复制程序了

因此:


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

End Function
当它将
paramarray
重写为
variant array
以传递给核心例程时,仍然会处理n个尾随参数:


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