В какой-то момент использование нормальных формул для этих сложных операций становится контрпродуктивным и чревато ошибкой, поскольку длина формулы увеличивается.
Когда достигается определенный уровень сложности, я склонен переключаться на пользовательские функции, чтобы упростить формулу и инкапсулировать сложность в одном месте.
Следующая функция будет делать то, что вам нужно:
Function FirstMatch(DefaultVal As String, ParamArray Params() As Variant) As String
Application.Volatile (True)
Dim i As Integer
FirstMatch = DefaultVal
For i = LBound(Params) To UBound(Params) Step 2
If Range(Params(i)).Value <> "" Then
FirstMatch = Params(i + 1)
Exit For
End If
Next
End Function
Как только вы поместите эту функцию в свой лист, формула для ее вызова станет намного проще:
=FirstMatch("No open cases", "SCB!A8", "X", "Voda!A8", "Y", "Fixnetix!A8", "A", "IOW!A8", "B")
Он работает просто, устанавливая возвращаемое значение по умолчанию, а затем обрабатывает каждую пару строк по очереди. Если первая из пары не пуста, она установит возвращаемое значение на второе и вернет. В противном случае он будет продолжать идти, пока не найдет совпадение или не исчерпает возможности.
Если в нет исчерпания возможностей, возвращается возвращаемое значение по умолчанию.
Имейте в виду, что существует множество возможностей улучшить этот код, например сделать обнаружение пробелов более интеллектуальным (с учетом любого пустого пространства вместо того, чтобы требовать полностью пустую ячейку) или вызвать какую-то явную ошибку, если счетчик аргументов неверно (зависшая ячейка без соответствующего значения для использования), но показанный код должен быть хорошим началом.