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

23prepa.xlsm (96.89 Ko)

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

38prepa-v2.xlsm (97.01 Ko)

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)

10prepa-v2-2.xlsm (95.42 Ko)

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 ?

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?

N'est pas vide ?? Pas compris. Vous avez une formule là donc si pas de valeur récupérée, la cellule sera 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

4prepa-3.xlsm (123.56 Ko)

Bonsoir

Votre fichier en retour. J'ai adapté en fonction de ce que vous aviez noté sur la feuille Guide

Crdlt

6prepa-4.xlsm (122.25 Ko)

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

5prepa-4-1.xlsm (123.41 Ko)

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

6prepa-4-2.xlsm (122.00 Ko)

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

13prepa-5.xlsm (123.90 Ko)

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

Rechercher des sujets similaires à "archiver donnees conditions"