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 :

Désactiver une partie du code VBA suivant des critères


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut Désactiver une partie du code VBA suivant des critères
    Bonjour

    Voila en fait j'aurai voulu savoir s'il etait possible de desactiver une partie du code VBA d'un de mes programmes fonction de la valeur d'une variable.

    Quand je parle de desactiver du code ça signifie soit mettre des lignes en commentaire ou soit sauter des instructions.

    Voila si quelqu'un peut me lancer sur une piste ca seriat sympa.

    Amicalement Scons.
    Amicalement Scons

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Bonjour,

    L'instruction if then else semble faite pour toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if taVariable = valeur1 then
    code
    elseif taVariable = valeur2 then
    autreCode1
    else
    autreCode2
    end if

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Tu peux aussi utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select case taVariable
       case valeur1
          'Faire ci
       case valeur2
          'Faire cela
       case else
          'Faire autre chose
    end select
    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.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    Salut

    Merci pour ta réponse (qui m'as bien fait sourire d'ailleurs).
    C'est loin d'être si simple que ça et je tien a préciser que je ne suis pas débutant en vba.

    Si je demande comment je peu sauter ou désactiver de mes lignes de codes c'est que je ne peu pas m'en sortir autrement.

    La boucle if ne permet pas de se sortir de tous les cas de figures.
    Si tu veus je peu te poster mon prog mais je pense qu'il est trop long.

    Voici quelques explication sur mon prog si ca t'interesses
    En fait il s'agit d'un programme qui ouvre un repertoire puis chacun des fichiers excel qui s'y trouve.
    Apres par l'intermediaire d'une macro excel je rapatrie les données dans access.

    Tout ceci en separant les doublons des autres données (une table doublons et une table factures)

    Si tu veut plus de precisions ou carrement tout mon code n'hesite pas.

    Amicalement Scons
    Amicalement Scons

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Va y pour le détail, on y verra plus clair !

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    Voici mon prog.

    Ce que j'aimerais faire c'est laisser le choix a l'utilisateur de tout reextraire ou alors de ne prendre que les nouvelles factures du repertoires.

    Du coup s'il choisi de tout reextraire le "select case extraction" n'as plus lieu d'etre, c'est pour ca que je voudrai deasactiver cette partie du code.
    je sais pas si c'est tres claire alors n'hesitez pas a me faire part de vos remarques
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
     
    Private Sub Commande21_Click()
     
    'importer toutes les factures d'un repertoire
    Dim bd As Database
    Dim reponse As String
    Dim repertoire As String
    Dim fichier As String
    Dim extension As String
    Dim animal As String
    Dim année As Integer
    Dim semaine As String
    Dim extraction As String
    Dim i As Integer
    Dim j As Integer
    Dim Rst As Recordset
    Dim rst1 As Recordset
    Dim texte As String
     
    Set bd = CurrentDb 'definition de la base de données de reference (celle en cours)
    Set rst1 = bd.OpenRecordset("doublons", dbOpenDynaset)
    DoCmd.RunSQL "ALTER TABLE factures DROP CONSTRAINT PrimaryKey" 'on enleve la clé primaire pour eviter le bloquage du prog sur les doublons
     
    'C:\Documents and Settings\CUMA de l'Onglet\Mes documents\CUMAFACTURE
     i = 0 'initialisation du compteur de factures extraites
     j = 0 'initialisation du compteur de doublons
     
     extension = "*.xls" 'selection de l'extension à rechercher dans le repertoire
     
     animal = InputBox("type d'animal desiré?") 'selection du type de facture à importer
     année = InputBox("quelle année?") 'choix de l'année des factures
     reponse = MsgBox("lancer l'import", vbYesNo, "import des factures") 'demande de confirmation de lancement de la tache
     
     Select Case reponse 'suivant la reponse
     Case vbYes 'si oui
     'MsgBox ("appuyer sur echap pour arreter la tache a tout moment")
        'While GetAsyncKeyState(27) = 0 'tant que la touche echap n'as pas été pressé on poursui la tache
         If animal = "agneaux" Then
            excel.Workbooks.Open ("E:\agneaux\2008\Facture vierge AGNEAUXP") 'ouverture du fichier contenant la macro
            repertoire = ("E:\agneaux\" & année & "\") 'definition du repertoire de recherche
                ElseIf animal = "bovins" Then
                excel.Workbooks.Open ("E:\GROSBOVIN\2008\Facture vierge bovinP.xls")
                repertoire = ("E:\GROSBOVIN\" & année & "\")
                    ElseIf animal = "porcs" Then
                    excel.Workbooks.Open ("E:\Porcs\2008\Facture vierge porcsP.xls")
                    repertoire = ("E:\Porcs\" & année & "\")
                        ElseIf animal = "veaux" Then
                        excel.Workbooks.Open ("E:\Veaux\2008\Facture vierge veauxP.xls")
                        repertoire = ("E:\Veaux\" & année & "\")
         End If
     
        fichier = Dir(repertoire & extension) 'association du repertoire et l'extension pour obtenir uniquement le nom du fichier
        MsgBox (fichier) 'affichage du premier fichier du repertoire
     
      Do Until Left(fichier, 14) = "Facture vierge" Or fichier = "" 'parcours du repertoire
          excel.Workbooks.Open (repertoire & fichier) 'ouverture du fichier excel
          extraction = Cells(2, 9).Value
        Select Case extraction
         Case Is <> "OUI"
          Cells(2, 9).Value = "non"
          Select Case animal
     
           Case "agneaux"
            Set Rst = bd.OpenRecordset("factures", dbOpenDynaset) 'ouverture du recordset pour parcours de la table factures
             With Rst
               Do While Not .EOF And i >= 1 'tant qu'on est pas en fin de table ou qu'on est pas dans la cas d'un premier enregistrement
               texte = Mid(Cells(12, 1), 12, 35) 'stockage du numero de facture dans une variable
               Rst.FindFirst "[numero facture] like'" & texte & "'" 'comparaison du numero facture du fichier excel et de la table factures
               If Rst.NoMatch Then 'si ils ne sont pas egaux on insere
                   excel.Application.Run ("'Facture vierge AGNEAUXP.xls'!extractagneaux") 'exceution de ma macro d'import des données
                   Rst.Close 'fermeture du recordset
                   Set Rst = Nothing 'liberation des ressources
                   Exit Do 'on sort de la boucle
               Else 'sinon
                 With rst1
                 rst1.AddNew 'c'est un doublons, donc on l'insere dans la table doublons
                 ![type facture] = Worksheets("Feuil1").Range("I1")
                 ![date facture] = Worksheets("Feuil1").Range("b11")
                 ![numero facture] = Mid(Worksheets("Feuil1").Range("a12"), 12)
                 rst1.Update
                 j = j + 1 'incrementation du compteur de doublons
                 End With
                 Exit Do
               End If
               Loop
                   If i < 1 Then ' cas de la premiere importation ou on ne peut pas avoir de doublons
                   excel.Application.Run ("'Facture vierge AGNEAUXP.xls'!extractagneaux")
                   Rst.Close
                   Set Rst = Nothing
                   End If
              End With
     
           Case "bovins"
             Set Rst = bd.OpenRecordset("factures", dbOpenDynaset)
               With Rst
               Do While Not .EOF And i >= 1
               texte = Mid(Cells(12, 1), 12, 35)
               Rst.FindFirst "[numero facture] like'" & texte & "'"
               If Rst.NoMatch Then
                   excel.Application.Run ("'Facture vierge bovinP.xls'!extractbovins")
                   Rst.Close
                   Set Rst = Nothing
                   Exit Do
               Else
                 With rst1
                    rst1.AddNew
                    ![type facture] = Worksheets("Feuil1").Range("I1")
                    ![date facture] = Worksheets("Feuil1").Range("b11")
                    ![numero facture] = Mid(Worksheets("Feuil1").Range("a12"), 12)
                    rst1.Update
                    j = j + 1
                    End With
                    Exit Do
                  End If
                  Loop
                   If i < 1 Then
                   excel.Application.Run ("'Facture vierge bovinP.xls'!extractbovins")
                   Rst.Close
                   Set Rst = Nothing
                   End If
              End With
     
           Case "porcs"
            Set Rst = bd.OpenRecordset("factures", dbOpenDynaset)
              With Rst
               Do While Not .EOF And i >= 1
               texte = Mid(Cells(12, 1), 12, 35)
               Rst.FindFirst "[numero facture] like'" & texte & "'"
               If Rst.NoMatch Then
                   excel.Application.Run ("'Facture vierge porcsP.xls'!extractporcs")
                   Rst.Close
                   Set Rst = Nothing
                   Exit Do
               Else
                 With rst1
                 rst1.AddNew
                 ![type facture] = Worksheets("Feuil1").Range("I1")
                 ![date facture] = Worksheets("Feuil1").Range("b11")
                 ![numero facture] = Mid(Worksheets("Feuil1").Range("a12"), 12)
                 rst1.Update
                 j = j + 1
                 End With
                 Exit Do
               End If
               Loop
                   If i < 1 Then
                   excel.Application.Run ("'Facture vierge porcsP.xls'!extractporcs")
                   Rst.Close
                   Set Rst = Nothing
                   End If
              End With
     
           Case "veaux"
            Set Rst = bd.OpenRecordset("factures", dbOpenDynaset)
              With Rst
               Do While Not .EOF And i >= 1
               texte = Mid(Cells(12, 1), 12, 35)
               Rst.FindFirst "[numero facture] like'" & texte & "'"
               If Rst.NoMatch Then
                   excel.Application.Run ("'Facture vierge veauxP.xls'!extractveaux")
                   Rst.Close
                   Set Rst = Nothing
                   Exit Do
               Else
                 With rst1
                 rst1.AddNew
                 ![type facture] = Worksheets("Feuil1").Range("I1")
                 ![date facture] = Worksheets("Feuil1").Range("b11")
                 ![numero facture] = Mid(Worksheets("Feuil1").Range("a12"), 12)
                 rst1.Update
                 j = j + 1
                 End With
                 Exit Do
               End If
               Loop
                   If i < 1 Then
                   excel.Application.Run ("'Facture vierge veauxP.xls'!extractveaux")
                   Rst.Close
                   Set Rst = Nothing
                   End If
              End With
           End Select
           i = i + 1 'incrementation du compteur de factures extraites
           excel.Application.DisplayAlerts = False 'permet de ne pas afficher de message d'alerte comme le verificateur de compatibilité
           ActiveWorkbook.Close True 'fermeture de fichier precedent en sauvegardant les modifications
           Set Workbook = Nothing
           fichier = Dir
           excel.Application.Wait (Now + TimeValue("0:00:03"))
        Case non
          ActiveWorkbook.Close False 'fermeture de fichiersans sauvegarder
          Set Workbook = Nothing
          fichier = Dir
        End Select
      Loop
          rst1.Close 'fermeture du 2ieme recordset
          Set rst1 = Nothing
          MsgBox ("import des données terminées")
          MsgBox ("le nombre de factures importées de: " & i - j)
          If j <> 0 Then
          MsgBox ("nombre de doublons touvées: " & j) 'affichage seulement en cas de doublons
          End If
          excel.Workbooks.Close
          Set Workbook = Nothing
          excel.Application.Quit
          DoCmd.RunSQL "ALTER TABLE factures ADD CONSTRAINT PrimaryKey PRIMARY KEY ([numero facture])" 'on remet la clé primaire qui dira si on a oui ou non des doublons
     
     Case vbNo 'si la reponse on est non alors on annule l'operation
     DoCmd.CancelEvent
     End Select
     
    End Sub
    Amicalement Scons
    Amicalement Scons

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Me parait bizarre
    doit être plus approprié
    Sinon, en survolant, il me semble que tu pourrais gagner beaucoup en clarté en remplaçants les case animal par des variables.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    If animal = "agneaux" Then
            excel.Workbooks.Open ("E:\agneaux\2008\Facture vierge AGNEAUXP") 'ouverture du fichier contenant la macro
            repertoire = ("E:\agneaux\" & année & "\") 'definition du repertoire de recherche
                ElseIf animal = "bovins" Then
                excel.Workbooks.Open ("E:\GROSBOVIN\2008\Facture vierge bovinP.xls")
                repertoire = ("E:\GROSBOVIN\" & année & "\")
                    ElseIf animal = "porcs" Then
                    excel.Workbooks.Open ("E:\Porcs\2008\Facture vierge porcsP.xls")
                    repertoire = ("E:\Porcs\" & année & "\")
                        ElseIf animal = "veaux" Then
                        excel.Workbooks.Open ("E:\Veaux\2008\Facture vierge veauxP.xls")
                        repertoire = ("E:\Veaux\" & année & "\")
         End If
    pourrait être remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    If animal = "agneaux" or "porc" or "veaux" Then
            excel.Workbooks.Open ("E:\" & animal & "\2008\Facture vierge " & ucase(animal) & "P") 'ouverture du fichier contenant la macro
            repertoire = ("E:\ & animal & \" & année & "\") 'definition du repertoire de recherche
             ElseIf animal = "bovins" Then
                excel.Workbooks.Open ("E:\GROSBOVIN\2008\Facture vierge bovinP.xls")
                repertoire = ("E:\GROSBOVIN\" & année & "\")
             else 
                 msgbox "animal inconnu"
                 exit sub
             End If
    L'abandon de ta clé me semble intervenir trop tôt, si tu la place seulement en cas de confirmation, tu évites un risque d'erreurs.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    Merci pour ta réponse c'est sympa d'avoir pris le temps de regarder mon prog.

    J'essaierai de faire les modifs que tu m'as soumit pour comparer le temps d'exécution.

    Pour le case "non" tu as raison j'avais bien oublié les guillemets mais cette partie de code est en commentaire chez moi, vu qu'elle est pas opérationnelle donc ça ne portait pas a conséquence pour le moment

    Par contre as tu une idée sur ma réelle problématique qui serait de pouvoir désactiver certaines lignes de mon code ou de les sauter?

    Amicalement Scons
    Amicalement Scons

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Le problème n'est pas tant les temps d'éxécution, mais la maintenance de ton code si tu dois modifier quelquechose.

    Pour le passage des lignes, les conditionnelles devraient normalement être suffisantes.
    J'avoue ne pas avoir vu où le choix de l'extraction totale était fait donc je ne peux pas t'apporter de détails.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 427
    Points : 520
    Points
    520
    Par défaut
    Si la conditionnelle ne marche pas c'est visiblement parce que tu as des niveaux d'imbrication trop élevés.

    Il faut que tu clarifies ton code et que tu vérifies bien les ouvertures et fermeture de blocs de condition et les entrées et sorties de boucles.

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Pour simplifier et clarifier le code je ferai des procédures séparées pour traiter chaque catégorie d'animaux. Cela permettrait de tester ton code morceau par morceau.

    Quand à

    Quand je parle de desactiver du code ça signifie soit mettre des lignes en commentaire ou soit sauter des instructions.
    je ne comprend vraiement pas ce que tu entends par là autres que les instructions de branchement conditionnels mais il reste aussi le GOTO qui n'a pas été mentionné. Même s'il n'est vraiment pas recommandé il peut rendre de grands services pour sortir d'un arbérescence de test complexe.

    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.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    Hello, Merci pour toutes vos remarques ça vas sans doute me permettre d'avancer.

    C'est vrai que j'aurais pu faire quelques procédures séparées mais mon programme fonctionne parfaitement alors du coup je vais le garder comme ça.

    Je vais essayer en utilisant la commande GOTO et je vous dirai si ça fonctionne.
    J'y ai également pensé hier soir, car c'est vrai que c'est vieille commande qu'on a tendance a laissé de coter mais elle peut s'averer utile.

    Amicalement Scons
    Amicalement Scons

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 153
    Points : 86
    Points
    86
    Par défaut
    hello

    Un grand merci a tous pour votre aide.
    J'ai enfin réussi a terminer ce programme avec l'aide de la commande goto.

    si quelqu'un veut récupérer du code qu'il n'hésite pas a me contacter

    Amicalement Scons
    Amicalement Scons

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

Discussions similaires

  1. [XL-2010] Création d'une classeur générant un code suivant des critères
    Par tma2012cauret dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 08/07/2014, 17h19
  2. Prob pour exporter une macro en code VBA
    Par electrosat03 dans le forum Access
    Réponses: 6
    Dernier message: 04/02/2006, 19h15
  3. [VTemplate] Choix suivant des critères comme le support Php5, code Xhtml compliant ?
    Par El Riiico dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 05/12/2005, 10h28
  4. une partie du code a disparu
    Par recup dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 08/03/2005, 10h08
  5. Indenter une partie du code
    Par KooX dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/05/2004, 17h38

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