1

Я хотел создать пользовательскую функцию, которая была бы сокращением для if(somefunction(arg)=something,"sometext",somefunction(arg)) поэтому мне не нужно дублировать somefunction(arg) каждый раз, когда я делаю это, просто например, как iferror позволяет нам покончить с if(iserror(somefunction(arg)),"sometext",somefunction(arg)

Например, я хочу иметь возможность вводить iftrue(somefunction(arg),"=A1","message") и эквивалентно if(sumfunction(arg)=A1,"message",sumfunction(arg))

Я старался:

Function iftrue(Fx, condition, show)
    iftrue = Application.WorksheetFunction.if(Fx & condition, show, Fx)
End Function

Но это дает # значение.


Чтобы диагностировать мою проблему, я попробовал несколько более простых функций, чтобы увидеть, где я ошибаюсь. Поэтому я продублировал функции SUM и If.

Эта функция "сумма" работает.

Function testsum(a, b)
    test = Application.WorksheetFunction.Sum(a, b)
End Function

Но эта функция "если" не работает.

Function testif(a, b, c)
    testif = Application.WorksheetFunction.if(a, b, c)
End Function

Поэтому я думаю, что моя проблема в том, как я вызываю worksheet.function.if .

Я знаю, что мог бы просто обойти это, используя вместо этого VBA ifs, но это не совсем то, что я хочу делать.

1 ответ1

2

Там нет Application.WorksheetFunction.If()

Даже если бы это было так, вам все равно нужно было вставить дополнительные кавычки в тестовую часть if. например, если fx разрешен как "test" и условие "=test" результирующая строка будет "test = test"

Положи это

Так что используйте вместо Evaluate.

Нам нужно проанализировать строку в определенном формате для Evaluate.

нам нужно вставить дополнительные кавычки в результирующую строку. например, если fx разрешен как "test" и условие "=test" результирующая строка будет "test = test" .

Если поместить это в Evaluate, функция будет искать функцию с именем test . Поэтому нам нужна строка типа ""test"="test"" , которая преобразуется в True.

Если условие всегда было равенством, а не неравенством, мы могли бы просто использовать IF fx = condition then вместо всего, вплоть до If tst Then .

Эта функция более динамична, так как допускает неравенства:

Function IFTrue(fx, condition As String, show)
Dim tst As Boolean
Dim z As Integer
Dim t As String
'test whether the condition is assuming "="
If InStr("<>=", Left(condition, 1)) = 0 Then condition = "=" & condition
'Find whether there is one or two qulifiers
If InStr("<>=", Mid(condition, 2, 1)) > 0 Then z = 2 Else z = 1
'Parse string to remove qulifiers from the quotes and make everything a string
t = """" & fx & """" & Left(condition, z) & """" & Mid(condition, z + 1) & """"
'evaluate the formula string to resolve to True or False
tst = Application.Caller.Parent.Evaluate(t)

If tst Then
    IFTrue = show
Else
    IFTrue = fx
End If
End Function

Вы бы тогда назвали это так

=IFtrue(SUM(A1,A2),"=A3","Must Be True")

редактировать

Вы можете использовать IIF() и уменьшить количество строк

Function IFTrue2(fx, condition As String, show)
Dim z As Integer

'test whether the condition is assuming "="
If InStr("<>=", Left(condition, 1)) = 0 Then condition = "=" & condition
'Find whether there is one or two qulifiers
If InStr("<>=", Mid(condition, 2, 1)) > 0 Then z = 2 Else z = 1

IFTrue2 = IIf(Application.Caller.Parent.Evaluate("""" & fx & """" & Left(condition, z) & """" & Mid(condition, z + 1) & """"), show, fx)

End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .