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 Discussion :

Point d'exclamation en vb


Sujet :

VBA

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 106
    Points : 56
    Points
    56
    Par défaut Point d'exclamation en vb
    bonjour
    je n ai pas compris la signification du point d'exclamation dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set rs = cn.OpenSchema(adSchemaColumns)
        While Not rs.EOF
            If rs!table_name = listbox1.Text Then
                Champs.AddItem rs!COLUMN_NAME
            End If
            rs.MoveNext
        Wend
        rs.Close
    merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour hellalaboy,

    Le caractère "!" est un "opérateur d'accès spécial".
    C'est un raccourci syntaxique pour accéder à un élément au sein d'une hiérarchie de classes.
    Cet opérateur d'accès utilise les propriétés par défaut des classes.

    Dans ton cas, la racine est rs un objet instance de la classe Recordset.

    La propriété par défaut de la classe Recordset est Get Fields() qui retourne un objet instance de la classe Fields.

    Un objet Fields recense une collection d'objets instances de la classe Field, et qu'il peut désigner au moyen de 2 index:
    * un index numérique qui représente la position de l'objet Field dans la collection;
    * un index textuel pour désigner un objet Field au moyen d'un "nom" (une clé textuelle).

    La propriété par défaut de la classe Fields est Get Item(vIndex As Variant) qui retourne un objet appartenant à la collection, désigné par une valeur d'index.

    Tu n'es pas obligé d'utiliser l'opérateur d'accès "!".
    A la place, on peut employer la syntaxe complète équivalente qui serait celle-ci:
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Set rs = cn.OpenSchema(adSchemaColumns)
     
        While Not rs.EOF
            If rs.Fields.Item("table_name").Value = listbox1.Text Then
                Champs.AddItem rs.Fields.Item("COLUMN_NAME").Value
            End If
            rs.MoveNext
        Wend
        rs.Close

    Le fonctionnement de l'opérateur d'accès "!" est générique et s'appuie sur les propriétés par défaut (et pas sur les noms des propriétés).
    Le développement "en interne" de l'expression:
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    <objet racine>!<valeur d'index>
    donnerait ceci:
    Code texte : Sélectionner tout - Visualiser dans une fenêtre à part
    <objet racine>.<propriété par défaut de la racine>.<propriété par défaut de la classe "collection">("<valeur d'index>")

    Il est donc possible à un développeur VB/VBA de concevoir sa propre hiérarchie de classes compatible avec l'emploi de "!".
    _

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut La puissance du "!" ;)
    Bonjour,

    En fait l'opérateur d'accès aux membres "!" n'est pas documenté dans mes vieilles versions de VB6 ou VBA !?

    Mais j'ai trouvé une info sur MSDN.
    Voici un lien vers le site MSDN qui donne des explications plus précises:
    Visual Basic: caractères spéciaux dans le code


    Une information pour les curieux !

    En effectuant des tests, je me suis rendu compte que l'opérateur d'accès aux membres "!" est très puissant...
    Il peut parcourir par itération toute une hiérarchie de classes, d'une profondeur quelconque (!!!), pour s'arrêter seulement quand il accède à une propriété Get par défaut qui accepte un paramètre de type String.

    Saviez-vous que cet opérateur était aussi puissant ???

    [EDIT]

    BONUS !

    Et ce qui est vrai pour "!" l'est aussi pour l'utilisation des parenthèses !
    En effet, l'expression <objet racine>(chaîne clé d'index) est aussi évaluée avec parcours itératif de toute une hiérarchie de classes jusqu'à atteindre la propriété par défaut qui convient !

    En conclusion:
    __ rs("table_name")
    aussi fort que
    __ rs!table_name
    tout deux équivalents à
    __ rs.Fields.Item("table_name")

    [/EDIT]

    _

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 595
    Points : 34 271
    Points
    34 271
    Par défaut
    salut,
    et un pavé dans la mare :
    l'accès lié au "!" est-il aussi plus rapide ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Salut jpcheck !
    Citation Envoyé par jpcheck Voir le message
    et un pavé dans la mare :
    l'accès lié au "!" est-il aussi plus rapide ?
    Avant de te répondre, je fais un commentaire sur les informations données par Microsoft dans le lien que j'ai donné précédemment:

    Citation Envoyé par MSDN Visual Studio 200* >> Visual Basic >> Caractères spéciaux dans le code

    Remarque

    Les références aux collections par défaut doivent être explicites.
    En particulier, vous ne pouvez pas utiliser l'opérateur ! dans une variable à liaison tardive.
    Cette remarque est peut être vraie pour les versions .NET de Visual Basic, mais elle ne s'applique pas pour VBA et VB6.

    En effet, le code ci-dessous s'exécute parfaitement (on suppose une exécution avec Access, dans une BD qui contient une table nommée T_Table avec un champ nommé Id):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim o As Object
     
        Set o = CurrentDb.OpenRecordset("T_Table")
     
        Debug.Print o!Id
    Il s'agit d'une liaison tardive... et les propriétés par défaut sont "découvertes" au moment de l'exécution !

    Donc (maintenant je peux te répondre ) l'utilisation de l'opérateur "!" est plus lente, comparée à une expression complète qui énumère les propriétés utilisées.

    Mais son intérêt réside d'abord dans la généricité et l'universalité de son emploi, notamment grâce à la liaison tardive.
    _

  6. #6
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 62
    Points
    62
    Par défaut
    L'utilisation des ces raccourcis sous VB6 et VBA:
    ! au debut pour .fields (!nomChamp),
    $ pour le type string etc (var$)

    est absolument a proscrire.
    ca fait gagner 2 millisecondes et quelques caractères a l'écriture...

    Par contre ca fait perdre deux heures au pauvre type qui doit reprendre le code.... Bref, au point de vue maintenance c'est une horreur !

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Par contre ca fait perdre deux heures au pauvre type qui doit reprendre le code.... Bref, au point de vue maintenance c'est une horreur !
    Hmm ... faut quand même espérer qu'un developpeur VB est quand même capable de comprendre la syntaxe ! et les autres $ ... Partant du constat que le développeur connait son domaine, je ne vois pas en quoi cela devrait être évité.

Discussions similaires

  1. Réponses: 10
    Dernier message: 04/11/2006, 18h16
  2. point d'exclamation avant le nom de la variable
    Par khamed dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 20/07/2006, 01h12
  3. [Mail] envoi par mail : pb de point d'exclamation
    Par Faure dans le forum Langage
    Réponses: 12
    Dernier message: 20/03/2006, 12h02
  4. Réponses: 6
    Dernier message: 16/03/2006, 12h17
  5. pb de point d'exclamation dans le gestionnaire de périphériq
    Par loveflower dans le forum Périphériques
    Réponses: 21
    Dernier message: 20/01/2006, 10h43

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