Извлеките все условия логического теста, используемые с оператором IF (не вложенные), и напечатайте в отдельный столбец - PullRequest
0 голосов
/ 11 января 2020

У меня есть список около 100 строк формул. Каждая строка содержит ячейку, которая имеет 1/2/3/4/5/6 IF-операторов.

Мне нужна помощь для извлечения всех строк логического теста, используемых для каждой строки, например, ячейка C2 содержит:

=IF(Payload_Decode!AB74=Payload_Decode!Z92,"OK",IF(Payload_Decode!AB74=Payload_Decode!Z86,"OK",IF(Payload_Decode!AB74=Payload_Decode!Z87,"OK","ERROR")))

Входная переменная:

  • Ячейка E2: Payload_Decode! AB74

Сравнительные переменные в отдельных ячейках:

  • Ячейка G2: Payload_Decode! Z92
  • Ячейка H2: Payload_Decode! Z86
  • I2 ячейка: Payload_Decode! Z87

Мне нужно, чтобы это происходило со всеми строками. Вот скриншот, объясняющий:

enter image description here

1 Ответ

0 голосов
/ 11 января 2020

Вы не пытались решить эту проблему самостоятельно, что обычно является требованием этого форума, но я нашел проблему сложной, поэтому:

Поскольку вы включили тег VBA Вот пользовательская функция, использующая регулярные выражения, которая может делать то, что вы хотите.

Формула представляет собой формулу массива. Если у вас установлена ​​последняя версия Excel с динамическими массивами c, вы можете ввести формулу в E2, и результаты будут отображаться справа.

Если у вас нет этой функции, вы можно отобразить результаты формулы отдельно, заключив в INDEX, или вы можете ввести ее в виде массива E2:J2

Пожалуйста, прочтите примечание в начале UDF относительно раннего или позднего связывания.

'Установить ссылку на регулярные выражения Microsoft VBScript 5.5' или использовать позднюю привязку

Option Explicit
Function inputCompVars(ByVal S As String) As String()
    Dim RE As RegExp, MC As MatchCollection, M As Match
    Const sPat As String = "\(([^=]+)=([^,]+)"
    Dim sTemp() As String, I As Long
Set RE = New RegExp
With RE
    .Global = True
    .Pattern = sPat
    If .test(S) = True Then
        Set MC = .Execute(S)
        ReDim sTemp(0 To MC.Count)
            sTemp(0) = MC(0).SubMatches(0)
            I = 0
            For Each M In MC
                I = I + 1
                sTemp(I) = M.SubMatches(1)
            Next M
    End If
    inputCompVars = sTemp
End With

End Function

Это используется с чем-то вроде:

E2: =inputCompVars(FORMULATEXT($A2))

или, если вы не используете не имеют динамических c массивов:

E2:  =IFERROR(INDEX(inputCompVars(FORMULATEXT($A2)),1,COLUMNS($A:A)),"")

и заполняются правильно при необходимости.

enter image description here

Если вам нужна формула Решение и Excel 2013+, вы можете попробовать:

E2:  =FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(FORMULATEXT($A2),"=",","),"(",","),",","</s><s>")&"</s></t>","//s[contains(.,'Payload_Decode')][1]")

F2:  =IFERROR(FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(FORMULATEXT($A2),"=",","),"(",","),",","</s><s>")&"</s></t>","//s[contains(.,'Payload_Decode')][" & COLUMNS($A:A)*2&"]"),"")

и выбрать F2 и заполнить вправо.

Если у вас есть более ранние версии, вам необходимо сообщить нам какая версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...