Problème boucle for

Bonjour,

Voici mon problème : Je voudrais faire une boucle for permettant d'exécuter certaine instruction pour la colonne T à partir de la ligne 2.

L'objectif est le suivant : Lorsque toute les valeurs pour une même ligne allant de la colonne D à S sont saisie je voudrais que au changement de cellule entre S et T, apparaissent dans la colonne T "OK" si toute les cellules situées dans l'intervalle sont verte ou "NOK" si une plusieurs cellules sont rouges.

Si "NOK" un msgbox indique de refaire les mesures sur la ligne suivante. A la fin de cette nouvelle ligne de mesure si toute les valeurs sont verte "OK", rien à faire de particulier si je n'es poursuivre le programme. Si encore rouge "NOK" msgbox "appeler le responsable".

PS : Je pense qu'utiliser le n° de produit colonne "C" est une bonne idée pour savoir si il s'agit d'un produit mesuré pour la première ou deuxième fois.

Un début de programme pour répondre à cette problématique, mais je ne comprend pas ce qui cloche...

Public Sub ValidateList(ByVal irow%)

    Dim Plage As Range
    Dim Cel As Range
    Dim I As Integer
    Dim Total As Integer

    With ActiveSheet: Set Plage = .Range(.Cells(3, 4), Cells(3, 19)): End With

    For Each Cel In Plage

        'I = I + 1

        'If Cel.Interior.ColorIndex = 4 Then Total = Total + 1

        'If Total <> I Then MsgBox "Mesure fausse, veuillez refaire les mesures !", vbCritical + vbOKOnly, "Validation des mesures"

    If Cel.Interior.ColorIndex = 4 Then

    MsgBox ("Mesure correcte")

    ActiveCell.Value = "OK"

    Else

    MsgBox ("Mesure fausse !")
    ActiveCell.Value = "NOK"

        End If

        Exit Sub

    Next Cel

End Sub

Fichier joint :

8programme-v.xlsm (49.55 Ko)

Merci d'avance

Bonjour,

Une piste. A mettre dans la procédure événementielle "Workbook_SheetSelectionChange()" :

'si colonne T
If Target.Column = 20 Then

    'appelle la Sub...
    Call ValidateList(Target.Row)

    '...puis inscrit par défaut OK dans la cellule de la colonne T
    Cells(ActiveCell.Row, 20).Value = "OK"

    'boucle
    For I = 4 To 19

        'si la couleur de la cellule en cours est différente de vert, NOK et fin !
        If Cells(ActiveCell.Row, I).Interior.ColorIndex <> 4 Then

            Cells(ActiveCell.Row, 20).Value = "NOK"
            Exit For

        End If

    Next I

End If

Bonjour et merci !

Cela répond parfaitement à la première partie de ma problématique ! Reste maintenant à réussir à identifier grace au N° de lot si le message qui apparait ( 1 er fois ) demande de remesurer tout le produit ou si (2nd fois) le message indique d'appeler un responsable.

Je vous tiens au courant des progrès merci beaucoup !

Comment différencies-tu la première mesure de la seconde ?

Dans l'idée de mémoriser si la mesure est la première ou non, on peut inscrire une valeur dans la cellule en colonne U avec le format ";;;" afin que la valeur ne soit pas visible dans la cellule :

'si colonne T
If Target.Column = 20 Then

    'appelle la Sub...
    Call ValidateList(Target.Row)

    '...puis inscrit par défaut OK dans la cellule de la colonne T
    Cells(ActiveCell.Row, 20).Value = "OK"

    'rétabli
    Cells(ActiveCell.Row, 21).Value = ""
    Cells(ActiveCell.Row, 21).NumberFormat = ";;;"

    'boucle
    For I = 4 To 19

        'si la couleur de la cellule en cours est différente de vert, NOK et fin !
        If Cells(ActiveCell.Row, I).Interior.ColorIndex <> 4 Then

            Cells(ActiveCell.Row, 20).Value = "NOK"

            With Cells(ActiveCell.Row, 21)

                .NumberFormat = ";;;" 'avec ce format la valeur n'est visible que dans la barre de formule

                'si la cellule en colonne U est vide, inscrit 1,
                'si elle n'est pas vide donc, seconde série de mesure message !
                If .Value = "" Then .Value = 1 Else MsgBox "Appeler-moi le directeur !"

            End With

            Exit For

        End If

    Next I

End If

Bonjour Theze,

T'as solution ne correspond pas, je m'explique : Comme tu le dis pour savoir si la série de mesure est la première je souhaite utiliser le N° de lot qui se situe en colonne "C".

La première fois que le produit est mesurer, le numéro de lot va apparaitre qu'une fois dans la colonne "C" mais si il faut mesurer à nouveau ce lot car à la fin message disant "Mesure incorrecte", je souhaite comparer le numéro de lot avec celui de la ligne précédente et si le numéro de lot et le même et que le résultat des mesures est toujours non satisfaisant alors cette fois le message sera " Appeler moi le directeur ! "

J'espère être clair ! merci d'avance

Bonjour,

De cette façon peut être ?

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    Dim I As Integer

    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

    If Target.Count > 1 Then Exit Sub

    Application.EnableEvents = False

    If Target = "" Then
        Call Position
    Else

    'si colonne T
    If Target.Column = 20 Then

        'appelle la Sub...
        Call ValidateList(Target.Row)

        '...puis inscrit par défaut OK dans la cellule de la colonne T
        Cells(ActiveCell.Row, 20).Value = "OK"

        'boucle
        For I = 4 To 19

            'si la couleur de la cellule en cours est différente de vert, NOK et fin !
            If Cells(ActiveCell.Row, I).Interior.ColorIndex <> 4 Then

                Cells(ActiveCell.Row, 20).Value = "NOK"

                    'contrôle la valeur de la cellule de la ligne active en colonne C avec la cellule du dessus
                    If Cells(ActiveCell.Row, 3).Value = Cells(ActiveCell.Row - 1, 3).Value Then MsgBox "Appeler-moi le directeur !"

                Exit For

            End If

        Next I

    End If

    End If

    Application.EnableEvents = True

End Sub

Bonjour,

Merci de votre réponse cela fonctionne parfaitement après une légère adaptation

Je cloture le sujet

Bonne journée

Bonjour,

Content de t'avoir aidé

Rechercher des sujets similaires à "probleme boucle"