Erreur execution variable tableau

Bonjour a tous .

j'ai un problème d’exécution d'une procédure qui en fait qu'a sa tête (surement une erreur de ma part)

module Verifier => procédure depassement

en comparant les cellules des colonnes (E,I,G) de la feuil 2 et les cellules de la colonne (G) de la feuil 1

dans l’hypothèse que:

le numéro de ligne est i

la feuil1 est sh1

la feuil2 est sh2

si sh1.("G" & i) < ( sh2.("E" & i) + sh2.("I" & i) + sh2.("G" & i) ) alors

écrire dans cellule sh1("K" & i) le message "dépassement de l'AUT1"

le problème est que la petite procédure le fait pour tout les lignes de la feuil1 mais uniquement si la dernière valeur que peut prendre la variable i correspond a la condition ci-dessus cité et si ce n'est pas le cas la procédure ignore toutes les autres lignes

comment puis-je y remédier SVP ? Merci

10incomprehensible.xlsm (449.11 Ko)

Bonjour,

Déjà, commence par définir et nommer tes variables correctement

Ensuite je ne vois pas pourquoi créer et mémoriser un tableau, tu ne t'en sers apparemment pas par la suite

Sub depassement()
  ' il faut définir et nommer ses variables comme il faut
  ' Comme ça on sait ;-)
  Dim Lig As Long, DLig As Long
  Dim Ind As Long

  Set sh2 = Sheets("Feuil2")
  Set sh1 = Sheets("Feuil1")
  ' Désactiver les évènements lorsqu'on inscrit quelque chose
  Application.EnableEvents = False
  'ce bloc (je pense lol) ne fait pas exactement ce que j'attend de lui
  DLig = sh1.Cells(sh1.Rows.Count, 3).End(xlUp).Row
  For Lig = 2 To DLig
    For Ind = 0 To Lig - 2
      ReDim tab1(Ind, 3)
      tab1(Ind, 0) = sh2.Range("E" & Lig)
      tab1(Ind, 1) = sh2.Range("G" & Lig)
      tab1(Ind, 2) = sh2.Range("I" & Lig)
      tab1(Ind, 3) = sh1.Range("G" & Lig)

      If tab1(Ind, 0) + tab1(Ind, 1) + tab1(Ind, 2) > tab1(Ind, 3) Then
        sh1.Range("K" & Lig).Value = "Alerte dépassement AUT1"
        If sh1.Range("I" & Lig).Value = "" Then
          sh1.Range("I" & Lig).Value = "Recu"
          sh1.Range("J" & Lig).Value = "Auto-O.V !!!"
        End If
      End If
    Next
    'jusque la!
    If sh1.Range("K" & Lig).Value <> "" Then
      sh1.Range("K:K").EntireColumn.Hidden = False
    Else
      sh1.Range("K:K").EntireColumn.Hidden = True
    End If
  Next
  ' Réactiver les évènements
  Application.EnableEvents = True
End Sub

A+

Merci de t'y avoir intéressé Mr BrunoM45

mais malheureusement le résultat est toujours le même si dans mon exemple le cellule

G9 de la feuil1 n'est pas inférieur a la somme des cellule E9+G9+I9 de la feuil2 la procédure ne prend toujours pas en compte les autres cellule dont le numéro de ligne et moins que 9

j'ai testé et ça reste exactement le même résultat qu'avec les variable que j'avais déclaré comme étant i% j% n%

ca a fonctionné chez toi tout en ayant la valeur de la dernier ligne plus grosse que la somme des cellule dans la feuil2 ?

Bonjour Addou,

addou a écrit :

Merci de t'y avoir intéressé Mr BrunoM45

mais malheureusement le résultat est toujours le même si dans mon exemple le cellule

G9 de la feuil1 n'est pas inférieur a la somme des cellule E9+G9+I9 de la feuil2 la procédure ne prend toujours pas en compte les autres cellule dont le numéro de ligne et moins que 9

Je pense que tu veux rire, non

Et ça sert à quoi la ligne

For Lig = 2 To DLig

Ton ancien code ne prenait pas en compte la ligne mais l'indice du tableau

sérieusement je ne comprend vraiment pas c'est exactement le mème problème qui persiste

Sub depassement()
Dim sh1 As Worksheet, sh2 As Worksheet, i%, j%, n%, tab1()
Set sh2 = Sheets("Feuil2")
Set sh1 = Sheets("Feuil1")
With sh1

'ce bloc (je pense lol) ne fait pas exactement ce que j'attend de lui

    n = .Cells(.Rows.Count, 3).End(xlUp).Row
         For i = 2 To n
             For j = 0 To i - 2
                ReDim tab1(j, 3)
                tab1(j, 0) = sh2.Range("E" & j + 2)
                tab1(j, 1) = sh2.Range("G" & j + 2)
                tab1(j, 2) = sh2.Range("I" & j + 2)
                tab1(j, 3) = sh1.Range("G" & j + 2)

                If tab1(j, 0) + tab1(j, 1) + tab1(j, 2) > tab1(j, 3) Then
                sh1.Range("K" & j + 2).Value = "Alerte dépassement AUT1"
                    If sh1.Range("I" & j + 2).Value = "" Then
                        sh1.Range("I" & j + 2).Value = "Recu"
                        sh1.Range("J" & j + 2).Value = "Auto-O.V !!!"
                    End If
                End If
            Next

