Analyse et reports de données
Bonjour,
Etant une bille sur excel, je cherche votre aide pour pouvoir accomplir la merveille suivante :
Je vous décrit le truc en 2 parties :
Partie 1 :
En A, j'ai un numéro de référence désignant un article
De B à E, j'ai des colonnes désignant des marqueurs de passage, représentés par heure et date.
Tous les 4 marqueurs (de B à E) doivent être présents.
La formule que je cherche doit permettre de trouver les lignes où un ou plusieurs marqueurs manquent, puis de notifier dans un autre classeur excel, quels articles (avec report du num de reference) comportent un marqueur absent, et le(s)quel(s).
Tout cela sachant que la base de données est bien evidemment évolutive et doit être tchekée régulièrement. (donc boucle, vba ?)
Partie 2
Et si vous être très fort et motivés, j'aimerai rajouter une difficulté :
Imaginons 2 colonnes supplémentaire : F et G.
F peut correspondre à "Prioritaire" ou "Secondaire"
G peut correspondre à "1", "2", ou "3"
Si F et G sont "Secondaire" ET "3", alors B peut être absent, et la ligne ne doit pas être reportée.
Voili. Si vous pouvez déjà apporter des solutions à la partie 1, ca serait deja enorme !
Merci par avance !
Bonjour,
Le mieux serait que tu joignes une trame de ton fichier pour faciliter l'aide à t'apporter.
Cordialement
ddetp88
Yes, j etais justement en train de faire un exemple
le voila :
(sachant que j ai oublié de dire qu'il faudrait aussi reporter le "nom responsable"
Bonjour,
On va procéder en deux temps. Pour le moment tout se passe sur le même classeur.
J'ai ajouté une colonne en i avec une formule
Le bouton Reporter les données lance une macro qui répond à ta demande.
A voir si cela convient.
Cordialement
ddetp88
Ouah ! Excellent !!
C'est presque parfait !
Presque, car j'ai constaté que la formule en "i" ne considère pas la colonne "G", qui est importante dans le cas de "secondaire" en F.
Pour résumer :
Si F est "secondaire" ET G est "3", alors la colonne "B"(passage1) ne doit pas etre remplie et donc par reportée.
Donc si F est "secondaire" ET G est "1" ou "2", alors il faut bien reporter s'il manquerait la colonne B (et/ou les autres bien sur...)
Si je peux me permettre, est il ensuite possible de lancer la macro depuis un autre classeur, et de faire apparaitre le report dans cet autre classeur (ou une feuille de ce 2eme classeur) ?
Et une 3eme chose : la formule en colonne "i" peut elle être inscrite automatiquement (via une autre macro), ou est-il forcement necessaire de copier et tirer la formule jusqu'en bas ?
En tout cas, déjà Gros merci !
Ooops, Mea Culpa, je n'avais pas vu que les arguments "Secondaire" et "3" sont considérés dans la Macro.
MAIS, après plusieurs tests, il s'avère qu'en cas de "Prioritaire" et "3", la colonne B ne se retrouve pas cochée. La ligne s'affiche bien avec "num de reference" et "nom responsable", mais pas de colonne B cochée le cas écheant.
J'ai tenté de bidouiller le code, en ecrivant ainsi :
Option Explicit
Public Sh As Worksheet
Dim i As Integer, L As Integer, Ln As Integer
Sub test()
Set Sh = Sheets("Feuil1")
Sheets("Report").[A2:F1000].ClearContents 'Efface la plage avant écriture
'trouve la dernière ligne du taleau
L = 2 ' valeur de départ
'Boucle d'écriture
Do While Sh.Cells(L, "A") <> ""
If Sh.Cells(L, "I").Value = "non" Then
With Sheets("Report")
Ln = .Range("A" & Rows.Count).End(xlUp).Row + 1 'trouve la dernière ligne
.Cells(Ln, "A") = Sh.Cells(L, "A").Value 'reference
If Sh.Cells(L, "F") = "PRIORITAIRE" And Sh.Cells(L, "G") = "3" Then .Cells(Ln, "B") = "X" 'passage1
If Sh.Cells(L, "F") = "PRIORITAIRE" And Sh.Cells(L, "G") = "2" Then .Cells(Ln, "B") = "X" 'passage1
If Sh.Cells(L, "F") = "PRIORITAIRE" And Sh.Cells(L, "G") = "1" Then .Cells(Ln, "B") = "X" 'passage1
If Sh.Cells(L, "F") = "SECONDAIRE" And Sh.Cells(L, "G") = "2" Then .Cells(Ln, "B") = "X" 'passage1
If Sh.Cells(L, "F") = "SECONDAIRE" And Sh.Cells(L, "G") = "1" Then .Cells(Ln, "B") = "X" 'passage1
If Sh.Cells(L, "C") = "" Then .Cells(Ln, "C") = "X" 'passage2
If Sh.Cells(L, "D") = "" Then .Cells(Ln, "D") = "X" 'passage3
If Sh.Cells(L, "E") = "" Then .Cells(Ln, "E") = "X" 'passage4
.Cells(Ln, "F") = Sh.Cells(L, "H").Value ' nom responsable
.Select
End With
End If
L = L + 1
Loop
End SubJ'imagine que c'est un peu lourd, mais au final, j'obtiens les bons résultats.
Peut etre auriez vous une autre solutions plus stylée ?
Now, reste à trouver l'astuce pour lancer la macro depuis un autre classeur, et faire afficher le report dans cet autre classeur, et voir s'il aurait une solution pour insérer automatiquement la colonne-formule "i"
Merki par avance encore !
Bonsoir,
Je viens de regarder les différents tests que tu as mis en place dans la macro et je m'interroge sur la formule de la colonne I.
Il faudrait que tu définisses tous les cas possibles. Je dois dire que je ne comprends pas tout du fonctionnement de ton tableau.
Peux-tu apporter cette précision avant que je ne me lance?
Merci
Cordialement
Re, comme je n'aurai pas trop de disponibilité durant la semaine, j'ai modifié le code pour écrire dans un autre classeur.
Place les deux fichiers dans un même dossier et lance le fichier BDonnees.xlsm
J'espère que tu ne rencontreras pas de problème.
Bonne soirée
Cordialement
ddetp88
Alors :
Il s agit en fait d un tableau destiné a un contrôle qualité des interventions de vehicules d urgences.
Pour etre encore plus concret, voici en details :
- Num de reference correspond au numero d intervention
- Les heures de passage correpondent aux differentes heures de l intervention (heure de l alarme, heure de depart, heure d arrivee, heure operationnel)
- le type de priorité correspond au type d intervention (prioritaire/secondaire) (=P/S)
- le degré de priorité peut etre de 1-2-3
Le controle qualité vise a verifier si toutes les heures sont presentes. Seules les "Secondaires 3" peuvent se passer de l heure de la 1ere alarme.(1ere colonne).
Donc en gros, il n y a que 2 cas de figure :
- toutes les heures doivent etre presentes pour les P1-P2-P3-S1-S2
- pour les S3 (=secondaire 3) on peut se passer de l heure de l alarme, mais toutes les autres doivent y etre.
Pour ta 2eme mouture, je rencontre kkes problèmes, toutes les lignes ne s'affichent pas alors qu'elles le devraient.
Je regarde de mon côté et te redis.
Si entre temps tu as de nouvelles idées, hésite pas !
Tu disais qu'il serait peut etre possible d'éviter la colonne "i", et donc de passer en tout VBA.
Cette solution me séduirait assez
Avec cette formule en i1 et à recopier:
=SI(NBVAL(Tableau3[@[PASSAGE1]:[PASSAGE4]])=4;"oui";SI(ET([@PRIORITE]="Secondaire";[@[TYPE DE PRIORITE]]=3;[@PASSAGE1]=0);"Oui";"Non"))Le fichier BDonnees en chargement
Cordialement
ddetp88
Pour la colonne I elle peut être masquée si tu veux.
cordialement
Merci !
Mais des erreurs subsistent dans le report...
En me basant sur ta 1ere proposition, et dans l'idée de supprimer la nécessité de la colonne "i" (car en réalité la base de données proviendra régulièrement d'une extraction logicielle et pourra être assez grosse), j'ai tenté ca :
Option Explicit
Public Sh As Worksheet
Dim i As Integer, l As Integer, Ln As Integer
Sub test()
Set Sh = Sheets("Feuil1")
Sheets("Report").[A2:F1000].ClearContents 'Efface la plage avant écriture
'trouve la dernière ligne du taleau
l = 2 ' valeur de départ
'Boucle d'écriture
Do While Sh.Cells(l, "A") <> ""
With Sheets("Report")
Ln = .Range("A" & Rows.Count).End(xlUp).Row + 1 'trouve la dernière ligne
If Sh.Cells(l, "B") = "" Or Sh.Cells(l, "C") = "" Or Sh.Cells(l, "D") = "" Or Sh.Cells(l, "E") = "" Then .Cells(Ln, "A") = Sh.Cells(l, "A").Value 'reference
If Sh.Cells(l, "B") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 3 Then .Cells(Ln, "B") = "X" 'testamoi
If Sh.Cells(l, "C") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 3 Then .Cells(Ln, "C") = "X" 'testamoi
If Sh.Cells(l, "D") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 3 Then .Cells(Ln, "D") = "X" 'testamoi|
If Sh.Cells(l, "E") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 3 Then .Cells(Ln, "E") = "X" 'testamoi|
If Sh.Cells(l, "B") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "B") = "X" 'testamoi
If Sh.Cells(l, "C") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "C") = "X" 'testamoi
If Sh.Cells(l, "D") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "D") = "X" 'testamoi|
If Sh.Cells(l, "E") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "E") = "X" 'testamoi|
If Sh.Cells(l, "B") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "B") = "X" 'testamoi
If Sh.Cells(l, "C") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "C") = "X" 'testamoi
If Sh.Cells(l, "D") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "D") = "X" 'testamoi|
If Sh.Cells(l, "E") = "" And Sh.Cells(l, "F") = "PRIORITAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "E") = "X" 'testamoi|
If Sh.Cells(l, "B") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "B") = "X" 'testamoi
If Sh.Cells(l, "C") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "C") = "X" 'testamoi
If Sh.Cells(l, "D") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "D") = "X" 'testamoi|
If Sh.Cells(l, "E") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 1 Then .Cells(Ln, "E") = "X" 'testamoi|
If Sh.Cells(l, "B") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "B") = "X" 'testamoi
If Sh.Cells(l, "C") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "C") = "X" 'testamoi
If Sh.Cells(l, "D") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "D") = "X" 'testamoi|
If Sh.Cells(l, "E") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 2 Then .Cells(Ln, "E") = "X" 'testamoi|
If Sh.Cells(l, "C") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 3 Then .Cells(Ln, "C") = "X" 'testamoi
If Sh.Cells(l, "D") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 3 Then .Cells(Ln, "D") = "X" 'testamoi|
If Sh.Cells(l, "E") = "" And Sh.Cells(l, "F") = "SECONDAIRE" And Sh.Cells(l, "G") = 3 Then .Cells(Ln, "E") = "X" 'testamoi|
.Cells(Ln, "F") = Sh.Cells(l, "H").Value ' nom responsable
.Select
End With
l = l + 1
Loop
End SubCa marche nickel (bon ok, ca reste d'une lourdeur incommensurable, mais je découvre le VBA...!), en revanche, en cas de "Secondaire 3", ca m'affiche tout de meme une ligne (sans "X")
Bonjour,
On aurait peut-être dû commencer par le début disait Lapalisse.
Peux-tu compléter le tableau des conditions ci-joint?
Merci
ddetp88
Bonsoir,
Regarde la modification.
Juste un truc, quand passage1 est faux et que prioritaire= secondaire et type=3, c'est compté comme vrai.
En revanche si passage1 est faux et qu'un autre passage est faux sur la même référence, alors passage1 et 2 sont faux, ils sont répertoriés dans la feuille report.
Cordialement,
ddetp88
Yes, ca commence a prendre forme. Par contre le fait que en cas de Secondaire3, passage 1 se coche si passage 2 est faux, pose encore probleme...
J'ai ajouté une ligne pour traiter à part la colonne B.
J'ai un peu joué avec les priorités et tout semble fonctionner comme tu le souhaites.
Bonne suite dans ton projet,
ddetp88
Merci infiniment pour ton implication !
Très aidant !
Merci de passer le fil en résolu.
Cordialement