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

VBA Access Discussion :

Est-il possible d'éviter de répèter du code ? [AC-2007]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 685
    Par défaut Est-il possible d'éviter de répèter du code ?
    Bonsoir,

    voilà un extrait trés abrégé de mon code pour faire un export txt. J'ai besoin de gérer un champ en + (COD_REGROUPEMENT) et de faire 4 passages :
    Si COD_REGROUPEMENT=1 alors ouvre fichier 1 et fais les travaux,
    Si COD_REGROUPEMENT=2 alors ouvre fichier 2 et fais les travaux,
    ....
    jusqu'à si COD_REGROUPEMENT=4

    Voila mon code actuel : puis-je éviter de recopier 4 fois les parties comprises entre les limites en rouge ? :
    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
    Dim oDb As DAO.Database
     Dim oRst As DAO.Recordset
     Set oDb = CurrentDb
     marequete = "SELECT * FROM Commandes_Nomades"
     Set oRst = oDb.OpenRecordset(marequete)
     NBF = oRst.RecordCount
     Dim Var1, Var2 As Variant
      
    Open "C:\SQL_NOMADES\envoiFTP\Bons_Commande.txt" For Output As #1
    I = 1
     
    While Not oRst.EOF
        'lecture de la ligne et récup des champs
        Var0 = oRst.Fields(0)  'num ordre
        TEMPO = Var0
        Var3 = oRst.Fields(3) ' code client 13 car  livré
        Var4 = oRst.Fields(4) 'DATE PIECE  8c
         ' et ainsi de suite sur tous mes champs voulus
        Var38 = oRst.Fields(38) ' COD_REGROUPEMENT
    
    	If TEMPO = NUMORDVERIF Then   ' si tempo est égal à NUM_ORD donc c'est une ligne de détails
           		' ici mes formatages
            		Print #1, machaine
    	End If
      
    	If TEMPO <> NUMORDVERIF Then   ' si tempo est diff de NUM_ORD donc nouvel entête
        		' ici mon autre formatage
        		Print #1, machaine
        	NUMORDVERIF = Var0
    	End If
    
        I = I + 1
        oRst.MoveNext
    Wend
     oRst.Close
    
    Close #1
    Merci pour votre aide
    Thibault

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Le plus simple est de faire une procédure à partir de ton code

    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
    public sub TraiterRequete(prmRequeteSQL as string) :'Mettre un nom plus significatif pour la procédure du genre TraiterCommandes
     
      Dim oDb As DAO.Database
      Dim oRst As DAO.Recordset
      Set oDb = CurrentDb
      dim maRequete as string:maRequete = prmRequeteSQL
     
      Set oRst = oDb.OpenRecordset(marequete)
      dim NBF as long : NBF = oRst.RecordCount
      Dim Var0, Var1, Var2, Var3, Var4:'Si tu ne précise pas le type c'est automatiquement un variant
     
      Open "C:\SQL_NOMADES\envoiFTP\Bons_Commande.txt" For Output As #1
     
      dim I as integer: I = 1
     
      While Not oRst.EOF
        'lecture de la ligne et récup des champs
        Var0 = oRst.Fields(0)  'num ordre
        TEMPO = Var0
        Var3 = oRst.Fields(3) ' code client 13 car  livré
        Var4 = oRst.Fields(4) 'DATE PIECE  8c
         ' et ainsi de suite sur tous mes champs voulus
        Var38 = oRst.Fields(38) ' COD_REGROUPEMENT
     
         if TEMPO = NUMORDVERIF Then   ' si tempo est égal à NUM_ORD donc c'est une ligne de détails
           ' ici mes formatages
           Print #1, machaine
         end If
     
         If TEMPO <> NUMORDVERIF Then   ' si tempo est diff de NUM_ORD donc nouvel entête
           ' ici mon autre formatage
           Print #1, machaine
           NUMORDVERIF = Var0
         End If
     
         I = I + 1
         oRst.MoveNext
      Wend
     
      oRst.Close:set oRst=nothing
      Close #1
     
    end sub
    Dans ton code principal il te suffit ensuite d'écrire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private sub ProcedurePrinipale()
    .
    .
    .
    call TraiterRequete("SELECT * FROM Commandes_Nomades"):'répéter pour chacune de tes requêtes.
    .
    .
    .
     
    end sub
    Et à mettre en début de module juste après le Option Compare Database :
    Option Explicit

    cela oblige la déclaration de variable avec un instrcution dim. C'est une bonne pratique pour éviter les bugs. À mes débuts en informatique, j'ai passé 1 semaine à chercher une erreur de ce type avant que mon prof me fasse remarqué que j'avais une variable qui s'appelait PI et une qui s'appelait P1 et que celle que je voulais c'était PI.

    Tu peux paramétrer Access pour l'ajouter automatiquement à tous les nouveaux modules en allant dans le menu outils/option de l'éditeur de code onglet 'Éditeur' et cocher 'Déclaration des variables obligatoires'.

    Autre point à propos des variables essayes toujours de définir un type exact pour tes variables, le type variant doit être utiliser avec précaution car c'est un type 'foure-tout'.

    Dernier point lors d'une déclaration multiple si tu écrit :
    a et b sont de type variant, c est de type integer, Si tu veux 3 integers il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim a as integer, b as integer, c as integer
    Si tu as des questions, n'hésite pas.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 685
    Par défaut
    Merci marot_r,


    A la lecture de ta réponse, je ne suis pas étonné de voir que tu portes 5 étoiles

    Je vais relire, de suite, tranquillement le tout car il y a beaucoup de choses trés intéressantes dans ta réponse approfondie.

    Je tiens à préciser que je suis obligé de me remettre à Access depuis qq temps pour mon travail (je suis formateur en logiciel de gestion et le dév est un petit plaisir en + permettant de répondre à qq demandes ponctuelles). Mais je passe mon temps à m'autoformer sans cesse. Et ce superbe forum, m'aide grandement aussi bien sur SQL server, sur le langage SQL, sur VB6, sur Access et sur Excel. C'est pas difficile, je le conseille à tous mes collègues

    Bonne soirée et merci
    au boulot maintenant ....


  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 685
    Par défaut
    9a y est. J'ai lu et "compris" la solution.

    Mais il me reste une question.
    Dans la partie procédure, j'ai actuellement ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open "C:\SQL_NOMADES\envoiFTP\Bons_Commande.txt" For Output As #1
    J'ai besoin d'appeller 4 fois la procédure mais que cela me génère 4 txt différents : bons_commande1.txt puis bons_commande2.txt...

    Est-ce qu'il est possible de faire qq chose du genre ? exemple : c'est la trosième fois que j'appelle la procédure donc le fichier sera "bons_commande" & compteur & ".txt" ? et comment alimenter ce compteur ?

    MErci

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Le plus simple est d'ajouter un paramêtre à la procédure pour donner le numéro du fichier.

    un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TraiterRequete(prmRequeteSQL as string, prmNumFichierSortie as integer)
    et modifier le code pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open "C:\SQL_NOMADES\envoiFTP\Bons_Commande" & prmNumFichierSortie & ".txt" For Output As #1
    Autre solution plus avancée, dans la procédure principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dim SQLRequete as string(4)
    dim i as integer
    i=0
    i=i+1:SQLRequete(i)="...." :'Ta première requete
    i=i+1:SQLRequete(i)="...." :'Ta 2ième requete
    i=i+1:SQLRequete(i)="...." :'Ta 3ième requete
    i=i+1:SQLRequete(i)="...." :'Ta 4ième requete
     
    for i=1 to ubound(SQLRequete)
       call TraiterRequete(SQLRequete(i),i)
    next i
    Sinon encore plus avancé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim SQLRequete as variant
    SQLRequete=Array("SQL R1", "SQL R2", "SQL R3", "SQL R4"):'Crée un tableau de 4 chaînes de caractère numérotées de 0 à 3
     
    dim i as integer : for i=lbound(SQLRequete) to ubound(SQLRequete)
      call TraiterRequete(SQLRequete(i),i+1):'Le +1 compense le 0 du départ
    next i
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 685
    Par défaut
    MErci beaucoup pour ta réponse complète

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment éviter de répéter du code
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/11/2011, 10h45
  2. [SQL 2k8] Est ce possible d'éviter les boucles
    Par lerieure dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/04/2011, 09h41
  3. Réponses: 3
    Dernier message: 29/07/2003, 09h38
  4. Réponses: 2
    Dernier message: 16/05/2003, 10h14
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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