'jusque la!

                If sh1.Range("K" & i).Value <> "" Then
                    sh1.Range("K:K").EntireColumn.Hidden = False
                Else
                    sh1.Range("K:K").EntireColumn.Hidden = True
                End If
        Next
End With

End Sub

c'est la méme histoire avec

for i = 2 to n
     for j = i to i - 2

et c'est ce qui me bloc ici !

j'ai enlevé la variable " j " pour rendre la boucle plus souple , mais le résultat est toujours le même S.V.P des idées

    Sub depassement()
Set sh2 = Sheets("Feuil2")
Set sh1 = Sheets("Feuil1")
Dim sh1 As Worksheet, sh2 As Worksheet, i%, n%
Dim tab1()
With sh1
'ce bloc (je pense lol) ne fait pas exactement ce que j'attend de lui

    n = .Cells(.Rows.Count, 3).End(xlUp).Row
         For i = 2 To n

                ReDim tab1(i - 2, 3)
                tab1(i - 2, 0) = sh2.Range("E" & i)
                tab1(i - 2, 1) = sh2.Range("G" & i)
                tab1(i - 2, 2) = sh2.Range("I" & i)
                tab1(i - 2, 3) = sh1.Range("G" & i)

                If tab1(i - 2, 0) + tab1(i - 2, 1) + tab1(i - 2, 2) > tab1(i - 2, 3) Then
                sh1.Range("K" & i).Value = "Alerte dépassement AUT1"
                    If sh1.Range("I" & i).Value = "" Then
                        sh1.Range("I" & i).Value = "Recu"
                        sh1.Range("J" & i).Value = "Auto-O.V !!!"
                    End If
                End If

'jusque la!

                If sh1.Range("K" & i).Value <> "" Then
                    sh1.Range("K:K").EntireColumn.Hidden = False
                Else
                    sh1.Range("K:K").EntireColumn.Hidden = True
                End If
        Next
End With

End Sub

?

Bonjour,

Supprime ton tableau, comme te l'a suggéré Bruno dès le départ... !

Cordialement.

voila comme suggéré mais ca persiste c'est pas normal !!!

Sub depassement()
Dim sh1 As Worksheet, sh2 As Worksheet, i%, n%
Set sh2 = Sheets("Feuil2")
Set sh1 = Sheets("Feuil1")
With sh1

    n = .Cells(.Rows.Count, 3).End(xlUp).Row
         For i = 2 To n
                If sh2.Range("E" & i).Value + sh2.Range("G" & i).Value + sh2.Range("I" & i).Value > sh1.Range("G" & i).Value Then
                sh1.Range("K" & i).Value = "Alerte dépassement AUT1"
                    If sh1.Range("I" & i).Value = "" Then
                        sh1.Range("I" & i).Value = "Recu"
                        sh1.Range("J" & i).Value = "Auto-O.V !!!"
                    End If
                End If

                If sh1.Range("K" & i).Value <> "" Then
                    sh1.Range("K:K").EntireColumn.Hidden = False
                Else
                    sh1.Range("K:K").EntireColumn.Hidden = True
                End If
        Next
End With

End Sub

Bon ! Commençons par indenter correctement ta dernière procédure, pour la rendre lisible à mes yeux !!

Sub depassement()
    Dim sh1 As Worksheet, sh2 As Worksheet, i%, n%
    Set sh2 = Sheets("Feuil2")
    Set sh1 = Sheets("Feuil1")
    With sh1
        n = .Cells(.Rows.Count, 3).End(xlUp).Row
        For i = 2 To n
            If sh2.Range("E" & i).Value + sh2.Range("G" & i).Value + sh2.Range("I" & i).Value _
             > sh1.Range("G" & i).Value Then
                sh1.Range("K" & i).Value = "Alerte dépassement AUT1"
                If sh1.Range("I" & i).Value = "" Then
                    sh1.Range("I" & i).Value = "Recu"
                    sh1.Range("J" & i).Value = "Auto-O.V !!!"
                End If
            End If
            If sh1.Range("K" & i).Value <> "" Then
                sh1.Range("K:K").EntireColumn.Hidden = False
            Else
                sh1.Range("K:K").EntireColumn.Hidden = True
            End If
        Next
    End With
End Sub

J'ai juste réindenté, sans modifier un seul mot.

