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 :

Comment diminuer le nombre de lignes de code


Sujet :

VBA Access

  1. #1
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut Comment diminuer le nombre de lignes de code
    Bonjour,

    je vous expose mon problème:

    Voilà mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub AddCritUOPrice_Click()
    Call OuvrirSelectCritere("AddCritUOPrice", "texte")
    End Sub
    Private Sub AddCritUOVersion_Click()
    Call OuvrirSelectCritere("AddCritUOVersion", "liste")
    End Sub
    Private Sub AddCritUOCPIL_SGIS_Click()
    Call OuvrirSelectCritere("AddCritUOCPIL_SGIS", "liste")
    End Sub
    J'ai deux question à propos de ce code:
    Comme vous pouvez le constater, à chaque clic sur un bouton, j'appelle une procédure. J'aurais aimé savoir s'il est possible, plutôt que de marquer à la main le nom du contrôle sur lequel je viens de cliquer, de pouvoir le récupérer.
    un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub AddCritUOCPIL_SGIS_Click()
    Call OuvrirSelectCritere(LeNomDuDernierContrôleCliqué, "liste")
    End Sub
    La deuxième question:
    Comme vous avez pu le constater, à chaque clic sur les boutons, j'effectue toujours la même action (il y a juste le nom du contrôle qui change).
    Le nombre de Sub comme celles que je vous ai écrit se compte par dizaines dans mon code.
    Existe-t-il des fonctions sur access qui feraient un truc comme ça:
    - A chaque fois que je clique sur un bouton (n'importe le quel)
    - Prends le nom du bouton
    - Appelle la procédure machin

    Tout simplement, existe-t-il des fonctions qui sont capables de remplacer des dizaines de "Sub machin_clic" en faisant un "Sub tous_les_contrôles_clic"
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  2. #2
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    mai 2004
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mai 2004
    Messages : 1 571
    Points : 2 581
    Points
    2 581
    Par défaut
    Bonjour

    Pour ta première question : as-tu déjà essayer Me.Name pour récupérer le nom du control ?

    Il n'existe pas de solution (à ma connaissance) pour la seconde question : pas de code "OnClick" qui puisse être générique.
    Christophe (cavo789)
    Mes scripts Open Source : https://github.com/cavo789

  3. #3
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    le problème, c'est que Me.name me renvoie le nom du formulaire, et pas le nom du contrôle sur lequel je viens de cliquer
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  4. #4
    Membre régulier
    Avatar de wape
    Profil pro
    Inscrit en
    février 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : février 2003
    Messages : 90
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Pour la question 1, essaye avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub AddCritUOPrice_Click()
    MsgBox "Nom du bouton : " & ActiveControl.Name
    End Sub
    Pour la question 2, oui c'est possible (en passant par un module de classe).

    wape

  5. #5
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Merci, ta solution à la question 1 fonctionne à merveille

    En ce qui concerne la question 2, qu'entends-tu par "module de classe" ?
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  6. #6
    Membre régulier
    Avatar de wape
    Profil pro
    Inscrit en
    février 2003
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : février 2003
    Messages : 90
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Sans trop entrer dans les détails, un module de classe permet de créer... une classe, dans
    laquelle on définit, par exemple, un ou des événement(s) commun(s) à plusieurs contrôles.

    wape

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2005
    Messages : 4 485
    Points : 7 643
    Points
    7 643
    Par défaut
    Bonjour,

    tu peux essayer ceci.

    Créer une fonction publique dans un module de code (pas celui du formulaire)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function ClicFormulaire(strFormName As String)
    ' Appelle Sub publique ClicCommun dans formulaire passé en argument
    Forms(strFormName).ClicCommun
    End Function

    Dans le module de code du formulaire, créer une Sub publique ClicCommun
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub ClicCommun()
    MsgBox Me.ActiveControl.Name, , "ClicCommun"
    End Sub

    Dans la propriété "Sur Clic" des boutons mettre
    Lorsqu'on clique sur un bouton cela appelle la fonction publique ClicFormulaire, qui elle-même appelle la sub publique ClicCommun du formulaire.

    C'est bizarre mais ça à l'air de fonctionner.

    A+

  8. #8
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Pas mal du tout !

    Je vais essayer !

    Merci !
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  9. #9
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    ça n'a pas l'air de fonctionner

    'L'expression sur clic entrée comme paramètre de la propriété de type événement est à l'origine d'une erreur. L'expression entrée comporte un nom de fonction introuvable"

    je pense que j'ai dû faire une erreur quelque part...

    j'ai mis ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function ClicFormulaire(strFormName As String)
    ' Appelle Sub publique ClicCommun dans formulaire passé en argument
    Forms(f_extract).ClicCommun
    End Function
    dans un module que j'ai créé (à partir de VBA, clic droit, insertion, module).
    Le module s'appelle ClicFormulaire, et il contient la fonction ClicFormulaire
    Donc pour l'appeler à partir du code, il faut faire ClicFormulaire.ClicFormulaire(nomform).
    mais apparemment pour l'appeler à partir d'un contrôle du form, il ne veut pas de =ClicFormulaire(["F_Extract"])

    Tu as une idée ?
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  10. #10
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    ça marche !

    j'ai modifié le nom du module, je pense que ça fonctionnait mal parce que le module et la fonction avaient le même nom.

    Merci beaucoup en tout cas, je vais pouvoir réduire considérablement la quantité de code de mon form !

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  11. #11
    Expert éminent
    Avatar de cafeine
    Inscrit en
    juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 3 904
    Points : 6 670
    Points
    6 670
    Par défaut
    Hello,

    Je te donne ma technique qui en est une parmi d'autres :
    Sur l'événement load de mon formulaire je réattribue un code à mes boutons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For each ctl in me.controls
     if ctl.controltype= acbutton
      ctl.onClick = "=UneFonction(""" & ctl.name & """)"
     end if
    next ctl
    et j'écris donc la fonction qui récupère à tous les coups le nom du contrôle qui l'a lancé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function UneFonction(byval ctlName as string)
    ' met ton code
    end Function
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  12. #12
    Membre habitué
    Inscrit en
    mars 2007
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : mars 2007
    Messages : 337
    Points : 188
    Points
    188
    Par défaut
    Puissant !!!!

    Super !

    Simple question, on peut appeler n'importe quelles fonctions, comme celles contenues dans le formulaire, ou on ne peut appeler que les fonctions contenues dans des modules ?

    et j'ai un petit souci:
    suivant les boutons, j'utilise les 2 méthodes qui m'ont été proposées:
    - mettre =ClicFormulaire("F_Extract") directement dans les propriétés du bouton, dans le form
    - mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each ctl In Me.Controls
     If TypeOf ctl Is CommandButton And Left(ctl.name, 3) = "Del" Then
        ctl.OnClick = "=delcrit(""" & ctl.name & """)"
     End If
    Next ctl
    sur l'événement form_load.

    Jusque là, tout va bien.
    Seulement maintenant, j'aurais besoin d'utiliser la première méthode, en tapant directement dans les propriétés l'appel d'une fonction.
    Seulement j'ai besoin d'envoyer 2 critères, et là ça n'a pas l'air de plaire à access:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =OuvrirSelectCritere(ActiveControl.name, "texte")
    'ou
    =OuvrirSelectCritere("addcrituocode","texte")
    résultat: La syntaxe de l'opération entrée n'est pas correcte. vous avez omis une opérande ou un opérateur, vous avez entré un caractère ou une virgule non valides, ou encore du texte sans le délimiter par les guillemets.

    Comment on fait pour passer 2 critères, il y a une façon particulière ?
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

  13. #13
    Membre actif
    Inscrit en
    mai 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : mai 2006
    Messages : 179
    Points : 222
    Points
    222
    Par défaut
    une autre astuce est pour un click sur un boutons de ne pas utiliser un lancement de code mais de lancer une macro ==> plusieurs boutons peuvent lancer la même macro.

    Pour répondre à ta première intervention ==> moins on ecrit de ligne VBA, moins on a de boggue sur la durée de vie de son application==> une application parfaite est une application qui n'a plu de ligne VBA écrite ==> là ,c'est plus dur à faire !!

  14. #14
    Expert éminent
    Avatar de cafeine
    Inscrit en
    juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 3 904
    Points : 6 670
    Points
    6 670
    Par défaut
    On peut évidemment passer plusieurs critères, mais j'avoue que je n'ai pas compris ce que tu voulais faire ...
    on peut appeler une fonction du moment qu'elle est à notre portée :
    soit Private mais dans le module du formulaire
    soit Public dans un module de code ...
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



  15. #15
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : décembre 2005
    Messages : 4 485
    Points : 7 643
    Points
    7 643
    Par défaut
    Pour ta deuxième question, utilise le point virgule comme séparateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =OuvrirSelectCritere("addcrituocode"; "texte")
    Il s'agit d'une expression, comme pour la source d'un contrôle indépendant.

    +A

Discussions similaires

  1. [Outils] Comment compter le nombre de lignes ?
    Par ChristopheOce dans le forum EDI/Outils
    Réponses: 3
    Dernier message: 18/04/2011, 12h36
  2. Réponses: 4
    Dernier message: 05/05/2006, 23h52
  3. Calculer le nombre de ligne de code source
    Par yanis97 dans le forum Qualimétrie
    Réponses: 4
    Dernier message: 04/07/2005, 22h02
  4. [Général] Nombre de lignes de code d'un projet
    Par bigquick dans le forum MFC
    Réponses: 7
    Dernier message: 30/03/2005, 09h14
  5. [netbeans][Linux] Nombre de lignes de codes
    Par sylvain_neus dans le forum NetBeans
    Réponses: 5
    Dernier message: 13/08/2004, 10h09

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