Condition if capricieuse

Bonjour tout le monde

Je suis confronté à un problème des plus curieux

JE vous explique d'abord rapido sur quoi je bosse : il s'agit de traitement de données appliqué à des demandes d'interventions de maintenance. L'idée est que chaque semaine, je prend la liste des demandes faites, je la compare à la semaine précédente et je note les nouvelles interventions ainsi que les interventions faites.

Celles-ci se passent sur 6 zones différentes, et comme tout et normalisé et symétrique sur les tableaux excel, je procède toujours dans une boucle for qui passe de zone en zone en gros

DONC la où j'assiste à un miracle, c'est sur ces lignes là :

told(i)(lold(i)) = twspil(i).Cells(l, tcwspilavis(i)).Value
'.....un peu plus loin dans le code 
 If told(i)(j) = twspil(i).Cells(k, tcwspilavis(i)).Value Then

La première ligne correspond au moment où j'enregistre l'intervention comme une ancienne intervention, en enregistrant son numéro dans un tableau ( i désigne la zone, tcwspilavis(i) la colonne où sont les numéro de référence, twspil(i) la feuille excel qui contient toutes les interventions de la zone i)

Ensuite après plusieurs autres actions, je viens rechercher les numéros des anciennes interventions dans twsil(i) pour faire un copier coller de la ligne dans une autre feuille faite exprès pour ça .

Pour les 5 1ères zones, ça marche très bien, la condition If est validée quand il faut comme il faut et j'obtiens bien les feuilles remplies des anciennes interventions.

Pour la dernière zone, je sais pas pourquoi, quand il arrive à la condition If et que celle-ci doit être vérifiée, il la saute comme si elle ne l'était pas !!

J'ai utilisé des MsgBox pour vérifier les valeurs de part et d'autre de l'égalité, cela devrait bien marcher !! d'autant plus que quand je rentre leurs valeurs, la syntaxe est la même, et cela marche pour les autres zones qui sont écrites de la même manière !!!

Aidez moi, je vais devenir fou là je ne saisis vraiment pas l'origine de l'erreur !

J'espère avoir été assez clair, c'est vraiment ardu d'expliquer son problème quand le code se décline en plein de modules différents

Bonjour,

tu pourrais au moins mettre les lignes complètes...

C'est quoi cette syntaxe : told(i)(j) ???

Jamais vu ça. C'est sensé donner quoi ? il n'y a pas d'opérateur entre entre told(i) et (j).

Ce n'est pas plutôt told(i,j) que tu voudrais ?

Je suis même surpris que tu n'aies pas d'erreur. Tu ne mettrais pas la poussière sous le tapis avec un On Error Resume Next des fois?

De toute façon sans fichier de tests et des explications ça risque de ne pas aller loin.

eric

Désolé mon code étant long et en plusieurs modules je ne voulais pas vous ettoufer inutilement, mais je n'ai apparemment pas réussi à être compréhensible sans !

Avant même de la donner, j'explique mon told(i)(j) : j'ai créé des tableaux Integer told1, told2, etc et ensuite un Array told qui prenait (told1, told2,etc) Cela permet de créer des tableaux de tableaux

Je joins plus bas les 2 modules liés à ma question : le 1er est celui ou je crée mes tableaux told(i)(j) et le 2ème où je cherche à tester leur égalité avec la feuille d'où je les ai extraits

Je précise : les interventions dont je parle sont nommées ici des ZA