Petit examen... La mise sous bloc With de sh1 : très bien ! mais mieux de le faire effectivement ! Là tu n'as rien fait : juste mise en mémoire d'une référence d'objet que tu n'utilises pas ! L'utiliser, c'est faire disparaître toute mention de sh1 à l'intérieur du bloc : les expressions se référant à sh1 commencent par un point, ainsi la mise sous bloc devient utile réduit légèrement ton code et rend plus rapide son exécution...

Boucle sur les lignes : tu agis selon un premier test, qui concerne la ligne, OK jusqu'ici, mais suit un second test qui selon son résultat va te faire masquer ou non la colonne K... et tu vas la masquer ou démasquer une fois par ligne ! C'est peut-être beaucoup et pas très utile ! Si l'on considère que tu veux la masquer si elle ne contient pas d'alerte, il faut simplement mémoriser la présence ou non d'alerte et le faire une seule fois à la fin, on gagnera du temps.

Apportons ces petites rectifications et voyons le résultat :

Sub depassement()
    Dim sh1 As Worksheet, sh2 As Worksheet, i%, n%, masK As Boolean
    Set sh2 = Sheets("Feuil2")
    Set sh1 = Sheets("Feuil1")
    With sh1
        n = .Cells(.Rows.Count, 3).End(xlUp).Row
        For i = 2 To n
            If sh2.Range("E" & i).Value + sh2.Range("G" & i).Value + sh2.Range("I" & i).Value _
             > .Range("G" & i).Value Then
                .Range("K" & i).Value = "Alerte dépassement AUT1"
                masK = True
                If .Range("I" & i).Value = "" Then
                    .Range("I" & i).Value = "Recu"
                    .Range("J" & i).Value = "Auto-O.V !!!"
                End If
            End If
        Next i
        .Columns("K").Hidden = masK
    End With
End Sub

Que fait cette procédure ? Elle dimensionne les données de Feuil1 sur la colonne C et initie une boucle sur les ligne de données de Feuil1 de la ligne 2 à la dernière. A chaque ligne, elle compare la somme des valeurs des colonnes E, G et I de la même ligne de Feuil2 à la valeur de la colonne G de Feuil1 : si la somme Feuil2 est supérieure à la valeur G Feuil1, un message d'alerte est placé sur la ligne en K.

(Accessoirement, on a introduit une variable booléenne que l'on passe à True si la condition est satisfaite.)

Si la condition est satisfaite, on regarde également si la colonne I est vide et si c'est le cas on porte deux mentions, en I et J...

Cette boucle va se dérouler sur toutes les lignes, on ne voit pas ce qui pourrait l'arrêter

(A la fin, on définit la valeur Hidden (masquée) de la colonne K sur la valeur de la variable booléenne vue plus haut.)

Quel problème cela pose ?

Cordialement.

Bonsoir Mr MFerrand

Merci de vous intéressé a mon cas et surtout merci infiniment pour tout ce que je peut apprendre a vos coté

j'ai modifié un seul point dans votre code pour que cela fonction parfaitement pour toutes les lignes de ma Feuil1

masK = False

sauf que maintenant la colonne "K" n'est pas masquée automatiquement s'il n'y a aucune valeur comment puis je y remédier ?

au final j'ai carrément enlevé la variable boolean et j'ai rajouté une autre variable integer ce qui a donné ce code qui marche parfaitement

    Sub depassement()
        Dim sh1 As Worksheet, sh2 As Worksheet, i%, n%, x%
        Set sh2 = Sheets("Feuil2")
        Set sh1 = Sheets("Feuil1")
        With sh1
            n = .Cells(.Rows.Count, 3).End(xlUp).Row
            x = 0
            For i = 2 To n
                If sh2.Range("E" & i).Value + sh2.Range("G" & i).Value + sh2.Range("I" & i).Value _
                 > .Range("G" & i).Value Then
                    .Range("K" & i).Value = "Alerte dépassement AUT1"
                    x = x + 1
                    If .Range("I" & i).Value = "" Then
                        .Range("I" & i).Value = "Recu"
                        .Range("J" & i).Value = "Auto-O.V !!!"
                    End If
                End If
            Next i
                If x > 0 Then
                    .Range("K:K").EntireColumn.Hidden = False
                Else
                    .Range("K:K").EntireColumn.Hidden = True
                End If
        End With
    End Sub

je reste preneur si vous voyez une meilleur manière de procéder et cela dans le but de toujours apprendre plus afin de m’améliorè

en tout cas je remercie plus qu'infiniment tout ceux qui se sont intéresser a mon sujet

Ah oui ! J'ai inversé les valeurs !

Mais dans ce cas il faut la définir à True en début de procédure (par défaut une variable booléenne est à False).

Mais je ne comprends pas que tu la supprimes : Hidden a une valeur booléenne, avec une variable qui prend la valeur qu'on veut lui donner, on n'a plus qu'à le faire en une ligne à la fin, sans besoin de tester à nouveau.

Cordialement.

Rechercher des sujets similaires à "erreur execution variable tableau"