Recherche de variables différentes

Bonjour,

Je vous link mon fichier afin de vous expliquer mon problème.

8projet-test.xlsm (209.60 Ko)

Il y a 3 feuilles différentes. Une de base qui sert de référence. 2 autres à checker en opposition aux variables de la feuille de base.

Mon besoin était de créer un VBA qui va valider les "1" des 3 feuilles "31PLCheckbase" "31PLCheck1" "31PLCheck2". J'ai surligné en gris les valeurs à checker.

Mon programme me fait sélectionner la range à vérifier puis :

Lorsque les valeurs sont les mêmes -> Msg Box disant : Aucune erreur.

Lorsque les valeurs des 2 fichiers ne correspondent pas -> Msg Box disant : "Erreur..."

Le fichier identifie la cellule qui pose problème en la surlignant.

Le programme fonctionne. C'est-à-dire que lorsque les variables sont les mêmes : aucune erreur, c'est parfait. Lorsqu'il manque un "1" dans l'une des feuille, cela fonctionne également, il identifie la cellule manquante et la surligne en rouge.

Cependant, lorsque j'ajoute un "1" sur une des feuilles de check, le programme me définit qu'il y a une erreur dans les deux autres et surligne cette erreur dans les deux autres feuilles. Or, je souhaite que le programme se serve de la feuille de référence pour comparer aux deux autres. Si l'une des feuilles de check contient un 1 en trop, je souhaite qu'uniquement ce "1" de cette feuille soit surligné et non pas les deux autres ou il n'y a pas de "1".

Même problème lorsque je supprime intentionnellement un "1" de ma feuille de référence. Le programme me définit que l'erreur se trouve dans la feuille de référence et non pas dans les deux autres... J'ai essayé de résoudre ça par moi-même, malheureusement j'ai du mal à définir dans mon code que la sélection que je fais dans ma feuille de référence est bonne, et que l'erreur ou les erreurs se trouvent dans les deux autres.

Si vous souhaitez checker la macro, les 3 tableaux correspondent, donc pas d'erreur. Surligné en gris sont les valeurs à analyser. Vous pouvez essayer de modifier des "1" dans les tableaux pour comprendre ce qu'il se passe.

J'espère avoir été explicite, si vous pourriez m'aider ce serai sympa !

Merci d'avance.

Kilian.

Je vous Link le code histoire que ce soit plus clair et plus simple à quote.

Sub checkDifferences()
'définition variables
Dim sh As Worksheet

Dim dataTab() As Variant
Dim dataTabRef() As Variant

Dim rge As Range
Dim i As Integer
Dim j As Integer

Dim result As String
Dim errors As Integer
Dim totalErrors As Integer

'récupération de la plage à tester
On Error GoTo err
Set rge = Application.InputBox("", "Select the range to verify", , , , , , 8)
If rge.Cells.Count <= 1 Then
    GoTo err
End If
On Error GoTo 0

ReDim dataTabRef(1 To rge.Rows.Count, 1 To rge.Columns.Count)

'récupération de tous les tableaux de toutes les feuilles
For Each sh In ThisWorkbook.Sheets
    dataTab = sh.Range(sh.Cells(rge.Row, rge.Column), sh.Cells(rge.Row + rge.Rows.Count - 1, rge.Column + rge.Columns.Count - 1))

    'constitution du tableau de référence
    For i = 1 To UBound(dataTabRef, 1)
        For j = 1 To UBound(dataTabRef, 2)
            If dataTab(i, j) = 1 Then
                dataTabRef(i, j) = 1
            End If
        Next
    Next
Next

result = "Spotted errors :" & vbCrLf
totalErrors = 0

'Comparaison tableau de référence avec contenu des feuilles
For Each sh In ThisWorkbook.Sheets
    errors = 0
    For i = 1 To UBound(dataTab, 1)
        For j = 1 To UBound(dataTabRef, 2)
            'ajout colorcoding du résultat
            If dataTabRef(i, j) > sh.Cells(i + rge.Row - 1, j + rge.Column - 1) Then
                sh.Cells(i + rge.Row - 1, j + rge.Column - 1).Interior.Color = 255
                errors = errors + 1
            Else
                sh.Cells(i + rge.Row - 1, j + rge.Column - 1).Interior.Color = 12961221
            End If
        Next
    Next

    'décompte des erreurs repérées et complétion du rapport
    totalErrors = totalErrors + errors
    If errors > 0 Then
        result = result & vbCrLf & errors & " error on the sheet " & sh.Name
    End If
Next

'affichage du rapport
If totalErrors = 0 Then
    result = result & vbCrLf & "No error spotted :) !"
    MsgBox result, vbInformation, "Rapport"
Else
    MsgBox result, vbExclamation, "Rapport"
End If

Exit Sub
err:
MsgBox "Unvalide selection, select your range !", vbExclamation, "Error"
End Sub

J'ai vu une grosse erreur de conception. Dans ton tableau dataTab, il ne faut mettre que la feuille de base. C'est ce tableau que tu vas ensuite comparer aux feuilles suivantes. Je t'ai laissé en remarque ton code pour que tu puisses voir tes erreurs. Il y avait beaucoup plus simple, mais c'est un autre pb.

10projet-test.xlsm (209.07 Ko)

En faisant ta comparaison par rapport au tableau, il faudrait aussi envisager les "1" manquant. Donc <> serait mieux que >

Super ! Merci beaucoup pour votre réponse.

Oui effectivement j'avais prit en compte toutes les feuilles ce qui explique pourquoi mon tableau trouvait des erreurs dans la feuille de base quand je modifiais celle de check.

Et justement je reviens à ce que tu as dis en fin de message. Il faut également envisager les 1 manquants. Savez vous comment je pourrais stipuler différent au lieu de inférieur ?

Par ailleurs, je suis très curieux de savoir comment il était possible de faire plus simple ? Je pense simplement pas avoir le connaissance nécessaire me permettant de passer par autre chose...

A demain.

Peu de différences avec ton code dans l'ensemble.
- le tableau dataTab a disparu.
- la fonction Application.ScreenUpdating = False permet d'accélerer le traitement s'il y a de nombreuses feuilles ou une plage nettement plus grande.
- les variables x1, x2, y1 et y2 permettent d'avoir un code beaucoup plus court, donc facile à comprendre.
- s'il y a un "1" en plus ou en moins par rapport au tableau de base, l'erreur est signalée.

12projet-test.xlsm (209.55 Ko)

Bonsoir Optimix,

Merci beaucoup pour votre réponse et votre aide précieuse !

Rechercher des sujets similaires à "recherche variables differentes"