For i = 1 To 6

        'mise en forme de l'en-tête
        iold = 1
        twsmacro(i).Activate
        Cells(tlwsmacro(i) + 3, 1).Select
        ActiveCell.FormulaR1C1 = "ZA closes dans la semaine :"
        Selection.Font.Bold = True
        Selection.Font.Underline = xlUnderlineStyleSingle
        Selection.Font.Size = 12

            'parcours des ZA closes
            For j = 1 To lold(i)

                'parcours des ZA pour trouver la ligne à copier
                For k = iold + 1 To tlwspil(i)

                    If told(i)(j) = twspil(i).Cells(k, tcwspilavis(i)).Value Then  
                        twspil(i).Activate
                        twspil(i).Rows(k).Select
                        Selection.Copy
                        twsmacro(i).Activate
                        twsmacro(i).Rows(j + tlwsmacro(i) + 5).Select
                        Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, _
                                               SkipBlanks:=False, Transpose:=False
                        Application.CutCopyMode = False
                        iold = k
                        Exit For

                    End If

                Next k

            Next j

    Next i
'L'algorithme est construit ainsi :
    '   On se place dans une Zone (1ère boucle for --> i ), on parcourt le tableau de ZA extraites de la semaine (2ème boucle for --> j ).
    '   On utilise alors 2 curseurs : ipreza et k (3ème boucle for). Pour une ZA à analyser (pointée par j),
    '    on parcourt la feuille de ZA de la zone correspondante dans le classeur Pil. Maint. :
    '    ipreza contient le n° d'avis le dernier comparé pour la ZA précédemment analysée (j-1) et k celui en train d'être comparé.
    '   Ainsi, si il y a correspondance, on sait que les ZA entre ipreza et k sont des ZA closes.
    '   De même, si ipreza vaut la dernière ZA à comparer, alors toutes les ZA suivantes à analyser sont nouvelles.
    '   On peut enfin égaliser ipreza et inextza pour la prochaine ZA à analyser (j+1)

    'parcours sur les 6 zones
    For i = 1 To 6
        lnew(i) = 1
        lold(i) = 1
        ipreza = 1

        For j = 2 To tlwsmacro(i)

            'Cas où on est au bout du tableau de ZA à comparer --> la ZA analysée est forcément nouvelle
            If ipreza = tlwspil(i) Then
                tnew(i)(lnew(i)) = twsmacro(i).Cells(j, cmacroavis).Value
                lnew(i) = lnew(i) + 1
                twsmacro(i).Cells(j, cmacrodesc).Select
                With Selection.Interior
                    .Pattern = xlSolid
                    .PatternColorIndex = xlAutomatic
                    .Color = 15773696
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With

            'Sinon il reste des ZA à comparer entre ipreza et la fin du tableau
            Else

                For k = ipreza + 1 To tlwspil(i)

                    'Si on trouve une ZA déjà existente qui correspond
                    If twsmacro(i).Cells(j, cmacroavis).Value = twspil(i).Cells(k, tcwspilavis(i)).Value Then
                        twspil(i).Activate
                        twspil(i).Rows(k).Select
                        Selection.Copy
                        twsmacro(i).Activate
                        twsmacro(i).Rows(j).Select
                        Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, _
                                               SkipBlanks:=False, Transpose:=False
                        Application.CutCopyMode = False

                        'si il y en a entre la ZA correspondante et la dernière précédemment comparée
                        If ipreza + 1 < k Then
                            For l = ipreza + 1 To k - 1
                                told(i)(lold(i)) = twspil(i).Cells(l, tcwspilavis(i)).Value
                                lold(i) = lold(i) + 1
                            Next l
                        End If

                        ipreza = k
                        Exit For

                    'Sinon si on trouve une ZA à comparer de n° d'avis supérieur à la ZA analysée
                    ElseIf twsmacro(i).Cells(j, cmacroavis).Value < twspil(i).Cells(k, tcwspilavis(i)).Value Then

                        If ipreza + 1 < k Then
                            For l = ipreza + 1 To k - 1
                                told(i)(lold(i)) = twspil(i).Cells(l, tcwspilavis(i)).Value
                                lold(i) = lold(i) + 1
                            Next l
                            ipreza = k - 1

                        ElseIf ipreza + 1 = k Then
                            tnew(i)(lnew(i)) = twsmacro(i).Cells(j, cmacroavis).Value
                            lnew(i) = lnew(i) + 1
                            twsmacro(i).Activate
                            twsmacro(i).Cells(j, cmacrodesc).Select
                            With Selection.Interior
                                .Pattern = xlSolid
                                .PatternColorIndex = xlAutomatic
                                .Color = 15773696
                                .TintAndShade = 0
                                .PatternTintAndShade = 0
                            End With
                            ipreza = k - 1

                        End If

                        Exit For

                    'Sinon si on arrive à la dernière ZA à comparer
                    ElseIf k = tlwspil(i) Then
                        For l = ipreza + 1 To k
                            told(i)(lold(i)) = twspil(i).Cells(l, tcwspilavis(i)).Value
                            lold(i) = lold(i) + 1
                        Next l

                        tnew(i)(lnew(i)) = twsmacro(i).Cells(j, cmacroavis).Value
                        lnew(i) = lnew(i) + 1
                        twsmacro(i).Cells(j, cmacrodesc).Select
                        With Selection.Interior
                            .Pattern = xlSolid
                            .PatternColorIndex = xlAutomatic
                            .Color = 15773696
                            .TintAndShade = 0
                            .PatternTintAndShade = 0
                        End With

                        ipreza = k

                    End If

                Next k

            End If

        Next j

        lnew(i) = lnew(i) - 1
        lold(i) = lold(i) - 1
    Next i

