XL 2016 (RESOLU) Macro verification donnees machine

darkjedi

XLDnaute Nouveau
Bonjour à tous,

Cela fait bien longtemps que je n'ai plus écrit de code vba.
Aujourd'hui, je me retrouve bloqué par un point qui vous paraitra certainement facile à résoudre.
Mais je n'ai pas de solution à celui-ci.
Je joins un fichier excel simplifié car il y énormément de macros derrière ce fichier.
Voici mon problème:
Dans la case I1, j’ai la référence du prétraitement de mes données.
Dans les colonnes F, j'ai les références de mes contrôles
Dans la colonne G se sont les résultats machine.
Dans la colonne I2 et suivantes : information traitement données
Le tableau A14/ E17 sont mes valeurs de temoins avec le nom de la matrice le nom de chaque contrôle la valeur cible et les limites à ne pas franchir.

En vba est-il possible de vérifier ceci:
1) En tenant compte de I1, je vais vérifier pour chaque contrôle que la valeur machine est bien comprises dans les bornes défini dans le tableau des témoins sélectionné.
Si tel n'est pas le cas, inscrire dans la colonne I "hors limite" - contrôle A dans mon exemple
2) Pour chaque paire de témoins de contrôle vérifier que les valeurs ne dépassent pas un écart de 0.3 - contrôle C dans mon exemple
3) Vérifier que tous les contrôles sont par 2 et non individuel - contrôle D dans mon exemple.

Merci à vous pour ce coup de main car là je bloque totalement.

Voici le bout de code pour la vérification des contrôles par rapport à la valeur cible mais cela ne fonctionne pas car la boucle me sort une erreur "indice n'appartenant pas à la sélection"
De plus, si la valeur est hors limite, cela ne s'inscrit pas dans la colonne I

VB:
Option Explicit
Dim tabTemoin As Variant
Dim tabControleSerie As Variant
Dim n As Integer
Dim m As Integer
Dim typeControle As String
Dim dernLigneSerie As Long
Dim dernLigneTemoin As Long

Sub VerifValCible()

    'Type de serie à traiter
    typeControle = Sheets("Feuil1").Range("I1")
    'definition tableau SERIE
    dernLigneSerie = Range("F" & Rows.Count).End(xlUp).Row
    tabControleSerie = Sheets("Feuil1").Range("F2:I" & dernLigneSerie)
 
    'boucle de verification
    Select Case typeControle
        'C13
        Case "C13"
            'definition tableau temoin
            dernLigneTemoin = Range("A" & Rows.Count).End(xlUp).Row
            tabTemoin = Sheets("Feuil1").Range("A14:E" & dernLigneTemoin)
            'boucle verification des temoins serie avec valeur temoins
            For m = LBound(tabControleSerie, 1) To UBound(tabControleSerie, 1)
                For n = LBound(tabTemoin, 1) To UBound(tabTemoin, 1)
                    If tabControleSerie(n, 1) = tabTemoin(m, 2) Then
                        If Abs(tabTemoin(m, 4)) < Abs(tabControleSerie(n, 2)) < Abs(tabTemoin(m, 3)) Then
                            tabControleSerie(n, 4) = "hors limite"
                        End If
                    End If
                Next n
            Next m
    End Select
End Sub
 

Pièces jointes

  • TEST SMRI-code moyenne.xlsm
    18.7 KB · Affichages: 5
Dernière édition:

darkjedi

XLDnaute Nouveau
Bonjour,
A force de persévérance, j'ai réussi à résoudre mon problème.
Voici le code en question si cela peut aider avec des variables tableaux ainsi que la pièce jointe:
Bonne soirée à tous.
Je n'ai pas le lien "Marquer comme solution" en bas du post
VB:
Option Explicit

Dim tabTemoin() As Variant
Dim tabControleSerie() As Variant
Dim n As Integer
Dim m As Integer
Dim typeControle As String
Dim dernLigneSerie As Long
Dim dernLigneTemoin As Long
Dim controleSerie As Boolean

