Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comparaison avec Is

17 réponses
Avatar
GL
Bonjour,

Je me demande à quoi peut bien servir Is avec les objets Range :

Set A = Selection ' un range quelconque
Set B = A.Cells
If A Is B Then Debug.Print "Egal"

Où l'on voit que "A Is Not B"... Donc très utile...

Bonne nuit.

7 réponses

1 2
Avatar
GL
Le 31/05/2014 15:11, DanielCo a écrit :
Le 31/05/2014 14:46, isabelle a écrit :
Is est un opérateur de comparaison de références d'objets. Il ne compare
pas des objets ou leur valeur,
mais vérifie si deux références d'objet sont associées au même objet



Non puisque:
1) A et B (=A.cells) sont deux références associées au même
objet (la collection des cellules formant un objet de type Range).
2) Not A Is B est Vrai
3) Dans toute situation, A et B sont non discernables (on peut
indifféremment les interchanger)

Bon weekend.



Il s'agit de deux objets équivalents ayant les mêmes propriétés. L'aide
VBA sur Range.Cells indique :
"Returns a Range object that represents the cells in the specified
range.". Concrètement, je t'accorde que tu ppeux utiliser l'un ou
l'autre; ça ne signifie pas qu'il s'agit du même objet.
Daniel



Bien sûr, A et A.Cells ne sont pas le même objet. Mais A et B tel que
Set B=A.Cells sont le même objet !
Avatar
GL
Le 31/05/2014 15:52, isabelle a écrit :
ce qu'il faut retenir est :
Il ne compare pas des objets ou leur valeur,
mais vérifie si deux références d'objet sont associées au même objet.



Non je ne retiendrais pas cela car c'est faux.

Techniquement, A et A.Cells ne sont pas la même chose pour
l'interpréteur du langage :
for each X in A
for each X in A.Cells ont des comportements différents.

Inversement : A et B tel que Set B=A.Cells sont la même chose.

Donc: Is
NE VERIFIE PAS si deux références d'objet sont associées au même objet.

Par suite :
"Is Vérifie si deux références sont associées au même objet"
est FAUX.

-------------
Techniquement, je pense que Is vérifie si deux références pointent vers
la même adresse :

En exécutant: Set B=A
je pense que VBA ne copie pas A dans B mais fait en sorte que B
pointe sur la même adresse mémoire que A (plus rapide et économique)

En éxécutant: Set B=A.Cells
je pense que VBA recopie l'objet RANGE (c'est à dire l'ensemble des
pointeurs vers les cellules, pas les cellules elles mêmes bien
évidemment).

Mais le fait que les références pointent ou non vers la même adresse
mémoire est inutilisable en VBA et n'a donc aucun sens pour
l'utilisateur. Is est par conséquent un opérateur inutilisable pour les
objets de type Range.

Bon dimanche.
Avatar
DanielCo
Bien sûr, A et A.Cells ne sont pas le même objet. Mais A et B tel que
Set B=A.Cells sont le même objet !



Hé non ! Voici la preuve (je me suis fait aider ppour celle-ci) :

Dim A As Range
Dim B As Range

Set A = Range("A1:A10")
Set B = A.Cells

Debug.Print "A is B:", A Is B

Set A = A.Resize(, 2)
Debug.Print A.Address
Debug.Print B.Address


Tu constates que la plage correspondante à A est A1:B10 alors que celle
de B est restée A1:A10.
Daniel
Avatar
GL
Le 01/06/2014 11:07, DanielCo a écrit :
Bien sûr, A et A.Cells ne sont pas le même objet. Mais A et B tel que
Set B=A.Cells sont le même objet !



Hé non ! Voici la preuve (je me suis fait aider ppour celle-ci) :

Dim A As Range
Dim B As Range

Set A = Range("A1:A10")
Set B = A.Cells

Debug.Print "A is B:", A Is B

Set A = A.Resize(, 2)
Debug.Print A.Address
Debug.Print B.Address


Tu constates que la plage correspondante à A est A1:B10 alors que celle
de B est restée A1:A10.
Daniel



Bien sur, après A.Resize, A et B ne sont plus le même objet.
Mais avant A.Resize, ils sont le même objet.
----------------------------
Comme je connais bien Matlab j'ai une idée de ce qui se passe:
en Matlab quand on assigne B = A , il n'y a pas recopie (en mémoire)
des données de A sur B (ce serait trop lent) : donc B pointe seulement
sur les données de A. Mais garde en mémoire qu'il partage ses données
avec A.
Maintenant en Matlab j'écris : B(1) = 3. Matlab ne va pas modifier A,
car c'est B qu'on modifie, donc c'est à ce moment là qu'il recopie les
données de A dans B (lent mais obligatoire) et supprime l'information
comme quoi B partage ses données avec A.

Donc je pense que c'est pareil : A et B pointent d'abord vers le même
objet, puis avec Set A = A.Resize(:,2) A est d'abord recopié
en mémoire, car il ne pointe plus vers la même adresse que B.

Tout ceci est bien joli mais on ne peut rien faire en VBA du fait que
les adresses sont les mêmes ou pas.
=> Is reste inutilisable pour les objets de type Range.
Avatar
MichD
Bonjour Daniel,

J'ai de la difficulté à comprendre pourquoi tu t'acharnes à commenter...
le monsieur ne cherche pas de réponses, car ses questions ne sont pas
vraiment des questions! Mais si cela vous amuse...
Avatar
DanielCo
Bonjour Denis,

Tu as raison, mais je n'aurais pas trouvé seul l'explication de mon
dernier mail. j'ai voulu la partager. Maintenant, la discussion est
close.

Daniel


Bonjour Daniel,

J'ai de la difficulté à comprendre pourquoi tu t'acharnes à commenter...
le monsieur ne cherche pas de réponses, car ses questions ne sont pas
vraiment des questions! Mais si cela vous amuse...
Avatar
GL
Le 31/05/2014 15:52, isabelle a écrit :
ce qu'il faut retenir est :
Il ne compare pas des objets ou leur valeur,
mais vérifie si deux références d'objet sont associées au même objet.



Il faut d'abord préciser clairement dans :

Set A = Range("A1:B3")

qu'est-ce qui est "objet" et qu'est-ce qui est "référence".
C'est cette confusion originelle qui fait que Is est mal défini.
1 2