Merci pour la réponse

Bonjour,

Je ne me vois pas construire un classeur pour essayer de tester.

De plus tu as déjà eu un grand nombre de réponses et suggestions sur d'autres forums.

eric

Je n'ai trouvé aucune réponse sur les forums pour trouver la source de mon problème, mais j'ai réussi à le contourner : je met donc pour ceux qui auraient des problèmes similaires ce qui m'a sauvé :

If twsmacro(i).Cells(j, cmacroavis).Value = twspil(i).Cells(k, tcwspilavis(i)).Value Then

est devenu

If told(i)(j) = Val(twspil(i).Cells(k, tcwspilavis(i))) Then 

Il semblerait que l'utilisation de la méthode val règle le problème, peut-être en uniformisant le type de donnée fourni en sortie ?

En tout cas cela m'a bien servi.

Je n'ai trouvé aucune réponse sur les forums

Si tu regardais les réponses apportées à TA question.

Le poster en simultané sur plusieurs forums est rarement bien vu, mais si en plus tu ne sais plus où tu as posté...

Un ou deux te donnent une méthode alternative, un autre t'explique très bien pourquoi ton système ne fonctionnait pas.

Et même pas un retour de ta part...

eric

Ne t'inquiètes pas, ils m'ont effectivement donné toutes les réponses que j'attendais, et je les en ai remercié comme il se doit !

J'avoue ne pas voir le problème à poster sur plusieurs sites, je me permet de faire appel à la connaissance du plus grand monde , ce site là ne rassemble pas toute la communauté à elle seule.

Sur ce, merci quand même de tes réponses, cela reste du temps que tu m'as accordé, bien que c'était plus souvent pour vouloir m'apprendre la vie à grand renfort de que de me répondre

J'avoue ne pas voir le problème à poster sur plusieurs sites

Plutôt que de perdre du temps à te l'expliquer comme tu m'en as déjà fait perdre alors que tu avais déjà toutes tes réponses ailleurs, je t'ajoute tout simplement à ma liste noire pour éviter tes questions.

Ca t'éclairera peut-être un peu

eric

Bonjour MobyKDIK,

Comme te l'a expliqué Eriiic, poster sur plusieurs forum est vraiment une pratique à éviter (si tu poses ta question sur d'autres forums, merci de ne pas la poser sur celui-ci à l'avenir par respect pour ceux qui prennent du temps pour t'aider).

Je verrouille.

Cordialement,

Rechercher des sujets similaires à "condition capricieuse"