在VBA中计算Excel公式的参数数量

我需要使用VBA来确定传递给Excel公式的参数的数量。 例如,假设一个单元格包含公式= MyFunc($ A $ 1,“xyz”,SUM(1,2,COUNT(C1:C12)),IF(B1> 2,1,0))。 然后计数器函数应该返回4.是否VBA包含任何内置的函数,或者是否有人可以计算这个正则expression式的例子?

更新:

谢谢你,user225626和查尔斯。 我发现的一个问题是引用了包含逗号的string参数。 这些逗号导致争论数量增加。 我修改了Charles的代码来解释这个。

Public Function CountFormulaArguments(sStr As String) As Integer Dim strChar As String Dim nArgs As Integer Dim n, nLParen, nCommas As Integer Dim blArray, bQuote As Boolean nLParen = 0 nArgs = 0 For n = 1 To Len(sStr) strChar = Mid(sStr, n, 1) If strChar = "(" Then nLParen = nLParen + 1 If nLParen = 1 Then nArgs = nArgs + 1 ElseIf strChar = ")" Then nLParen = nLParen - 1 ElseIf nLParen = 1 And strChar = "{" Then blArray = True ElseIf blArray And strChar = "}" Then blArray = False ElseIf Not bQuote And strChar = """" Then bQuote = True ElseIf bQuote And strChar = """" Then bQuote = False ElseIf nLParen = 1 And Mid(sStr, n, 1) = "," And Not blArray And Not bQuote Then nCommas = nCommas + 1 End If Next nArgs = nArgs + nCommas CountFormulaArguments = nArgs End Function 

扩展Test01以允许在一个语句中使用数组常量和多个函数调用:

 =SUM({1,2,3,4,5},{1,2})+SUM({1,2,3,4,5})<br/><br/> 

码:

 Sub Test02() sStr = Sheets("Sheet1").Range("A2").Formula For n = 1 To Len(sStr) strChar = Mid(sStr, n, 1) If strChar = "(" Then nLParen = nLParen + 1 If nLParen = 1 Then nArgs = nArgs + 1 End If If strChar = ")" Then nLParen = nLParen - 1 If nLParen = 1 And strChar = "{" Then blArray = True If blArray And strChar = "}" Then blArray = False If nLParen = 1 And Mid(sStr, n, 1) = "," And Not blArray Then nCommas = nCommas + 1 Next nArgs = nArgs + nCommas MsgBox nArgs End Sub 
 Sub Test01() sStr = Sheets("Sheet1").Range("A1").Formula For n = 1 To Len(sStr) If Mid(sStr, n, 1) = "(" Then nLParen = nLParen + 1 If Mid(sStr, n, 1) = ")" Then nLParen = nLParen - 1 If nLParen = 1 And Mid(sStr, n, 1) = "," Then nCommas = nCommas + 1 Next nArgs = nCommas + 1 MsgBox nArgs End Sub 

UBOUND(数组)

为什么不直接在参数上使用内置的UBOUND()函数来计算出有多less已经被馈送到用户定义函数?

这很简单,但是它会要求您至less设置一个variables以获得无限的计数。 这是我为我的目的而写的:

  Function My_Func(ParamArray others() as variable) n = UBound(others) + 1 'insert code here howmanyargumentsinmyfunc = n End Function 

注意:

  • “别人”代表无数的参数被馈入我的函数
  • 'n'表示参数的总数(由于UBound如何处理数组,因此您必须添加一个参数)

UBound和ParamArray是确定有多lessvariables传入函数的关键内置命令。 我想,如果你需要排除某些数值的话,你可以很容易地用某种标识来完成。

我希望这可以帮助别人!