попробуйте что-то вроде:
for i = 1 to ubound(DBArray)
if application.iferror(application.match(DBArray(i,1),ReportArray,0),0)=0 then Report.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).value = DBArray(i,1)
next i
Вы уже нашли значение в массиве, поэтому просто добавьте его к листу отчета вместо копирования / вставки (я использовал вашу строку и удалил pastespecial; я не проверял код)
Edit1:
Попытка разбить информацию, чтобы убедиться, что мы извлекаем соответствующую информацию:
Dim i as long, lrs as long, lrd as long, sarr as variant, darr as variant
with sheets("DB")
lrs = .cells(.rows.count,1).end(xlup).row 'last row source
sarr = .range(.cells(1,1),.cells(lrs,1)).value 'source array
end with
with sheets("Report")
lrd = .cells(.rows.count,1).end(xlup).row 'last row destination
darr = .range(.cells(1,1),.cells(lrd,1)).value 'destination array
for i = lbound(sarr) to ubound(sarr)
if application.isna(application.match(sarr(i,1),darr,0)) then
lrd = .cells(.rows.count,1).end(xlup).row 'last row destination
.cells(lrd+1,1).value = sarr(i,1)
end if
next i
end with
обратите внимание, что этот код использует строки / столбцы из базы данных листа и отчета.
Также обратите внимание, что ваши последние представления строк в вашем примере кода не имеют полностью определенных диапазонов (например, листов («отчет»). Rows.Count ), которые могут быть частью вашей проблемы. Если в активном листе (что показано) нет строк, то ваш rows.count показывает это как базовый диапазон.