Вот формула, которая будет работать для одного пропущенного значения. Если вам нужно вернуть более одного пропущенного значения, можно использовать вспомогательные столбцы, но VBA будет намного проще. Формула обычно вводится и должна работать с большинством версий Excel:
=LOOKUP(2,1/ISERR(SEARCH(TRIM(MID(SUBSTITUTE(K4,",",REPT(" ",99)),seq_99,99)),D4 & ",")),TRIM(MID(SUBSTITUTE(K4,",",REPT(" ",99)),seq_99,99)))
seq_99
- это определенное Имя (в данном случае формула), которое генерирует массив значений {1,99,198,297, ...}
seq_99 Refers to: =IF(ROW(INDEX($1:$65535,1,1):INDEX($1:$65535,255,1))=1,1,(ROW(INDEX($1:$65535,1,1):INDEX($1:$65535,255,1))-1)*99)
Для подпрограммы VBA, особенно рекомендуемой, если может отсутствовать более одного элемента, попробуйте следующее:
Option Explicit
Function MissingValues(sFull As String, sPartial As String) As String
Dim RE As Object
Dim sPat As String
Dim S As String
'Replace commas with pipes, surround by brackets "[]" and follow by end
' of line to create regex pattern from sPartial
sPat = "[" & Replace(sPartial, ",", "|") & "](?:,|$)"
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = sPat
.ignorecase = True
.Global = True
.MultiLine = True
S = .Replace(sFull, "")
.Pattern = ",$"
MissingValues = .Replace(S, "")
End With
End Function
Подпрограмма использует регулярное выражение для удаления всего в полном наборе, которое появляется в частичном наборе. (И затем последняя проверка, чтобы удалить любую терминальную запятую). Это вернет несколько пропущенных значений в одном и том же шаблоне, разделенном запятыми. Он нечувствителен к регистру, но вы можете увидеть, где это можно легко изменить.
Вот снимок экрана, на котором сравниваются выходные данные двух методов при двух пропущенных значениях:
person
Ron Rosenfeld
schedule
14.05.2017