Archiver des données selon conditions
Bonjour à tous,
Je souhaiterais votre aide pour la réalisation d'un archivage de données.
Je me suis appuyé sur différents codes trouvés sur le net, mais j'ai des problématiques bien spécifiques que je n'arrive pas à résoudre :
Il s'agit après saisie de données dans l'onglet "Guide", par l'intermédiaire d'un bouton "Archiver" de copier les données dans l'onglet "Sauvegarde" selon 3 conditions :
- Que tous les champs obligatoires soient complétés (Date de réception du dossier/Date de traitement / Dossier traité par /Type / Contrôleur / Résultats pour chaque point de contrôle
- Si le résultat d'un point de contrôle est "Donnée Non saisie" / "Saisie erronée", copie de tous les champs obligatoires + toutes les lignes avec comme résultat "Donnée Non saisie" / "Saisie erronée"
- Si tous les résultats obtenus sont des "OK" ou "Non concerné", copie de tous les champs obligatoires et renvoi du résultat "OK"
Je souhaiterais également incrémenter un numéro de fiche à chaque nouvelle saisie mais également à partir de ce numéro de fiche retrouver toute la saisie effectuée.
Quelqu'un pourrait-il m'aider?
Je vous remercie par avance
Bonsoir
Sur base de ce que j'ai compris dans votre post, voici votre fichier en retour pour test
J'attends votre retour pour modifier si besoin.
Crdlt
Bonsoir Dan,
Merci d'avoir pris le temps de m'aider
-C'est une bonne idée d'avoir mis l'obligation de remplir les cellules avant la sauvegarde.
Serait-il possible de rajouter cette obligation pour chaque cellule de la colonne "Résultats" si la cellule de la colonne "Points de contrôle" n'est pas vide?
-Concernant l'archivage des données :
** il faudrait que lorsque la colonne "Résultats" ne comporte pas de valeurs "Donnée Non Saisie" ou "Donnée Erronée" --> Copie de la Date de réception du dossier/Date de traitement / Dossier traité par /Type / Contrôleur et indiquer la valeur "OK" dans la colonne "Résultats" de l'onglet "Sauvegarde"
** il faudrait que lorsque la colonne "Résultats" comporte au moins une valeur "Donnée Non Saisie" ou "Donnée Erronée" -->Copie de la Date de réception du dossier/Date de traitement / Dossier traité par /Type / Contrôleur + toutes les lignes avec comme résultat "Donnée Non saisie" / "Saisie erronée"
Dans le fichier en pièce-jointe, j'ai tenté de compiler un code que j'ai reçu (aide sur ce forum)
Bonjour à tous
Quelqu'un pour m'aider svp?
Re
Vous avez modifié le code je vois. Qu'est ce qui ne fonctionne pas dans ce que je vous ai donné ??
Autres points :
- Pourquoi déclarez-vous une variable Lastrow lorsqu'il n'y en a pas besoin. Elle ne sert que dans la ligne FOR.... Gardez en mémoire que pour chaque variable déclarée vous utilisez de la mémoire dont excel pourrait avoir besoin.
- Quel est le but de votre variable SiErr ?
N'est pas vide ?? Pas compris. Vous avez une formule là donc si pas de valeur récupérée, la cellule sera vide.Serait-il possible de rajouter cette obligation pour chaque cellule de la colonne "Résultats" si la cellule de la colonne "Points de contrôle" n'est pas vide?
** il faudrait que lorsque la colonne "Résultats" ne comporte pas de valeurs "Donnée Non Saisie" ou "Donnée Erronée" --> Copie de la Date de réception du dossier/Date de traitement / Dossier traité par /Type / Contrôleur et indiquer la valeur "OK" dans la colonne "Résultats" de l'onglet "Sauvegarde"
Dans cette colonne vous avez une liste déroulante avec l'option "OK" qui doit être complétée par le contrôleur, non ?
Dans le fichier en pièce-jointe, j'ai tenté de compiler un code que j'ai reçu (aide sur ce forum)
Vous avez deux posts ouverts ?? Pourquoi ce deuxième fil ? et surtout pourquoi ne pas avoir mis votre premier fichier avec le dernier code ?
Crdlt
Bonjour,
Le code que vous m'avez donné copie toutes les lignes saisies mais ne respecte pas les conditions très précises d'archivage que je souhaite :
** il faudrait que lorsque la colonne "Résultats" ne comporte pas de valeurs "Donnée Non Saisie" ou "Donnée Erronée" --> Copie de la Date de réception du dossier/Date de traitement / Dossier traité par /Type / Contrôleur et indiquer la valeur "OK" dans la colonne "Résultats" de l'onglet "Sauvegarde"
** il faudrait que lorsque la colonne "Résultats" comporte au moins une valeur "Donnée Non Saisie" ou "Donnée Erronée" -->Copie de la Date de réception du dossier/Date de traitement / Dossier traité par /Type / Contrôleur + toutes les lignes avec comme résultat "Donnée Non saisie" / "Saisie erronée"
>> Le code qui m'a été transmis entre-temps sur ce forum, fonctionne bien et suit bien ces conditions (utilisation de la variable SiErr).
Là, j'ai tenté sans succès de compiler votre code (vérification de la saisie avant archivage) et celui qui m'a été fourni (archivage selon les conditions souhaitées).
Je suis novice en vba... -Serait-il possible de rajouter cette obligation pour chaque cellule de la colonne "Résultats" si la cellule de la colonne "Points de contrôle" n'est pas vide?
Je vais vous transmettre le fichier avec le code qui fonctionne
Voici le fichier en pièce-jointe
Bonsoir
Votre fichier en retour. J'ai adapté en fonction de ce que vous aviez noté sur la feuille Guide
Crdlt
Bonsoir,
Je vous remercie de votre aide, mais çà ne répond toujours pas à ma demande.
Pourtant, j'ai bien détaillé les conditions précises de la copie des données (Cas 1 et Cas 2).
Dans le dernier fichier que je vous ai transmis, le code fait exactement ce que je souhaite.
Donc, pour la copie des données --> C'est PARFAIT - Il ne fallait rien changer
Là, ma demande concerne très précisément, le contrôle de la saisie des données avant l'archivage.
Je vais créer un nouveau post pour cela.
En vous remerciant encore
Re
Pas besoin de créer encore un nouveau fil.
Bon regardez le fichier joint. J'ai prit le CAS 1 avec Type 2.
Cliquez sur le bouton Sauvegarder et dites moi ce que vous attendez comme résultat en feuille Sauvegarde.
Là cela sauve 3 données. 1 x Données non saisie et 2 x Saisie erronée
J'ai désactivé uniquement le code qui efface pour l'exemple
C'est exactement çà pour le cas 1.
Pour le cas 2 : tous les résultats des points de contrôle sont "OK" ou "Non Concerné"
B3="PAS D'ERREURS DETECTEES"
Je souhaite donc, copier dans l'onglet "Sauvegarde" :
- le Num CL
- Date de réception
- Date de traitement
- Dossier traité par
- Type
- Contrôleur
- Date du contrôle
- N° Fiche
- Et indiquer "PAS D'ERREURS DETECTEES" dans la colonne résultats dans l'onglet "Sauvegarde"
- -> Pour le cas 2 : 1 seule ligne doit figurer dans l'onglet "Sauvegarde"
Ensuite, Pour le cas 1 et le cas 2, remettre à zéro les cellules de l'onglet "Guide":
- le Num CL
- Date de réception
- Date de traitement
- Dossier traité par
- Type
- Contrôleur
- N° Fiche
- Toutes les cellules des colonnes B et C (Résultats et Commentaires)
Toutefois, avant la sauvegarde, je souhaite que les champs ci dessous soient obligatoirement remplis :
- le Num CL
- Date de réception
- Date de traitement
- Dossier traité par
- Type
- Contrôleur
- Date du contrôle
- N° Fiche
- Toutes les cellules de la colonne "Résultats", si la cellule de la colonne "Point de contrôle" sur la même ligne est remplie (Ex. Si A21 contient des données, B21 doit être remplie)
Re
--> Pour le cas 2 : 1 seule ligne doit figurer dans l'onglet "Sauvegarde"
Ok je vais regarder. Toutefois la copie d'une seule ligne n'était pas indiquée dans les explications dans votre fichier.
Ensuite, Pour le cas 1 et le cas 2, remettre à zéro les cellules de l'onglet "Guide":
Comme je vous ai dit j'ai désactivé. Il vous suffit à la fin du code d'enlever l'apostrophe juste devant CALL RAZ pour que cela fonctionne.
Toutefois, avant la sauvegarde, je souhaite que les champs ci dessous soient obligatoirement remplis :
Ok aussi puisque vous avez le message qui apparaît si les cellules des lignes 6 à 10 ne sont pas remplies et aussi si la première donnée en B14 est absente.
Crdlt
Bonjour
Voici le fichier en retour pour le cas 2
merci de tester et me dire si ok pour vous
Cordialement
Bonjour Dan,
Oui, c'est nikel pour les cas 1 et 2
Reste la vérification des données avant la sauvegarde :
- Les champs : Num CL / Date de réception / Date de traitement / Dossier traité par / Type / Contrôleur / Date du contrôle / N° Fiche doivent être remplis
- Les cellules de la colonne B doivent être remplies si les cellules de la même ligne dans la colonne A ne sont pas vides
Exemples :
Si A24 contient des données -> B24 doit être complétée
Si A35 ne contient pas de données-> B35 ne doit pas être complétée
- Le contrôleur doit être différent de celui ayant traité le dossier
-> B9≠D9 (msgbox : "Mon contrôle ne peut s'opérer sur mes propres dossiers traités")
- La date de traitement du dossier doit être postérieure ou égale à la date de réception du dossier
->B8≥B7 (msgbox : "La date de traitement du dossier doit être postérieure ou égale à la date de réception du dossier")
- La date de contrôle du dossier doit être postérieure ou égale aux dates de traitement du dossier et de réception du dossier
->D10≥B7 et D10≥B8 (msgbox : "La date de contrôle doit être postérieure ou égale aux dates de traitement et de réception du dossier")
Encore merci - Hâte de vous lire
Bonsoir
Votre fichier en retour dans lequel j'ai créé une macro Controles afin de vérifier vos conditions avant Sauvegarde
Dans l'attente de votre retour
Cordialement
Bonsoir Dan,
Je ne peux pas vérifier les contrôles de saisie car quelque soit la saisie que j'effectue, la sauvegarde se fait tout de même.
Je pense qu'il manque un paramètre de blocage dans le code..
J'ai toutefois regardé la macro contrôles et souhaite y apporter quelques corrections :
Sub controles()
'Dan 12/8/19
With Worksheets(ShG)
'controle du remplissage des lignes 6 à 9
If .Range("B6") = "" And .Range("B7") = "" And .Range("B8") = "" And .Range("B9") = "" And .Range("B10") = "" And .Range("B14") = "" And .Range("D8") = "" And .Range("D9") = "" And .Range("D10") = "" Then _
msgbox "Les champs : Num CL / Date de réception / Date de traitement / Dossier traité par / Type / Contrôleur / Date du contrôle / N° Fiche doivent être remplis ": Exit Sub
controle du remplissage des lignes 6 à 9 au lieu de 6 à 10
'Controle de La date de traitement du dossier
If .Range("B7").Value <= .Range("B8").Value Then msgbox "La date de traitement du dossier doit être postérieure ou égale à la date de réception du dossier": Exit Sub
La date de traitement du dossier doit être postérieure ou égale à la date de réception du dossier
'Controle de la date du controle par rapport aux dates de réception ou de traitement du dossier
If .Range("D10").Value >= .Range("B7").Value and .Range("D10").Value >= .Range("B8").Value Then _
msgbox "La date de contrôle doit être postérieure ou égale aux dates de traitement et de réception du dossier": Exit Sub
D10>=B7 et D10>=B8
Re
Je ne peux pas vérifier les contrôles de saisie car quelque soit la saisie que j'effectue, la sauvegarde se fait tout de même.
Je pense qu'il manque un paramètre de blocage dans le code..
Juste ! J'avais juste vérifié la macro contrôles seule...
Dans cette macro CONTROLES, il faut remplacer tous les EXIT SUB par END
Toujours dans cette même macro, à la condition --> 'Controle du nom du controleur et responsable du dossier. Il faut mettre un END à la fin de la ligne (Il était manquant)
Désolé mais refaite un essai
Autre chose,
controle du remplissage des lignes 6 à 9 au lieu de 6 à 10
B10 et D10 peuvent rester vide lors de la sauvegarde ??
Ecrit comme ceci --> .Range("D10").Value >= .Range("B7").Value, vous recevrez le message si la valeur en D10 est plus grande ou égale à B7.
Idem ici --> .Range("B7").Value <= .Range("B8").Value, vous recevrez le message si la date de réception du dossier est inférieure ou égale à B8
J'ai mis à jour le code, mais les contrôles ne se font pas
Const ShG = "Guide"
Const ShS = "Sauvegarde"
Public Ligne As Long
Sub Archiver()
'Dan - 08/08/19
Dim i As Integer
Application.ScreenUpdating = False
With Worksheets(ShG)
Call controles
Select Case .Range("B3").Value
Case Is = "ERREUR DETECTEE"
For i = 14 To .Range("B" & .Rows.Count).End(xlUp).Row
If .Range("A" & i).Value <> "" Then
If .Range("B" & i).Value = "Donnée Non Saisie" Or .Range("B" & i).Value = "Saisie Erronée" Then
Call Sauve
Sheets(ShG).Range("A" & i & ":C" & i).Copy
Sheets(ShS).Range("J" & Ligne).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
End If
End If
Next i
Application.CutCopyMode = False
Case Is = "PAS D'ERREURS DETECTEES"
Call Sauve
Sheets(ShS).Range("K" & Ligne) = .Range("B3").Value
End Select
End With
Sheets(ShG).Range("D11") = Sheets(ShG).Range("D11") + 1
Call RAZ
Application.ScreenUpdating = True
End Sub
Sub controles()
'Dan 12/8/19
With Worksheets(ShG)
'controle du remplissage des lignes 6 à 10
If .Range("B6") = "" And .Range("B7") = "" And .Range("B8") = "" And .Range("B9") = "" And .Range("B10") = "" And .Range("B14") = "" And .Range("D8") = "" And .Range("D9") = "" Then
msgbox "Les champs : Num CL / Date de réception / Date de traitement / Dossier traité par / Type / Contrôleur / Date du contrôle / N° Fiche doivent être remplis "
End
'Controle de La date de traitement du dossier
If .Range("B7").Value < .Range("B8").Value Then
msgbox "La date de traitement du dossier doit être postérieure ou égale à la date de réception du dossier"
End
'Controle du nom du controleur et responsable du dossier
If .Range("B9").Value = .Range("D9").Value Then
msgbox "Le contrôleur " & Range("D9") & " doit être différent de celui ayant traité le dossier"
End
'Controle de la date du controle par rapport aux dates de réception ou de traitement du dossier
End
If .Range("D10").Value < .Range("B7").Value Or .Range("D10").Value < .Range("B8").Value Then
msgbox "La date de contrôle doit être postérieure ou égale aux dates de traitement et de réception du dossier"
End
'Controle de la présence te tous les résultats en colonne A et B
If WorksheetFunction.CountIf(.Range("A14:A41"), ">*") <> WorksheetFunction.CountIf(.Range("B14:B41"), ">*") Then
msgbox "Il manque des resultats en colonne B ! "
End
End With
End Sub
Sub Sauve()
'Dan - 07/8/19
Ligne = Sheets(ShS).Cells.Find("*", LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 1
With Sheets(ShG)
Sheets(ShS).Range("A" & Ligne).Value = .Range("D11").Value 'N° Fiche
Sheets(ShS).Range("B" & Ligne).Value = .Range("D10").Value 'Date du contrôle
Sheets(ShS).Range("C" & Ligne).Value = .Range("D9").Value 'Contrôleur
Sheets(ShS).Range("D" & Ligne).Value = .Range("D8").Value 'Type
Sheets(ShS).Range("E" & Ligne).Value = .Range("B6").Value 'Num CL
Sheets(ShS).Range("F" & Ligne).Value = .Range("B7").Value 'Date de réception
Sheets(ShS).Range("G" & Ligne).Value = .Range("B6").Value 'Date de traitement
Sheets(ShS).Range("H" & Ligne).Value = .Range("B9").Value 'Traité par
End With
End Sub
Sub RAZ()
End Sub
With Sheets("Guide")
.Range("B6:B9,B14:D41,D8").SpecialCells(xlCellTypeConstants).ClearContents
End With
End Sub
Re
Si mais vous recopiez mal les infos et il manque les : avant le END
Recopier ceci tel quel :
Sub controles()
'Dan 12/8/19
With Worksheets(ShG)
'controle du remplissage des lignes 6 à 10
If .Range("B6") = "" And .Range("B7") = "" And .Range("B8") = "" And .Range("B9") = "" And .Range("B10") = "" And .Range("B14") = "" _
And .Range("D8") = "" And .Range("D9") = "" Then msgbox "Les champs : Num CL / Date de réception / Date de traitement / Dossier traité par / Type / Contrôleur / Date du contrôle / N° Fiche doivent être remplis ": End
'Controle de La date de traitement du dossier
If .Range("B7").Value < .Range("B8").Value Then msgbox "La date de traitement du dossier doit être postérieure ou égale à la date de réception du dossier": End
'Controle du nom du controleur et responsable du dossier
If .Range("B9").Value = .Range("D9").Value Then msgbox "Le contrôleur " & Range("D9") & " doit être différent de celui ayant traité le dossier": End
'Controle de la date du controle par rapport aux dates de réception ou de traitement du dossier
If .Range("D10").Value < .Range("B7").Value Or .Range("D10").Value < .Range("B8").Value Then msgbox "La date de contrôle doit être postérieure ou égale aux dates de traitement et de réception du dossier": End
'Controle de la présence te tous les résultats en colonne A et B
If WorksheetFunction.CountIf(.Range("A14:A41"), ">*") <> WorksheetFunction.CountIf(.Range("B14:B41"), ">*") Then msgbox "Il manque des resultats en colonne B ! ": End
End With
End Sub
Re
Dans cette ligne,
'controle du remplissage des lignes 6 à 10
If .Range("B6") = "" And .Range("B7") = "" And .Range("B8") = "" And .Range("B9") = "" And .Range("B10") = "" And .Range("B14") = "" _
And .Range("D8") = "" And .Range("D9") = "" Then msgbox "Les champs : Num CL / Date de réception / Date de traitement / Dossier traité par / Type / Contrôleur / Date du contrôle / N° Fiche doivent être remplis ": End
remplacez tous les AND par des OR
Cela doit être ceci :
'controle du remplissage des lignes 6 à 10
If .Range("B6") = "" Or .Range("B7") = "" Or .Range("B8") = "" Or .Range("B9") = "" Or .Range("B10") = "" Or .Range("B14") = "" _
Or .Range("D8") = "" Or .Range("D9") = "" Then msgbox "Les champs : Num CL / Date de réception / Date de traitement / Dossier traité par / Type / Contrôleur / Date du contrôle / N° Fiche doivent être remplis ": End
Crdlt