Comparer des valeurs de cellules visibles après un filtre
Bonjour la communauté
Malgré de nombreuses recherches, je ne parviens pas à mes fins.
Explications, que je vais tenter de faire simples.
Des solutions manuelles existent, mais si je veux traiter la masse, je voudrais passer par une macro VBA ; langage que je ne maitrise pas
J'ai bien trouvé :
Dim Plage As Range, Area As Range, Cell As Range
Set Plage = ActiveSheet.AutoFilter.Range.Offset(1).Resize(ActiveSheet.AutoFilter.Range.Offset(1).Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
For Each Area In Plage.Areas
For Each Cell In Area
MsgBox "Ligne : " & Cell.Row
Next Cell
Next AreaJ'ai tenté une adaptation
Dim Plage As Range, Area As Range, Cell As Range
Set Plage = ActiveSheet.AutoFilter.Range.Offset(1).Resize(ActiveSheet.AutoFilter.Range.Offset(1).Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
Range("A1").Select
For Each Area In Plage.Areas
For Each Cell In Area
Range("I" & Cell.Row).Select
If Range("I" & Cell.Row).Value <> Range("I" & Cell.Row + 1).Value Then
Range("I" & Cell.Row + 1).Select
MsgBox "Erreur en " & "I-" & Cell.Row + 1 & Chr(10) & "Controlez le filtre, et la colonne I", vbCritical
Exit Sub
End If
Next Cell
Next Area
MsgBox "Contrôle terminé sans erreur détectée"Mais cela ne réponds pas à mes attentes : cela contrôle la valeur masquée (lorsqu'il y en a une), ce qui n'est pas le but justement.
De plus le contrôle, a cause du "+1" sort de la plage
On me fournit un tableau filtré
Parfois, le filtre est mal appliqué.
C'est pour cela que je souhaiterais comparer la valeur de la cellule à celle immédiatement en-dessous, que ce soit en colonne A, C, E, F
Tant que A2 = A3 = A6 = A178 = ...... = A183 alors tout va bien, on passe à la colonne suivante.
Si une inégalité est présente on stoppe (on affiche éventuellement un message indiquant la cellule concernée, que l'on sélectionne pour un repérage plus facile) afin de faire la correction puis refaire le "test"
Je peux, suivant le filtre, tout aussi bien avoir 10 lignes visibles que 250.
A noter que la ligne 1 sera toujours visible puisqu'elle contient les titres des colonnes
J'espère avoir été explicite.
Merci pour votre aide
Salut Snipper-Ice,
voyons si j'ai bien compris!
Tu reçois donc un tableau de X lignes et de X colonnes mais avec des lignes masquées et tu dois vérifier que TOUTES (?) les cellules visibles de chaque colonne soient bien identiques entre elles ?
Même si ce n'est pas essentiel, à quel genre de contenu avons-nous affaire?
Si tu as un fichier pour confirmer ou apporter des précisions, ce serait hautement apprécié!
A+
Bonjour curulis57.
Navré pour l'oubli du fichier.
Mais effectivement, tu as presque compris.
J'ai à faire à un "simple" tableau de 721 lignes et de 34 colonnes (max) qui recense, par colonne : le nom d'une baie, la "position" des connecteurs, les nom des câbles, les noms des boites, les adresses...
Ce n'est pas sur toutes les cellules que je dois comparer, mais uniquement dans certaines colonnes.
Exemple (après filtrage en colonne I, ce qui, entre nous soit dit, est une erreur de base,; vu l'usage habituel) :
- toutes mes cellules visibles de la colonne A doivent avoir la même valeur.
- toutes mes cellules visibles de la colonne B doivent avoir la même valeur.
- je ne contrôle pas les colonnes C - D & E
- toutes mes cellules visibles de la colonne F doivent avoir la même valeur.
- je ne contrôle pas (obligatoirement) les colonnes G- H
- toutes mes cellules visibles de la colonne I doivent avoir la même valeur (normal => colonne ou le filtre est appliqué).
Le but est de contrôler, quoi qu'il arrive, les colonnes A - E - F - I (et accessoirement les colonnes G & H pour encore plus de sécurité)
Je joint 2 fichiers d'exemple, tel que fournis, où le filtre est appliqué sur la colonne I (alors qu'il devrait être appliqué en colonne F puisque c'est le nom du câble que je cherche).
L'un à une erreur, (23 J. JAURES) l'autre pas (10 COLOMES)
Ensuite j'applique une mise en forme (couleur), un enregistrement dans un autre fichier *.xlsx et fait un export pdf (pour impression).
Mais ça je pense que je sais faire (peut-être pas pour la copie des cellules visibles seulement, avec la même mise en forme précédemment appliqué
Espérant avoir été plus "clair".
Merci pour le temps consacré
Salut.
Après quelques jours, je "up" quelque peu le sujet...
Bonjour,
Pas très clair tout çà...
Un début de proposition à étudier (Excel 2013+).
Cdlt.
Bonjour.
Merci Jean Eric pour ta participation.
Effectivement je ne dois pas être assez clair.
Personnellement, je ne comprends pas l'utilité de ce tableau croisé dynamique.
Je vais essayé d'expliquer encore plus simplement.
Je filtre mon tableau.
Je voudrais juste pouvoir contrôler, via une macro, que toute mes valeurs restantes et affichée dans la colonne I (ou K ou peu importe, mais dans une seule et unique colonne que je choisirai dans ma macro) sont bien identiques
Le résultat de la macro est "simple"
Si elle s'exécute sans détecter de différence, je passe à l'étape suivante (mise en forme).
Si elle détecte une erreur, fin de la macro
msgbox "erreur détectée en " & [reférence de la cellule]
exit sub.
Lorsque je reçois le tableau, il est préfiltré.
Je dois donc manuellement vérifier que les autres colonne "clés" contiennent bien une seule et même valeur identiques entre elles.
La colonne contrôlée sera souvent la même.
Les lignes différeront en fonction du filtre appliqué en I
Je ne sais pas comment expliquer plus simplement
Re,
Ton message a été lu par 34 personnes.
Quel est le nombre de réponses ?
ll est peut être le temps pour toi de reformuler correctement la question.
Cdlt.
Salut Snipper-Ice,
Bonjour l'équipe,
après quelques excursions dans d'autres projets et si j'ai bien compris... un petit bouton rouge à cliquer!
Tu encodes les colonnes à scanner séparées d'un '/' sans espace et tu vois ce que ça donne.
J'ai modifié des valeurs en colonne A et B pour tester!
Dim tTab
'
sScan = InputBox("Veuillez entrer les colonnes à scanner séparées par un '/' !", "Scanning", vbOK)
If sScan = "" Or IsNumeric(sScan) Then Exit Sub
tTab = Split(UCase(sScan), "/")
'
For x = 0 To UBound(tTab)
iRow = Range(tTab(x) & Rows.Count).End(xlUp).Row
iLig = 0
For y = 2 To iRow
If Rows(y).Hidden = False Then
Select Case iLig
Case 0
iLig = y
Case Else
If Range(tTab(x) & y) <> Range(tTab(x) & iLig) Then
sMsg = "Valeurs différentes : colonne " & tTab(x) & Chr(10) & Chr(10)
sMsg = sMsg & "Lignes : " & iLig & " (" & Range(tTab(x) & iLig) & ") - " & y & " (" & Range(tTab(x) & y) & ")"
MsgBox sMsg
Exit For
End If
iLig = y
End Select
End If
Next
NextBon travail!
A+
Edité...
Je vais tester curulis57.
Merci
Re tout le monde.
Merci à curulis57
Le code fonctionne à merveille.
Je l'ai adapté pour qu'il colle encore plus à l'utilisation (que vont en faire certains feignants)
Grâce à ça j'en ai appris encore plus que demandé
Option Explicit
Sub Color_ROP()
Dim x As Long, y As Long
Dim sMsg, tTab, iRow
Dim iLig As Long
'-*-*-*-
Range("A1").Select
'definition des colonnes A, E, F, G, H, I comme colonnes "Clé" à contrôler - A modifier si besoin
tTab = Split("A-E-F-G-H-I", "-")
For x = 0 To UBound(tTab)
iRow = Range(tTab(x) & Rows.Count).End(xlUp).Row
iLig = 0
'La ligne 1 étant la ligne des noms de colonne, on compte à partir de la suivante affichée, soit la 2, jusqu'à la dernière visible
For y = 2 To iRow
If Rows(y).Hidden = False Then
Select Case iLig
Case 0
iLig = y
Case Else
If Range(tTab(x) & y) <> Range(tTab(x) & iLig) Then
sMsg = "Valeurs différentes en colonne " & tTab(x) & Chr(10) & Chr(10)
sMsg = sMsg & tTab(x) & iLig & " => " & Range(tTab(x) & iLig) & Chr(10)
sMsg = sMsg & tTab(x) & y & " => " & Range(tTab(x) & y) & Chr(10) & Chr(10)
MsgBox sMsg & "Contrôlez, rectifiez et relancer le contrôle", vbCritical
Range(tTab(x) & y).Select
Exit Sub
End If
iLig = y
End Select
End If
Next
Next
MsgBox "Contrôle effectué" & Chr(10) & Chr(10) & "Aucune erreur détectée" & Chr(10) & "Poursuivons", vbInformationPour ma culture générale, je serais preneur des explications détaillée, même si j'ai compris les grandes lignes.
Encore une fois : grand merci.
Je caresse le doux espoir de pouvoir apporter ma contribution un jour