Sub VerifValCible()

    'Type de serie à traiter
    typeControle = Sheets("Feuil1").Range("I1")
    'definition tableau SERIE
    dernLigneSerie = Range("F" & Rows.Count).End(xlUp).Row
    tabControleSerie = Sheets("Feuil1").Range("F2:J" & dernLigneSerie).Value
   
    'boucle de verification
    Select Case typeControle
        'C13
        Case "C13"
            'definition tableau temoin
            dernLigneTemoin = Range("A" & Rows.Count).End(xlUp).Row
            tabTemoin = Sheets("Feuil1").Range("A2:E" & dernLigneTemoin).Value
            'boucle verification des temoins serie avec valeur temoins
            For m = LBound(tabControleSerie, 1) To UBound(tabControleSerie, 1)
                For n = LBound(tabTemoin, 1) To UBound(tabTemoin, 1)
                    If tabControleSerie(m, 1) = tabTemoin(n, 2) Then
                        controleSerie = False
                        If tabControleSerie(m, 2) <= tabTemoin(n, 4) And tabControleSerie(m, 2) >= tabTemoin(n, 5) Then
                                controleSerie = True
                        End If
                        If controleSerie = False Then
                            tabControleSerie(m, 4) = "hors limite"
                        End If
                    End If
                Next n
            Next m
           
            'Transfère les éléments du tableau dans la feuille de calcul
            Sheets("Feuil2").Range("A3").Resize(UBound(tabControleSerie, 1), UBound(tabControleSerie, 2)) = tabControleSerie
       
        Case "O18"
            'definition tableau temoin
            dernLigneTemoin = Range("K" & Rows.Count).End(xlUp).Row
            tabTemoin = Sheets("Feuil1").Range("K2:O" & dernLigneTemoin).Value
            'boucle verification des temoins serie avec valeur temoins
            For m = LBound(tabControleSerie, 1) To UBound(tabControleSerie, 1)
                For n = LBound(tabTemoin, 1) To UBound(tabTemoin, 1)
                    If tabControleSerie(m, 1) = tabTemoin(n, 2) Then
                        controleSerie = False
                        If tabControleSerie(m, 2) <= tabTemoin(n, 4) And tabControleSerie(m, 2) >= tabTemoin(n, 5) Then
                                controleSerie = True
                        End If
                        If controleSerie = False Then
                            tabControleSerie(m, 4) = "hors limite"
                        End If
                    End If
                Next n
            Next m
           
            'Transfère les éléments du tableau dans la feuille de calcul
            Sheets("Feuil2").Range("F3").Resize(UBound(tabControleSerie, 1), UBound(tabControleSerie, 2)) = tabControleSerie
    End Select
   
End Sub
 

Pièces jointes

  • TEST SMRI-verif ValeurCible.xlsm
    22.8 KB · Affichages: 6
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour et merci pour ce retour de fil dans lequel nous vous avons laissé bien seul.

En échange et si je peux me permettre voici une réécriture à la sauce 'Roblochon' de votre macro.

VB:
Sub TestValCible()
    Dim tabTemoin As Variant, tabControleSerie As Variant
    Dim n As Long, m As Long, derLigne As Long
    Dim destination As Range

    With ThisWorkbook.Sheets("Feuil1")

        derLigne = .Range("F" & Rows.Count).End(xlUp).Row
        tabControleSerie = .Range("F2:J" & derLigne).Value
        '
        '
        ' Initialisation des variables selon le cas
        '
        ' tabTemoin pourrait l'être comme ceci :
        '   tabTemoin = .Range("A2:E" & .Range("A" & Rows.Count).End(xlUp).Row).Value
        '
        Select Case .Range("I1")

        Case "C13"
            dernLigne = .Range("A" & Rows.Count).End(xlUp).Row
            tabTemoin = .Range("A2:E" & derLigne).Value
            Set destination = Sheets("Feuil2").Range("A3")

        Case "O18"
            dernLigne = .Range("k" & Rows.Count).End(xlUp).Row
            tabTemoin = .Range("K2:O" & derLigne).Value
            Set destination = Sheets("Feuil2").Range("F3")

        End Select
        '
        ' Si tabTemoin et destination ont été initialisés
        If IsArray(tabTemoin) And Not destination Is Nothing Then
            For m = LBound(tabControleSerie, 1) To UBound(tabControleSerie, 1)
                For n = LBound(tabTemoin, 1) To UBound(tabTemoin, 1)
                    If tabControleSerie(m, 1) = tabTemoin(n, 2) Then
                        If Not (tabControleSerie(m, 2) <= tabTemoin(n, 4) And tabControleSerie(m, 2) >= tabTemoin(n, 5)) Then
                            tabControleSerie(m, 4) = "hors limite"
                        End If
                    End If
                Next n
            Next m
            destination.Resize(UBound(tabControleSerie, 1), UBound(tabControleSerie, 2)) = tabControleSerie
        End If
    End With
End Sub

On pourrait encore quelque peu simplifier, mais c'est au risque de perdre en llisibilité.

Cordialement
 

darkjedi

XLDnaute Nouveau
Bonjour @Roblochon,

C'est en faisant que l'on apprend. C'est la meilleure école que je connaisse.
J'ai découvert les variables tableau qui font gagner en rapidité grâce à ce forum.
Il y a de nombreux thèmes abordés. Cela apporte d'autres éclairage et cela permet d'avancer. Donc même si j'étais sur mon fil, c'est grâce au forum en partie que j'ai solutionné mon problème.

Merci pour le code.:)
Je prendrais le temps ce week-end de l'expérimenter et je ferais un retour. Il sera certainement plus rapide que le mien. J'en suis certain.
 

Statistiques des forums

Discussions
314 656
Messages
2 111 610
Membres
111 221
dernier inscrit
Odré