Verification données
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.
Le tableau A13/ E21 sont mes valeurs de contrôles 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 contrôles. 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 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 - controle D dans mon exemple.
Merci à vous pour ce coup de main car là je bloque totalement.
JF
Voici le code qui me sert à faire les moyennes pour des echantillons.
le premier fichier était incomplet.
'**********************************
'EFFECTUER LA MOYENNE AVEC SSTOTAL
'**********************************
Sub FaireSousTotaux(Rg As Range, colonneCle As Integer, ParamArray colonnesMoyenne())
'Permet d'agreger les lignes
'Paramètres :
'- rg : zone à traiter
'- colonneCle : colonne de référence où l'on évite les doublons
'- colonnesMoyenne() : liste des colonnes qu'il faut moyenner
'arret MAJ ecran définition du mode calcul
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'Set dic = New Dictionary 'La collection qui va contenir la correspondance identifiant ligne
Set dic = CreateObject("Scripting.Dictionary")
'definir le nombre de ligne à traiter
nbRows = Rg.Rows.Count
i = 1
DebutBoucle:
'Boucle pour calcul de la moyenne sur le tableau selectionné
Do While i <= nbRows
cle = Rg.Cells(i, colonneCle)
'On regarde si le produit existe déjà
If dic.Exists(cle) Then
'S'il existe, ajouter les valeurs, calculer la moyenne et effacer la ligne
For J = 0 To UBound(colonnesMoyenne)
oldVal = Rg.Cells(dic(cle), colonnesMoyenne(J)).Value 'ajout valeur
'verification ecart entre les 2 valeurs
oldVal = Abs(oldVal) - Abs(Rg.Cells(i, colonnesMoyenne(J)))
oldVal = Abs(oldVal)
If oldVal > 0.3000000001 Then
Rg.Cells(i - 1, "J").Interior.ColorIndex = 3
Rg.Cells(i, "J").Interior.ColorIndex = 3
i = i + 1
'Rg.Cells(i, colonnesMoyenne(J)).EntireRow.Delete
'Rg.Cells(i - 1, colonnesMoyenne(J)).EntireRow.Delete
'nbRows = nbRows - 2
'i = 1
GoTo DebutBoucle
Else
oldVal = Rg.Cells(dic(cle), colonnesMoyenne(J)).Value
oldVal = (oldVal + Rg.Cells(i, colonnesMoyenne(J))) / 2
Rg.Cells(dic(cle), colonnesMoyenne(J)).Value = Format(oldVal, "0.00")
End If
Next J
'effacer la ligne
Rg.Cells(i, 1).EntireRow.Delete
nbRows = nbRows - 1
Else
'S'il n'existe pas on l'ajoute
dic.Add cle, i
i = i + 1
End If
Loop
'MAJ ecran et du mode de calcul
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
'décharge de la memoire
Set dic = Nothing
End Sub
Bonjour,
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" après boucler plusieurs fois.
De plus, si la valeur est hors limite, cela ne s'inscrit pas dans la colonne I
En pj, le fichier de test correspondant.
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
Bonjour,
A force de persévérance, j'ai reussi à 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.
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