IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Code VBA pour report de données d'une année vers une autre


Sujet :

Access

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Janvier 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Code VBA pour report de données d'une année vers une autre
    Bonjour à tous,

    J'ai un petit soucis avec ma base de donnée Access, et je vais avoir besoin d'aide...

    Tous les ans je dois reporter des interventions préventive d'une année sur une autre, selon la périodicité.

    J'ai une table qui s'appelle "planning préventif" avec les champs suivants

    N° BTP
    Semaine interv (avec cadencement de plusieurs semaine pour certains BTP)
    Année interv
    soldé interv
    date de fin du BTP

    J'ai une requête "Report preventif" (avec les mêmes champs que la table "planning préventif") afin de pouvoir reporter tous les BTP sur les années suivantes selon leurs périodicités.

    Le code VBA ci-dessous ne fonctionne pas très bien, car il ne reporte pas tous cadencements... certains passe dans les mailles du filet et je ne sais pas pourquoi !

    Au lieu de reporter 2314 cadencement au total, il n'en reporte que 1706, ce qui fait une différence de 608.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Option Compare Database
    Option Explicit
     
    Private Sub CmdReportBTP_Click()
    Dim db As Database
    Dim rsScan As DAO.Recordset
    Dim rsPlan As DAO.Recordset
    Dim machine As String
    Dim annee As Integer
    Dim semaines() As Integer
    Dim numeros() As Integer
    Dim i As Integer
    Dim anneeReport As Integer
     
    anneeReport = InputBox("Saisir l'année de report :")
     
    Set db = CurrentDb
    Set rsScan = db.OpenRecordset("report_preventif", dbOpenSnapshot)
    Set rsPlan = db.OpenRecordset("Planning preventif", dbOpenDynaset)
    i = 1
    If rsScan.BOF = True And rsScan.EOF = True Then
    	MsgBox "Aucun enregistrement", vbCritical
    Exit Sub
    End If
     
    machine = rsScan.Fields("code machine").Value
    annee = rsScan.Fields("année interv").Value
     
    Do While rsScan.EOF = False
     
    	If rsScan.Fields("code machine").Value = machine And rsScan.Fields("année interv").Value = annee Then
    		If annee <= anneeReport Then
    			rsPlan.AddNew
    			rsPlan.Fields("N° BTP").Value = rsScan.Fields("N° BTP").Value
    			rsPlan.Fields("Semaine interv").Value = rsScan.Fields("Semaine interv").Value
    			rsPlan.Fields("année interv").Value = annee + rsScan.Fields("périodicité").Value
    			rsPlan.Fields("soldée interv").Value = False
    			rsPlan.Update
    		End If
    		annee = rsScan.Fields("année interv").Value
    	End If
     
    	rsScan.MoveNext
    	'Ajouter le test si on est pas en EOF
    	If Not rsScan.EOF Then
    		If rsScan.Fields("code machine").Value <> machine Then annee = rsScan.Fields("année interv").Value
    		machine = rsScan.Fields("code machine").Value
     
    	End If
    Loop
    rsScan.Close
    rsPlan.Close
    Set rsScan = Nothing
    Set rsPlan = Nothing
     
    MsgBox "Report des BTP effectué avec succès"
     
    End Sub
    Voila! Est-ce que quelqu'un pourrais éventuellement m'aider à résoudre ce petit problème, car moi avec mon petit niveaux je n'y arriverai pas...

    Merci d'avance à tous, bonne année et bon week-end !

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 112
    Points : 5 237
    Points
    5 237
    Par défaut
    Bonsoir,

    C'est très compliqué alors que cela pourrait être très simple et je pense que le code se perd lorsque la machine change d'une ligne sur l'autre.

    Il serait bien plus lisible d'écrire le select qui liste les lignes à copier et de les copier en une fois, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select btp,machine,semaine from table1 where annee=2020
    Et si la liste (testée en mode SQL) est ok, le vba s'écrit en une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentdb.execute "insert into table2 (btp,machine,semaine,annee) select btp,machine,semaine,2021 from table1 where annee=2020", dbfailonerror
    NB : pas d'espace ni de caractère spécial dans les noms de champ

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Janvier 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour nico84,

    Merci pour ton commentaire et désolé, pour ma réponse tardive... autres soucis à régler...

    Aussi, j'ai oublié de préciser que j'ai une table "preventif" avec les champs suivants :

    Code machine
    Année interv
    Semaine interv
    N° BTP
    périodicité

    J'ai déjà réalisé plusieurs fois des arrêts sur cette lignes, et les variables "machine" et "annee" recopie bien les bonnes valeurs.

    Mais je pense aussi, que le code se perd lorsque la machine change d'une ligne sur l'autre !

    Est-ce un couac dans le code ou est-ce la requête "Report preventif" ?

    Merci pour votre aide

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 112
    Points : 5 237
    Points
    5 237
    Par défaut
    Citation Envoyé par tech40 Voir le message
    Est-ce un couac dans le code ou est-ce la requête "Report preventif" ?
    Plutot un couac à mon avis, il faut revoir l'algo ou mieux changer de méthode

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Janvier 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Oui je pense que tu as raison !
    Il me faudrait un code beaucoup plus simple avec une simple requête sur la table "preventif" pour aller chercher les périodicités et autres et la table "planning préventif" pour aller chercher les lignes de l'année 2020.
    Puis un ptit code de type...

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Planning preventif].[N° BTP], préventif.[Code machine], [Planning preventif].[Année interv], [Planning preventif].[Semaine interv], préventif.périodicité
    FROM préventif INNER JOIN [Planning preventif] ON préventif.[N° BTP] = [Planning preventif].[N° BTP]
    WHERE (((préventif.Activé)=Yes))
    ORDER BY [Planning preventif].[N° BTP], [Planning preventif].[Année interv] DESC , [Planning preventif].[Semaine interv] DESC;

    Je vois bien le fonctionnement, mais avec mon ptit niveau en VBA, je n'ai pas assez de connaissance et d'expérience pour pouvoir développer cette petite moulinette

    Aurait-tu une méthode pour un code simple pour que je puisse fabriquer cette moulinette ?

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 112
    Points : 5 237
    Points
    5 237
    Par défaut
    Citation Envoyé par tech40 Voir le message
    Aurait-tu une méthode pour un code simple pour que je puisse fabriquer cette moulinette ?
    Voir mon 1er post

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Janvier 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour nico84,

    J'ai essayé la solution que tu as mise sur ton 1er post, j'ai même créé 2 tables pour faire le test, mais rien à faire cela me donne une erreur !

    sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.Execute "insert into Table2 (N° BTP,Semaine interv,Annee interv) select N° BTP,Semaine interv,2021 from Table1 where annee=2020", dbFailOnError
    Mais de toute façon, je suis quand même dépendant de la requête "report_preventif", car elle fusionne les données qui se trouvent sur la table "préventif" et "planning preventif".


    Ci-dessous le contenu de chaque table et de la requête report_preventif :

    Champs de la table "préventif"
    Date Création, Date en cours, Semaine Calculée, Travaux à effectuer, Code machine, Temps théorique, Activé, unitée, Sous organe, Libellé, N° BTP, périodicité, Type d'intervention, Organisation


    Champs de la table "Planning preventif"
    N° BTP, Semaine interv, Année interv, soldée interv, date de fin du BTP


    Champs de la requête "report_preventif"
    N° BTP, Semaine interv, Année interv (table planning preventif)
    Code machine, périodicité, Activé (table préventif)


    Requête "report_preventif"
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Planning preventif].[N° BTP], préventif.[Code machine], [Planning preventif].[Semaine interv], [Planning preventif].[Année interv], préventif.périodicité
    FROM préventif INNER JOIN [Planning preventif] ON préventif.[N° BTP] = [Planning preventif].[N° BTP]
    WHERE (((préventif.Activé)=Yes))
    ORDER BY [Planning preventif].[N° BTP], [Planning preventif].[Semaine interv] DESC , [Planning preventif].[Année interv] DESC;


    Donc mon select dois aller chercher les infos de la table "Planning preventif" et "préventif" pour la périodicité (1, 2, 3, 4, 5 ans, ...)
    et lors de l'insertion dans la table "Planning preventif" prendre en compte la périodicité et l'additionner à l'année 2020.

    Ex:

    Planning Preventif initial

    N° BTP Semaine interv Année interv soldée interv date de fin du BTP
    7 31 2020 -1 28/07/2020 (périodicité 1ans)
    8 31 2020 -1 29/07/2020 (périodicité 2ans)


    Planning Preventif après report

    N° BTP Semaine interv Année interv soldée interv date de fin du BTP
    7 31 2020 -1 28/07/2020 (périodicité 1ans)
    7 31 2020 -1 28/07/2021
    8 31 2020 -1 29/07/2020 (périodicité 2ans)
    8 31 2020 -1 29/07/2022


    Exemple de résultat de la requête "report_preventif"

    Code machine Année interv Semaine interv N° BTP périodicité
    ACCOMP07 2020 4 798 1
    ACCOMP07 2020 15 1242 1

    Voila! j'espère m'être fait comprendre, ce n'est pas évident à expliquer... en théorie c'est simple! mais pas à mettre en oeuvre...

    En tout cas, merci pour ton aide nico84

  8. #8
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 112
    Points : 5 237
    Points
    5 237
    Par défaut
    Euh...
    - j'imagine que tes tables ne s'appellent ni table2 ni table1
    - les espaces dans les champs ça nécessite des []
    - idem pour les autres caractères spéciaux
    - la requete source peut être plus compliquée si besoin

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Janvier 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Du coup j'ai simplifié la tache, je l'ai transformer la requête "report_preventif" en requête ajout, et ça alimente bien la table "Planning preventif" avec toutes les données correcte comme je voulais.

    Maintenant mon problème c'est les doublons, si l'année suivante je me trompe d'année ou si par exemple je lance la requête 2 fois.

    Pas facile

  10. #10
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 932
    Points
    932
    Par défaut
    Citation Envoyé par tech40 Voir le message
    Maintenant mon problème c'est les doublons, si l'année suivante je me trompe d'année ou si par exemple je lance la requête 2 fois.
    Pour cela il faudrait alimenter une table de suivi des reports ; date de l'opération, année "reportée", periodicité, année alimentée, nombre d'enregistrements... Cela permet de garder trace des opérations et d'alerter si l'opération a déjà été effectuée.
    Se tromper d'année cela veut dire quoi ? Ce n'est pas ton traitement qui détermine l'année "à reporter" ?

  11. #11
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 112
    Points : 5 237
    Points
    5 237
    Par défaut
    Citation Envoyé par tech40 Voir le message
    Maintenant mon problème c'est les doublons, si l'année suivante je me trompe d'année ou si par exemple je lance la requête 2 fois.
    Oui il y a plusieurs solutions :
    - celle proposée par paraffine
    - la nouvelle année n'a pas besoin d'être saisie puisque c'est celle qui commence (ou qui va commencer)
    - on peut envisager une clé unique "bien choisie" (machine+année+semaine ?)
    - en VBA on peut tester s'il y a déjà des taches cette année là avant d'exécuter la requete

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Janvier 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2021
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Voila les nouvelles !

    J'ai créée un index unique sur les champs (N° BTP, Semaine interv, Année interv) de la table "planning preventif" et avec ma petite requête SQL.

    et là ça marche bien !

    Simple rapide e efficace

    Merci à tous pour votre aide

Discussions similaires

  1. Ligne de Code VBA pour actualiser des données sous PPT
    Par harald78 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/10/2016, 09h27
  2. Réponses: 16
    Dernier message: 13/12/2015, 12h50
  3. [XL-2013] Erreur code vba pour "programme extraction données web"
    Par tatamarc dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/08/2013, 12h07
  4. [XL-2007] Code VBA pour le transfert automatique d'une feuille à l'autre
    Par parky67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/07/2012, 16h21
  5. Code VBA pour importer des données vers Excel
    Par thanmirt dans le forum SDK
    Réponses: 1
    Dernier message: 09/04/2011, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo