Вот еще один способ сделать это.
Согласно методу ColumnDifferences
из MSDN :
« Возвращает объект Range
, представляющий все ячейки, содержимое которых отличается от ячейки сравнения в каждом столбце ».
Исходя из этого, я применил следующую стратегию:
(1) Сохранить содержимое src
в Variant
.
(2) Заменить содержимое sel
чем-то совершенно случайным.
(3) Используйте метод ColumnDifferences
для получения желаемого диапазона.
(4) Возвращать исходные значения src
, которые хранятся в Variant
.
Реализация вышеперечисленных шагов следующая:
Dim src As Range, sel As Range, rngDiff As Range, varTempStorage As Variant
Dim icnt1 As Long, icnt2 As Long
Set src = ActiveSheet.UsedRange
Set sel = src.SpecialCells(xlCellTypeVisible)
' Store the src values in a variant
varTempStorage = src.Value
' Fill up the visible range with something random
sel.Value = "something completely random"
' Will return an error if nothing is found so needs appropriate error handling
' If it works, it should set rngDiff to point to the hidden cells only
Set rngDiff = src.ColumnDifferences(Comparison:=src(1,1))
' Pass data from variant to range - method taken from CPearson's website
Set src = src(1, 1)
src.Resize(UBound(varTempStorage, 1), UBound(varTempStorage, 2)).Value = varTempStorage
' Have a look at the output
For icnt1 = 1 To rngDiff.Rows.Count
For icnt2 = 1 To rngDiff.Columns.Count
Debug.Print " address: "; rngDiff(icnt1, icnt2).Address; " value: "; rngDiff(icnt1, icnt2)
Next icnt2
Next icnt1
Метод RowDifferences
должен давать одинаковые результаты - это потому, что мы заменяем все ячейки в видимом диапазоне, чтобы оба метода вели себя одинаково.
Я проверил вышесказанное, сгенерировав случайные числа в строках 1 - 17 и столбцах A - U, и скрыв строки 7 - 10, и он выполнил свою работу.