Подсчитать количество аргументов в формуле Excel в VBA - PullRequest
1 голос
/ 12 апреля 2010

Мне нужно использовать VBA, чтобы определить количество аргументов, передаваемых в формулу Excel. Например, предположим, что ячейка содержит формулу = MyFunc ($ A $ 1, "xyz", SUM (1,2, COUNT (C1: C12)), IF (B1> 2,1,0)). Тогда функция counter должна вернуть 4. Имеет ли VBA какие-либо встроенные функции для этого, или у кого-то есть пример регулярного выражения, которое могло бы вычислить это?

Обновление:

Спасибо вам как пользователь225626, так и Чарльз. Одна проблема, которую я обнаружил, заключалась в том, что были строковые аргументы в кавычках, содержащие запятые; эти запятые вызывали увеличение количества аргументов. Я изменил код Чарльза, чтобы учесть это.

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

Ответы [ 3 ]

1 голос
/ 12 апреля 2010

Чтобы расширить 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
0 голосов
/ 23 мая 2013

UBOUND (массив)

Почему бы просто не использовать встроенную функцию UBOUND () для аргументов, чтобы выяснить, сколько было передано вашей пользовательской функции?

Это просто, но это потребует, чтобы вы установили хотя бы одну из ваших переменных на неограниченное количество. Вот что я написал для моих целей:

    Function My_Func(ParamArray others() as variable)

    n = UBound(others) + 1

    'insert code here

    howmanyargumentsinmyfunc = n

    End Function

Примечание:

  • «другие» представляет неограниченное количество аргументов, передаваемых в мою функцию
  • 'n' представляет общее количество аргументов (вы должны добавить один из-за того, как UBound работает с массивами)

UBound и ParamArray - ключевые встроенные команды для определения количества переменных, переданных в функцию. Я полагаю, если вам нужно исключить подсчет определенных значений, вы можете легко сделать это с помощью некоторого показателя.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 12 апреля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...