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

Macros et VBA Excel Discussion :

Vérifier l'identité de deux variables Range [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Finance d'entreprise
    Inscrit en
    Juin 2016
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Finance d'entreprise
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2016
    Messages : 184
    Par défaut Vérifier l'identité de deux variables Range
    Bonjour,

    N'y a-t-il que des moyens indirects (comparer les propriétés) pour vérifier l'identité de deux variables Range ou plus généralement Objet?

    J'écrirais la chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test
     
        Dim a As Range
        Dim b As Range
     
        Set a = Range("A1")
        Set b = Range("A1")
     
        If a Is b Then MsgBox """a"" se réfère à la même cellule que ""b"""
     
    End Sub
    mais la condition ne se remplit pas.

    Cordialement

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    a et b sont deux variables distinctes, même si elle se réfèrent au même objet. a n'EST donc pas b.
    L'égalité de deux objets se fait par utilisation du signe d'égalité (=) et non par utilisation de Is

    NB : je saisis cette occasion pour montrer (à ce propos) combien il est important de ne jamais utiliser les "largesses" de VBA (les propriétés utilisées par défaut).
    Il y a très récemment eu une discussion à ce sujet et un exemple avait été donné. En voilà un autre très criant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub CommandButton1_Click()
       Dim a As Range, b As Range
        Set a = Range("A1")
        Set b = Range("B1")
        If a = b Then MsgBox "oui" Else MsgBox "non"
    End Sub
    les objets a et b n'étant pas les mêmes, "non" s'affichera ... SAUF SI ... sauf si le contenu des cellules A1 et B1 est par malheur le même, car VBA, dans sa grande volonté de se montrer "bon" (et finalement tellement "faux-ami") pensera qu'on a parlé du contenu par défaut !
    EDIT : et ce sera encore pire dans d'autres cas. Prenons par exemple celui des boutons de commande -->> imaginons que a en soit un --->> en le "lisant" que a, notre "ami le généreux" VBA se substituera à nous pour décider que nous voulons utiliser sa valeur par défaut, qui est .... une booléenne.
    Et en comparant a et b (si deux boutons de commande) on trouvera une égalité du seul fait de l'égalité de leur état.

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour

    unparia

    Heureusement pour l'auteur de la discussion, tu n'as pas poussé le vice avec le mélange des genres entre .Value et .Text ... et que tu as tout simplement parlé de "contenu" sans expliciter si c'est le contenu affiché ou le contenu présent dans la barre de formule




    Pour en revenir à la problématique initiale, tu as mis le doigts sur la bonne méthodologie : utiliser une propriété de ces objets pour les comparer

    des exemples en vrac :

    - l'adresse de ces objets range (attention à ne pas oublier de vérifier le .Parent)
    - l'intersection de ces deux objets range (attention à le croiser avec le .Cells.Count pour que ça soit conforme)
    - etc..

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour joe.levrai

    J'y avais également pensé, mais relisons la demande :
    pour vérifier l'identité de deux variables Range ou plus généralement Objet?
    (on n'est à ce train-là pas sortis de l'auberge des expressions conditionnelles selon le type d'objet) ...

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    C'est certes fastidieux, mais possible :

    1) lister tous les objets qu'il souhaite pouvoir comparer (oui faut savoir se dire qu'on pourra pas TOUT tester puisque les combinaisons sont infinies avec les objets externes)
    2) pour chacun des objet : trouver la méthode de comparaison

    avec ça, une petite function dans laquelle on envoie les deux objets et qui retournera un variant
    un select case pour identifier leur type (?)
    on fait la comparaison
    dans le case Else : on renvoie un String avec pour message "Objet non supporté"
    dans les autres case : on renvoie un Booléen

    et dans la procédure appelante, on teste le type de retour avant d'agir ?

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ouais ...
    On peut "remercier" Microsoft de nous conduire à de telles usines au prétexte de nous "faciliter la vie".
    Il aurait mieux valu imposer l'utilisation systématique des propriétés
    Amitiés

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

Discussions similaires

  1. Permuter deux variables sans variable temporaire
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/01/2015, 08h02
  2. Vérifier la différence entre deux variables
    Par azyle dans le forum Débuter
    Réponses: 1
    Dernier message: 24/06/2014, 14h02
  3. [STRUTS] Tag Equal, comparer deux variables
    Par logica dans le forum Struts 1
    Réponses: 2
    Dernier message: 04/06/2004, 12h01
  4. enregistrer deux variable différente dans un seul champs
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 7
    Dernier message: 07/03/2004, 23h18
  5. Concaténer deux variables ?
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 19/12/2003, 13h53

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