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 !
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 !
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 !
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.
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.
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.
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
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 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
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.
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.
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.
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...
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...
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...
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...
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...
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...
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.
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.