Voici une autre façon de procéder. Selon la méthode ColumnDifferences
reference from MSDN: "Renvoie un objet Range
représentant toutes les cellules dont le contenu est différent de la cellule de comparaison dans chaque colonne".
Sur la base de ce que j'applique la stratégie suivante:
(1) stocker le contenu de src
à un Variant
.
(2) Remplacez le contenu de sel
par quelque chose de complètement aléatoire.
(3) Utilisez la méthode ColumnDifferences
pour obtenir la plage désirée.
(4) Renvoyer les valeurs d'origine de src
, qui sont stockées dans le Variant
.
Une mise en œuvre des étapes ci-dessus suit:
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
La méthode RowDifferences
doit donner les mêmes résultats - c'est parce que nous remplaçons toutes les cellules dans le visible afin que les deux méthodes se comportent de la même façon.
J'ai vérifié ce qui précède en générant des nombres aléatoires dans les rangées 1 - 17 et les colonnes A - U, et en cachant les rangées 7 - 10 et il a fait le travail.