Вы должны написать код, но он не должен быть циклом с двойным вложением, и вам не нужно беспорядочно удалять отдельные элементы из массивов.
Если вы добавитеСсылка на Microsoft Scripting Runtime (из меню Tools в VBE) позволяет упростить использование объекта Dictionary.У него есть методы для «Exists», «Remove» и «Keys».Таким образом, вы можете выполнить цикл B и добавить элементы в качестве ключей в Словаре, а затем выполнить цикл A, проверяя, существуют ли эти элементы, и, если да, удаляя их.
Как псевдокод:
for each elem in b
dict(elem)=0
next elem
for each elem in a
if dict.exists(elem)
dict.remove(elem)
end if
next elem
return dict.keys
Приведенный выше подход также удаляет дубликаты из B, если они есть.
Если вы знаете, что у ваших массивов нет значений ошибок в качестве элементов, вы также можете использовать MATCH (и в приложении VBA '.Match 'или' Application.WorksheetFunction.Match ').Выполнение чего-то вроде
=MATCH({2,4,6},{1,2},0)
вернет {2, # N / A, # N / A}.Любая позиция с # N / A - это позиция элемента B, которого не было в A. Если вы выполняете сопоставление на листе, вы можете перетащить формулу, например
=IF(ISNA(cell of match),corresponding cell of B,NA())
, и затем отфильтроватьиз # N / Как из этого.В VBA вы могли бы сделать (больше псевдокод):
matches=application.match(b,a,0)
for each elem in matches
if iserror(elem)
add corresponding element of b to result
end
next elem
redim result to new smaller size
return result
Конечно, тогда вам нужно беспокоиться о начальных границах массива и т. Д.