EDIT: Вместо этого для моего решения используйте что-то вроде
For i = 1 To tmpRngSrcMax
If rngSrc(i) <> rngDes(i) Then ...
Next i
Это примерно в 100 раз быстрее.
Мне нужно сравнить два столбца, содержащие строковые данные, используя VBA. Это мой подход:
Set rngDes = wsDes.Range("A2:A" & wsDes.Cells(Rows.Count, 1).End(xlUp).Row)
Set rngSrc = wsSrc.Range("I3:I" & wsSrc.Cells(Rows.Count, 1).End(xlUp).Row)
tmpRngSrcMax = wsSrc.Cells(Rows.Count, 1).End(xlUp).Row
cntNewItems = 0
For Each x In rngSrc
tmpFound = Application.WorksheetFunction.CountIf(rngDes, x.Row)
Application.StatusBar = "Processed: " & x.Row & " of " & tmpRngSrcMax & " / " & Format(x.Row / tmpRngSrcMax, "Percent")
DoEvents ' keeps Excel away from the "Not responding" state
If tmpFound = 0 Then ' new item
cntNewItems = cntNewItems + 1
tmpLastRow = wsDes.Cells(Rows.Count, 1).End(xlUp).Row + 1 ' first empty row on target sheet
wsDes.Cells(tmpLastRow, 1) = wsSrc.Cells(x.Row, 9)
End If
Next x
Итак, я использую цикл For Each для итерации по столбцу 1-го (src) и метода CountIf, чтобы проверить, присутствует ли элемент во втором столбце (des). Если нет, скопируйте в конец столбца 1 (src).
Код работает, но на моей машине требуется ~ 200 с заданных столбцов размером около 7000 строк. Я заметил, что CountIf работает быстрее, когда используется напрямую в качестве формулы.
Есть ли идеи для оптимизации кода?