Comment savoir par une formule courte si deux plages contiennent exactement la même chose ?
Supposons que tu veux comparer les plages A1:A5 avec C1:C5. Alors entre
la formule suivante:
=SOMME((A1:A5<>C1:C5)*1)=0
Attention, c'est une formule matricielle, donc tu sais avec
MAJ+CTRL+ENTRÉE (et non simplement ENTRÉE)
Laurent M
*****************
{=SOMME(SI(Zone1=Zone2;0;1))=0}
ou plus court... {=SOMME(N(Zone1<>Zone2))=0}
Renvoie VRAI si les plages Zone1 et Zone2 sont strictement identiques...
ChrisV
****************
F1 : {=SOMME((un<>deux)*1)=0}
F2 : {=SOMME(N(un<>deux))=0}
F2 l'emporte 23 à 24 !
Serge
*****************
.... et F3 : {=SOMME(N(a<>b))=0} l'emporte par 19 à 23 y compris les
crochets
.... et F4 : {=SUM(N(a<>b))=0} l'emporte par 17 à 19 en english of course
!
En Héxadécimal ou en binaire, je ne te le dirai pas même sous la torture.
Robert Dezan
*********************
Et JP Costa l'emporte avec :
={SOMME(N(a<>b))} 17 (avec les crochets!!!!!) à 19
et formules françaises
Jean Pierre Costa
********************
Ex aequo avec
Une autre possibilité matricielle :
{=ET(EXACT(plage1;plage2))}
Bernard Mazas
********************
Et le grand gagnant est donc
Jean Pierre Costa avec
{=ET(A=B)} 10 caractères
la formule suivante:
=SOMME((A1:A5<>C1:C5)*1)=0
Attention, c'est une formule matricielle, donc tu sais avec
MAJ+CTRL+ENTRÉE (et non simplement ENTRÉE)
Laurent M
*****************
{=SOMME(SI(Zone1=Zone2;0;1))=0}
ou plus court... {=SOMME(N(Zone1<>Zone2))=0}
Renvoie VRAI si les plages Zone1 et Zone2 sont strictement identiques...
ChrisV
****************
F1 : {=SOMME((un<>deux)*1)=0}
F2 : {=SOMME(N(un<>deux))=0}
F2 l'emporte 23 à 24 !
Serge
*****************
.... et F3 : {=SOMME(N(a<>b))=0} l'emporte par 19 à 23 y compris les
crochets
.... et F4 : {=SUM(N(a<>b))=0} l'emporte par 17 à 19 en english of course
!
En Héxadécimal ou en binaire, je ne te le dirai pas même sous la torture.
Robert Dezan
*********************
Et JP Costa l'emporte avec :
={SOMME(N(a<>b))} 17 (avec les crochets!!!!!) à 19
et formules françaises
Jean Pierre Costa
********************
Ex aequo avec
Une autre possibilité matricielle :
{=ET(EXACT(plage1;plage2))}
Bernard Mazas
********************
Et le grand gagnant est donc
Jean Pierre Costa avec
{=ET(A=B)} 10 caractères
Laurent Mortézai, Serge, ChrisV, Robert Dezan, Jean-Pierre Costa, Bernard Mazas, (N°493)
Je voudrais mettre en évidence les différences entre deux plages nommées mer et soleil en
les
coloriant en rouge Les cellules de ces plages contiennent des formules et je veux comparer
les
résultats.
Sub colorier()
For Each cel In Range("mer")
Set absent = Range("soleilr").Find(cel, LookIn:=xlValues)
'Set absent = Range("soleil").Find(cel, LookIn:=xlValues, LookAt:=xlWhole) pour rechercher
le mot exact
If absent Is Nothing Then
cel.Interior.ColorIndex = 3
End If
Next
End Sub
Beaucoup plus rapide :
Une alternative au "find" = un coup d'Evaluate :
Sub cherch_et_color()
For Each cel In Range("web")
If Evaluate("ISERROR(MATCH(" & cel & ",moteur,0))") = True
Then
cel.Interior.ColorIndex = 3
Else: cel.Interior.ColorIndex = xlNone
End If
Next
End Sub
For Each cel In Range("mer")
Set absent = Range("soleilr").Find(cel, LookIn:=xlValues)
'Set absent = Range("soleil").Find(cel, LookIn:=xlValues, LookAt:=xlWhole) pour rechercher
le mot exact
If absent Is Nothing Then
cel.Interior.ColorIndex = 3
End If
Next
End Sub
Beaucoup plus rapide :
Une alternative au "find" = un coup d'Evaluate :
Sub cherch_et_color()
For Each cel In Range("web")
If Evaluate("ISERROR(MATCH(" & cel & ",moteur,0))") = True
Then
cel.Interior.ColorIndex = 3
Else: cel.Interior.ColorIndex = xlNone
End If
Next
End Sub
Alain Vallon, JP Pradier, (N°492)
Je voudrais savoir si deux plages de mon classeur sont identiques cellule à cellule ou pas.
Sub ComparePlages()
Dim Arr1, Arr2, Flag
Arr1 = Range("A1:D500").Value
Arr2 = Range("F1:I500").Value
Flag = True
For i = LBound(Arr1, 2) To UBound(Arr1, 2)
For j = LBound(Arr1, 1) To UBound(Arr1, 1)
If Not Arr1(j, i) = Arr2(j, i) Then
Flag = False: Exit For
End If
Next j
If Not Flag Then Exit For
Next i
MsgBox "Plages identiques : " & Flag
End Sub
Cette fonction présente l'avantage de passer par des tabeaux (arrays) ce qui est plus rapide
que de manipuler les cellules d'un tableau.
Dim Arr1, Arr2, Flag
Arr1 = Range("A1:D500").Value
Arr2 = Range("F1:I500").Value
Flag = True
For i = LBound(Arr1, 2) To UBound(Arr1, 2)
For j = LBound(Arr1, 1) To UBound(Arr1, 1)
If Not Arr1(j, i) = Arr2(j, i) Then
Flag = False: Exit For
End If
Next j
If Not Flag Then Exit For
Next i
MsgBox "Plages identiques : " & Flag
End Sub
Cette fonction présente l'avantage de passer par des tabeaux (arrays) ce qui est plus rapide
que de manipuler les cellules d'un tableau.
Frédéric Sigonneau, (N°491)
J'ai une liste de noms dans la colonne A d'un classeur 1 et une liste à peu près similaire dans
un classeur 2. Je voudrais lire les noms du classeur 1 et savoir s'ils sont dans le classeur 2.
Deux macros : Comparaison et Comparaison1
Comparaison compare chaque ligne de
cellule de Liste1 avec chaque cellule de
Liste2 et met la cellule de Liste1 en
rouge si aucune correspondance n'est
trouvée dans Liste2
Comparaison1 ne
travaille pas avec des listes, mais avec l'entièreté des
colonnes A de
Classeur1 et Classeur2. (Durée de la macro avec un PIII 500,
00:03:20 ...)
Elle est à privilégier pour de grosses listes. On peut évidemment modifier
le code de
For each cellule1 in range("a:a:") par for each cellule1 in
range("liste1")
et faire la même chose pour cellule2 et liste2...
Sub Comparaison()
Application.ScreenUpdating = False
Dim Cellule1 As Range, Cellule2 As Range
Dim Time1 As Date, Time2 As Date
Time1 = Now()
Workbooks("classeur1.xls").Activate
For Each Cellule1 In Range("liste1")
Workbooks("classeur2.xls").Activate
For Each Cellule2 In Range("liste2")
If Cellule1 <> Cellule2 Then
Cellule1.Font.Color = vbRed
Else
Cellule1.Font.Color = vbBlack
Exit For
End If
Next Cellule2
Workbooks("classeur1.xls").Activate
Next Cellule1
Time2 = Now()
Debug.Print "TestListe :" & Format$(Time2 -
Time1, "hh:mm:ss")
Application.ScreenUpdating = True
End Sub
Sub Comparaison1()
Application.ScreenUpdating = False
Dim Collection1 As New Collection, collection2 As New Collection
Dim Cellule1 As Range, Cellule2 As Range
Dim Element1 As Object, Element2 As Object
Dim Time1 As Date, Time2 As Date
Time1 = Now()
Workbooks("classeur1.xls").Activate
For Each Cellule1 In Range("a:a")
Collection1.Add Cellule1
Next Cellule1
Workbooks("classeur2.xls").Activate
For Each Cellule2 In Range("a:a")
collection2.Add Cellule2
Next Cellule2
For Each Element1 In Collection1
For Each Element2 In collection2
If Element1 <> Element2 Then
Element1.Font.Color = vbRed
Else
Element1.Font.Color = vbBlack
Exit For
End If
Next Element2
Next Element1
Time2 = Now()
Debug.Print "Test collection :" & Format$(Time2 - Time1, "hh:mm:ss")
Application.ScreenUpdating = True
End Sub
Comparaison compare chaque ligne de
cellule de Liste1 avec chaque cellule de
Liste2 et met la cellule de Liste1 en
rouge si aucune correspondance n'est
trouvée dans Liste2
Comparaison1 ne
travaille pas avec des listes, mais avec l'entièreté des
colonnes A de
Classeur1 et Classeur2. (Durée de la macro avec un PIII 500,
00:03:20 ...)
Elle est à privilégier pour de grosses listes. On peut évidemment modifier
le code de
For each cellule1 in range("a:a:") par for each cellule1 in
range("liste1")
et faire la même chose pour cellule2 et liste2...
Sub Comparaison()
Application.ScreenUpdating = False
Dim Cellule1 As Range, Cellule2 As Range
Dim Time1 As Date, Time2 As Date
Time1 = Now()
Workbooks("classeur1.xls").Activate
For Each Cellule1 In Range("liste1")
Workbooks("classeur2.xls").Activate
For Each Cellule2 In Range("liste2")
If Cellule1 <> Cellule2 Then
Cellule1.Font.Color = vbRed
Else
Cellule1.Font.Color = vbBlack
Exit For
End If
Next Cellule2
Workbooks("classeur1.xls").Activate
Next Cellule1
Time2 = Now()
Debug.Print "TestListe :" & Format$(Time2 -
Time1, "hh:mm:ss")
Application.ScreenUpdating = True
End Sub
Sub Comparaison1()
Application.ScreenUpdating = False
Dim Collection1 As New Collection, collection2 As New Collection
Dim Cellule1 As Range, Cellule2 As Range
Dim Element1 As Object, Element2 As Object
Dim Time1 As Date, Time2 As Date
Time1 = Now()
Workbooks("classeur1.xls").Activate
For Each Cellule1 In Range("a:a")
Collection1.Add Cellule1
Next Cellule1
Workbooks("classeur2.xls").Activate
For Each Cellule2 In Range("a:a")
collection2.Add Cellule2
Next Cellule2
For Each Element1 In Collection1
For Each Element2 In collection2
If Element1 <> Element2 Then
Element1.Font.Color = vbRed
Else
Element1.Font.Color = vbBlack
Exit For
End If
Next Element2
Next Element1
Time2 = Now()
Debug.Print "Test collection :" & Format$(Time2 - Time1, "hh:mm:ss")
Application.ScreenUpdating = True
End Sub
Pierre Fauconnier, (N°490)
Comment déterminer quels sont les chiffres communs entre la colonne A et la colonne B ?
Utilise EQUIV(), sans VBA puis un filtre pour isoler les références qui vont
bien.
Rien n'empêche de le faire en VBA ensuite et ça prendra 2 minutes à
l'exécution..
En colonne C tu entres =SI(ESTNA(EQUIV(A2;B:B;0));A2;"") et recopier vers le
bas
En colonne D: =SI(ESTNA(EQUIV(B2;A:A;0));B2;"")
La colonne C donne ce qui est en A mais pas en B, et l'inverse pour la
colonne D.
Ca donne 0 s'il n'y a pas le même nombre d'éléments dans les deux colonnes.
bien.
Rien n'empêche de le faire en VBA ensuite et ça prendra 2 minutes à
l'exécution..
En colonne C tu entres =SI(ESTNA(EQUIV(A2;B:B;0));A2;"") et recopier vers le
bas
En colonne D: =SI(ESTNA(EQUIV(B2;A:A;0));B2;"")
La colonne C donne ce qui est en A mais pas en B, et l'inverse pour la
colonne D.
Ca donne 0 s'il n'y a pas le même nombre d'éléments dans les deux colonnes.
Eric Jeanne, (N°489)