У меня есть списки, разделенные запятыми в ячейках. Все числа положительные и находятся в пределах от 1 до 10.
Пример:
если у меня есть в A1: (2,3,5,6)
, я бы хотел, чтобы в B1:(1,4,7,8,9,10)
были пропущенные числа.
Если A2: (1,10)
, то я бы в B2:(2,3,4,5,6,7,8,9)
Если A3: (7)
, то я бы в B2:(1,2,3,4,5,6,8,9,10)
Я искал решение в Интернете, но не смог найти ничего похожего с числами, разделенными запятыми.
Я был бы рад, если бы у меня было решение здесь. Спасибо.
У меня Эксель 2016.
Является ли VBA вариантом? Выполнимо с формулой, но намного проще с VBA IMO.
конечно. Я знаю макросы.
Вот определяемая пользователем функция, которая должна выполнить это... возможно, ее можно оптимизировать.
Public Function MissingNumbers(ByVal numberList As String) As String
Dim temp As String
temp = Replace(numberList, "(", "")
temp = Replace(temp, ")", "")
Dim arr As Variant
arr = Split(temp, ",")
Dim newNumbers As String
newNumbers = "1,2,3,4,5,6,7,8,9,10,"
Dim i As Long
For i = LBound(arr) To UBound(arr)
newNumbers = Replace(newNumbers, arr(i) & ",", "")
Next
newNumbers = "(" & Left$(newNumbers, Len(newNumbers) - 1) & ")"
MissingNumbers = newNumbers
End Function
Прикольно +) к вашему сведению Добавил альтернативу с использованием негативной фильтрации.
Просто для удовольствия, демонстрируя, как использовать отрицательную фильтрацию:
Function MissingList(ByVal numberList As String) As String
Dim given: given = Split(Mid(numberList, 2, Len(numberList) - 2), ",")
Dim series: series = GetSeries() ' i.e. numbers 1..10
Dim i As Long
For i = 0 To UBound(given)
series = Filter(series, given(i), False) ' << negative filtering
Next
MissingList = "(" & Replace(Join(series, ","), "0", "10") & ")"
End Function
Поскольку Filter
выполняет частичный поиск в серии 1..10, 10
необходимо временно заменить уникальным 0
.
Функция помощи GetSeries()
Function GetSeries()
' Purpose: get numbers 1..10
Const LAST As Long = 10: Const FIRST = 1
Dim tmp: tmp = Application.Transpose(Evaluate("row(" & FIRST & ":" & LAST & ")"))
tmp(LAST) = 0 ' replace 10 by 0 as search item 1 would filter out value 10, too
GetSeries = tmp
End Function
Какая у вас версия Экселя?