> Range("A1:A25") meets this definition whereas Range("A1:A25").Value does not
Sur la version Excel 2003 :
A ) L'explorateur d'objet de la fenêtre VBA ne montre plus par
un petit caractère explictite la propriété par défaut
des objets comme c'était le cas pour la version Excel 2000.
B )
| De cet exemple parmi d'autres des (in)conséquences du peu de rigueur du
langage
| VBA dont je parlais (les propriétés par défaut sont une vraie plaie de mon
point
| de vue), je ne tire pas la même conclusion que toi : j'essaye chaque fois
que je
| le peux de rappeler au "novice" dont tu parles l'existence des propriétés
| multiples de certains objets (Range en est bien pourvu) et l'intérêt de
leur
| utilisation selon les résultats attendus.
Afin de m'assurer que je ne prolifère pas trop d'âneries, je joins une copie
de l'explication de M. Rick Rothstein (MVP - VB) sur la problématique
de l'utilisation de la propriété ".Value" dans la ligne de code suivante:
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
Versus :
X = Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
'-------------------------------------
According to the help files for the worksheet MATCH function, this is what
it says about the second argument...
"Lookup_array -- is a contiguous range of cells containing
possible lookup values. Lookup_array must be an array
or an array reference."
Range("A1:A25") meets this definition whereas Range("A1:A25").Value does not
(it is an array of values, not an array of cells containing values).
'-------------------------------------
Voilà !
Salutations.
"Frédéric Sigonneau" a écrit dans le message de news:
OMk6987%En supposant que dans la plage A1:A25, on a des dates reconnues par excel,
> lorsque l'on omet de nommer explicitement la propriété de l'objet à
> laquelle
> on fait référence (dans notre cas L'objet : "Range"), la procédure
soumise
> fonctionne rondement. Si j'utilise la propriété explicite ".Value" de
> l'objet Range
> dans la même procédure, le résultat est errronné. De là à conclure de la
> non-nécessité d'utiliser la propriété .Value2, il n'y a qu'un pas.
Que je ne franchis pas !
De cet exemple parmi d'autres des (in)conséquences du peu de rigueur du
langage
VBA dont je parlais (les propriétés par défaut sont une vraie plaie de mon
point
de vue), je ne tire pas la même conclusion que toi : j'essaye chaque fois
que je
le peux de rappeler au "novice" dont tu parles l'existence des propriétés
multiples de certains objets (Range en est bien pourvu) et l'intérêt de leur
utilisation selon les résultats attendus.
Je trouve ça agaçant que la ligne de code que tu proposes
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
fonctionne sans erreur et sans raison rationnellement compréhensible puisque
X = Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
devrait fonctionner (Value étant la propriété par défaut) mais provoque une
erreur.
Je _suppose_ que, les données n'étant pas du même type (Long pour
CLng(LaDate)
et Double pour les dates de Range("A1:A25")), VBA cherche à éviter l'erreur
et
"glisse" automatiquement de Value à Value2 lorsqu'aucune propriété n'est
précisée.
Mais je trouve qu'en être réduit à ce genre de spéculation pour comprendre
"pourquoi ça marche" est très insatisfaisant et je préfère proposer
X = Application.Match(CLng(LaDate), Range("A1:A25").Value2, 0)
parce que là je _sais_ pourquoi ça marche !
FS
---
Frédéric Sigonneau
http://frederic.sigonneau.free.fr
michdenis a écrit :| Je suis très sensible à ta bénédiction, maître Denis !
**** J'espère...! ;-)))Et dans le cas où
> la date affichée dans la cellule provient d'une format de
> ce type : =TEXTE("11/01/06";"JJ/MM/AA"), la méthode proposée ferait
> aussi couic...;-)))
| Ah, ben, évidemment ! Si on dit qu'on cherche une date mais qu'en
réalité
il
| faut comprendre qu'on cherche du texte, c'est sûr que ça va pas marcher
**** L'objectif était de faire comprendre que de se fier sur ce qui est
affiché
dans la plage de cellules n'est pas suffisant pour qu'une procédure
donnée
fonctionne... cela s'inscrivait à la suite du commentaire fait sur
la
proprosition de JB !
> je me demande de la pertinence d'utiliser
> la propriété Value2 de l'objet Range dans cette formule
Bonne demande en effet. La propriété Value2 est (injustement) méconnue,
même
s'il est vrai qu'elle ne sert pas à grand-chose en dehors de ce cas de
figure.
| Sans compter qu'il faut penser que les objets ont des propriétés, ce que
| malheureusement la grande tolérance du langage VBA aux approximations
| syntaxiques de ses utilisateurs a tendance à leur faire oublier.
**** Tu as parfaitement raison sur ce point sauf que pour un novice il y a
des choses difficiles à comprendre. Exemple :
En supposant que dans la plage A1:A25, on a des dates reconnues par excel,
lorsque l'on omet de nommer explicitement la propriété de l'objet à
laquelle
on fait référence (dans notre cas L'objet : "Range"), la procédure soumise
fonctionne rondement. Si j'utilise la propriété explicite ".Value" de
l'objet Range
dans la même procédure, le résultat est errronné. De là à conclure de la
non-nécessité d'utiliser la propriété .Value2, il n'y a qu'un pas.
Je ne conteste pas le brio de ton explication et la clarté de ton code
avec
".value2"
mais je voulais simplement dire à l'ami Jac que "Juste à voir... on voit
bien ...." est loin
d'être évident... et qu'il faut souvent gratter un peu pour en saisir la
quintescence.
'-------------------------
Sub test()
Dim LaDate As Date, X
LaDate = CDate("14/08/2008")
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
End Sub
'-------------------------
Salutations!
P.S- C'est un plaisir d'avoir ce type de discussion.
> Range("A1:A25") meets this definition whereas Range("A1:A25").Value does not
Sur la version Excel 2003 :
A ) L'explorateur d'objet de la fenêtre VBA ne montre plus par
un petit caractère explictite la propriété par défaut
des objets comme c'était le cas pour la version Excel 2000.
B )
| De cet exemple parmi d'autres des (in)conséquences du peu de rigueur du
langage
| VBA dont je parlais (les propriétés par défaut sont une vraie plaie de mon
point
| de vue), je ne tire pas la même conclusion que toi : j'essaye chaque fois
que je
| le peux de rappeler au "novice" dont tu parles l'existence des propriétés
| multiples de certains objets (Range en est bien pourvu) et l'intérêt de
leur
| utilisation selon les résultats attendus.
Afin de m'assurer que je ne prolifère pas trop d'âneries, je joins une copie
de l'explication de M. Rick Rothstein (MVP - VB) sur la problématique
de l'utilisation de la propriété ".Value" dans la ligne de code suivante:
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
Versus :
X = Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
'-------------------------------------
According to the help files for the worksheet MATCH function, this is what
it says about the second argument...
"Lookup_array -- is a contiguous range of cells containing
possible lookup values. Lookup_array must be an array
or an array reference."
Range("A1:A25") meets this definition whereas Range("A1:A25").Value does not
(it is an array of values, not an array of cells containing values).
'-------------------------------------
Voilà !
Salutations.
"Frédéric Sigonneau" <nospam@nospam> a écrit dans le message de news:
OMk6987%23IHA.5048@TK2MSFTNGP05.phx.gbl...
En supposant que dans la plage A1:A25, on a des dates reconnues par excel,
> lorsque l'on omet de nommer explicitement la propriété de l'objet à
> laquelle
> on fait référence (dans notre cas L'objet : "Range"), la procédure
soumise
> fonctionne rondement. Si j'utilise la propriété explicite ".Value" de
> l'objet Range
> dans la même procédure, le résultat est errronné. De là à conclure de la
> non-nécessité d'utiliser la propriété .Value2, il n'y a qu'un pas.
Que je ne franchis pas !
De cet exemple parmi d'autres des (in)conséquences du peu de rigueur du
langage
VBA dont je parlais (les propriétés par défaut sont une vraie plaie de mon
point
de vue), je ne tire pas la même conclusion que toi : j'essaye chaque fois
que je
le peux de rappeler au "novice" dont tu parles l'existence des propriétés
multiples de certains objets (Range en est bien pourvu) et l'intérêt de leur
utilisation selon les résultats attendus.
Je trouve ça agaçant que la ligne de code que tu proposes
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
fonctionne sans erreur et sans raison rationnellement compréhensible puisque
X = Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
devrait fonctionner (Value étant la propriété par défaut) mais provoque une
erreur.
Je _suppose_ que, les données n'étant pas du même type (Long pour
CLng(LaDate)
et Double pour les dates de Range("A1:A25")), VBA cherche à éviter l'erreur
et
"glisse" automatiquement de Value à Value2 lorsqu'aucune propriété n'est
précisée.
Mais je trouve qu'en être réduit à ce genre de spéculation pour comprendre
"pourquoi ça marche" est très insatisfaisant et je préfère proposer
X = Application.Match(CLng(LaDate), Range("A1:A25").Value2, 0)
parce que là je _sais_ pourquoi ça marche !
FS
---
Frédéric Sigonneau
http://frederic.sigonneau.free.fr
michdenis a écrit :
| Je suis très sensible à ta bénédiction, maître Denis !
**** J'espère...! ;-)))
Et dans le cas où
> la date affichée dans la cellule provient d'une format de
> ce type : =TEXTE("11/01/06";"JJ/MM/AA"), la méthode proposée ferait
> aussi couic...;-)))
| Ah, ben, évidemment ! Si on dit qu'on cherche une date mais qu'en
réalité
il
| faut comprendre qu'on cherche du texte, c'est sûr que ça va pas marcher
**** L'objectif était de faire comprendre que de se fier sur ce qui est
affiché
dans la plage de cellules n'est pas suffisant pour qu'une procédure
donnée
fonctionne... cela s'inscrivait à la suite du commentaire fait sur
la
proprosition de JB !
> je me demande de la pertinence d'utiliser
> la propriété Value2 de l'objet Range dans cette formule
Bonne demande en effet. La propriété Value2 est (injustement) méconnue,
même
s'il est vrai qu'elle ne sert pas à grand-chose en dehors de ce cas de
figure.
| Sans compter qu'il faut penser que les objets ont des propriétés, ce que
| malheureusement la grande tolérance du langage VBA aux approximations
| syntaxiques de ses utilisateurs a tendance à leur faire oublier.
**** Tu as parfaitement raison sur ce point sauf que pour un novice il y a
des choses difficiles à comprendre. Exemple :
En supposant que dans la plage A1:A25, on a des dates reconnues par excel,
lorsque l'on omet de nommer explicitement la propriété de l'objet à
laquelle
on fait référence (dans notre cas L'objet : "Range"), la procédure soumise
fonctionne rondement. Si j'utilise la propriété explicite ".Value" de
l'objet Range
dans la même procédure, le résultat est errronné. De là à conclure de la
non-nécessité d'utiliser la propriété .Value2, il n'y a qu'un pas.
Je ne conteste pas le brio de ton explication et la clarté de ton code
avec
".value2"
mais je voulais simplement dire à l'ami Jac que "Juste à voir... on voit
bien ...." est loin
d'être évident... et qu'il faut souvent gratter un peu pour en saisir la
quintescence.
'-------------------------
Sub test()
Dim LaDate As Date, X
LaDate = CDate("14/08/2008")
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
End Sub
'-------------------------
Salutations!
P.S- C'est un plaisir d'avoir ce type de discussion.
> Range("A1:A25") meets this definition whereas Range("A1:A25").Value does not
Sur la version Excel 2003 :
A ) L'explorateur d'objet de la fenêtre VBA ne montre plus par
un petit caractère explictite la propriété par défaut
des objets comme c'était le cas pour la version Excel 2000.
B )
| De cet exemple parmi d'autres des (in)conséquences du peu de rigueur du
langage
| VBA dont je parlais (les propriétés par défaut sont une vraie plaie de mon
point
| de vue), je ne tire pas la même conclusion que toi : j'essaye chaque fois
que je
| le peux de rappeler au "novice" dont tu parles l'existence des propriétés
| multiples de certains objets (Range en est bien pourvu) et l'intérêt de
leur
| utilisation selon les résultats attendus.
Afin de m'assurer que je ne prolifère pas trop d'âneries, je joins une copie
de l'explication de M. Rick Rothstein (MVP - VB) sur la problématique
de l'utilisation de la propriété ".Value" dans la ligne de code suivante:
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
Versus :
X = Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
'-------------------------------------
According to the help files for the worksheet MATCH function, this is what
it says about the second argument...
"Lookup_array -- is a contiguous range of cells containing
possible lookup values. Lookup_array must be an array
or an array reference."
Range("A1:A25") meets this definition whereas Range("A1:A25").Value does not
(it is an array of values, not an array of cells containing values).
'-------------------------------------
Voilà !
Salutations.
"Frédéric Sigonneau" a écrit dans le message de news:
OMk6987%En supposant que dans la plage A1:A25, on a des dates reconnues par excel,
> lorsque l'on omet de nommer explicitement la propriété de l'objet à
> laquelle
> on fait référence (dans notre cas L'objet : "Range"), la procédure
soumise
> fonctionne rondement. Si j'utilise la propriété explicite ".Value" de
> l'objet Range
> dans la même procédure, le résultat est errronné. De là à conclure de la
> non-nécessité d'utiliser la propriété .Value2, il n'y a qu'un pas.
Que je ne franchis pas !
De cet exemple parmi d'autres des (in)conséquences du peu de rigueur du
langage
VBA dont je parlais (les propriétés par défaut sont une vraie plaie de mon
point
de vue), je ne tire pas la même conclusion que toi : j'essaye chaque fois
que je
le peux de rappeler au "novice" dont tu parles l'existence des propriétés
multiples de certains objets (Range en est bien pourvu) et l'intérêt de leur
utilisation selon les résultats attendus.
Je trouve ça agaçant que la ligne de code que tu proposes
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
fonctionne sans erreur et sans raison rationnellement compréhensible puisque
X = Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
devrait fonctionner (Value étant la propriété par défaut) mais provoque une
erreur.
Je _suppose_ que, les données n'étant pas du même type (Long pour
CLng(LaDate)
et Double pour les dates de Range("A1:A25")), VBA cherche à éviter l'erreur
et
"glisse" automatiquement de Value à Value2 lorsqu'aucune propriété n'est
précisée.
Mais je trouve qu'en être réduit à ce genre de spéculation pour comprendre
"pourquoi ça marche" est très insatisfaisant et je préfère proposer
X = Application.Match(CLng(LaDate), Range("A1:A25").Value2, 0)
parce que là je _sais_ pourquoi ça marche !
FS
---
Frédéric Sigonneau
http://frederic.sigonneau.free.fr
michdenis a écrit :| Je suis très sensible à ta bénédiction, maître Denis !
**** J'espère...! ;-)))Et dans le cas où
> la date affichée dans la cellule provient d'une format de
> ce type : =TEXTE("11/01/06";"JJ/MM/AA"), la méthode proposée ferait
> aussi couic...;-)))
| Ah, ben, évidemment ! Si on dit qu'on cherche une date mais qu'en
réalité
il
| faut comprendre qu'on cherche du texte, c'est sûr que ça va pas marcher
**** L'objectif était de faire comprendre que de se fier sur ce qui est
affiché
dans la plage de cellules n'est pas suffisant pour qu'une procédure
donnée
fonctionne... cela s'inscrivait à la suite du commentaire fait sur
la
proprosition de JB !
> je me demande de la pertinence d'utiliser
> la propriété Value2 de l'objet Range dans cette formule
Bonne demande en effet. La propriété Value2 est (injustement) méconnue,
même
s'il est vrai qu'elle ne sert pas à grand-chose en dehors de ce cas de
figure.
| Sans compter qu'il faut penser que les objets ont des propriétés, ce que
| malheureusement la grande tolérance du langage VBA aux approximations
| syntaxiques de ses utilisateurs a tendance à leur faire oublier.
**** Tu as parfaitement raison sur ce point sauf que pour un novice il y a
des choses difficiles à comprendre. Exemple :
En supposant que dans la plage A1:A25, on a des dates reconnues par excel,
lorsque l'on omet de nommer explicitement la propriété de l'objet à
laquelle
on fait référence (dans notre cas L'objet : "Range"), la procédure soumise
fonctionne rondement. Si j'utilise la propriété explicite ".Value" de
l'objet Range
dans la même procédure, le résultat est errronné. De là à conclure de la
non-nécessité d'utiliser la propriété .Value2, il n'y a qu'un pas.
Je ne conteste pas le brio de ton explication et la clarté de ton code
avec
".value2"
mais je voulais simplement dire à l'ami Jac que "Juste à voir... on voit
bien ...." est loin
d'être évident... et qu'il faut souvent gratter un peu pour en saisir la
quintescence.
'-------------------------
Sub test()
Dim LaDate As Date, X
LaDate = CDate("14/08/2008")
X = Application.Match(CLng(LaDate), Range("A1:A25"), 0)
End Sub
'-------------------------
Salutations!
P.S- C'est un plaisir d'avoir ce type de discussion.
J'oubliais ... peut être que Misange pourrait utiliser ses
contacts auprès de Microsoft et leur adresser la question.
Peut être obtiendra-t-elle une explication plus lumineuse !
J'oubliais ... peut être que Misange pourrait utiliser ses
contacts auprès de Microsoft et leur adresser la question.
Peut être obtiendra-t-elle une explication plus lumineuse !
J'oubliais ... peut être que Misange pourrait utiliser ses
contacts auprès de Microsoft et leur adresser la question.
Peut être obtiendra-t-elle une explication plus lumineuse !
Dans ce cas, pourquoi est-ce que
Range("A1:A25").Value2
fonctionne sans erreur ?
Dans ce cas, pourquoi est-ce que
Range("A1:A25").Value2
fonctionne sans erreur ?
Dans ce cas, pourquoi est-ce que
Range("A1:A25").Value2
fonctionne sans erreur ?
Bonsour® Frédéric Sigonneau avec ferveur ;o))) vous nous disiez :Dans ce cas, pourquoi est-ce que
Range("A1:A25").Value2
fonctionne sans erreur ?
La seule différence existant entre cette propriété Value2 et la propriété Value réside dans le fait que la propriété Value2 n'utilise pas les types de données aux formats Monétaire et Date. Vous pouvez renvoyer des données de ce type sous forme de nombres à virgule flottante en utilisant le type de données Double.
Bonsour® Frédéric Sigonneau avec ferveur ;o))) vous nous disiez :
Dans ce cas, pourquoi est-ce que
Range("A1:A25").Value2
fonctionne sans erreur ?
La seule différence existant entre cette propriété Value2 et la propriété Value réside dans le fait que la propriété Value2 n'utilise pas les types de données aux formats Monétaire et Date. Vous pouvez renvoyer des données de ce type sous forme de nombres à virgule flottante en utilisant le type de données Double.
Bonsour® Frédéric Sigonneau avec ferveur ;o))) vous nous disiez :Dans ce cas, pourquoi est-ce que
Range("A1:A25").Value2
fonctionne sans erreur ?
La seule différence existant entre cette propriété Value2 et la propriété Value réside dans le fait que la propriété Value2 n'utilise pas les types de données aux formats Monétaire et Date. Vous pouvez renvoyer des données de ce type sous forme de nombres à virgule flottante en utilisant le type de données Double.
Mais, si j'ai bien compris (mon anglais étant ce qu'il est !) le
message de "M. Rick Rothstein (MVP - VB)" cité par Denis, il explique
le fait que Application.Match(CLng(LaDate), Range("A1:A25"), 0)
s'exécute sans erreur par le fait que Range("A1:A25") est un tableau
(ce qu'attend Match en 2ème argument) alors que
Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
provoque un erreur parce que Range("A1:A25").Value n'en est pas un
(tableau). D'où ma question.
Mais si j'ai compris de travers, je la retire :)
Mais, si j'ai bien compris (mon anglais étant ce qu'il est !) le
message de "M. Rick Rothstein (MVP - VB)" cité par Denis, il explique
le fait que Application.Match(CLng(LaDate), Range("A1:A25"), 0)
s'exécute sans erreur par le fait que Range("A1:A25") est un tableau
(ce qu'attend Match en 2ème argument) alors que
Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
provoque un erreur parce que Range("A1:A25").Value n'en est pas un
(tableau). D'où ma question.
Mais si j'ai compris de travers, je la retire :)
Mais, si j'ai bien compris (mon anglais étant ce qu'il est !) le
message de "M. Rick Rothstein (MVP - VB)" cité par Denis, il explique
le fait que Application.Match(CLng(LaDate), Range("A1:A25"), 0)
s'exécute sans erreur par le fait que Range("A1:A25") est un tableau
(ce qu'attend Match en 2ème argument) alors que
Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
provoque un erreur parce que Range("A1:A25").Value n'en est pas un
(tableau). D'où ma question.
Mais si j'ai compris de travers, je la retire :)
Mais, si j'ai bien compris (mon anglais étant ce qu'il est !) le
message de "M. Rick Rothstein (MVP - VB)" cité par Denis, il explique
le fait que Application.Match(CLng(LaDate), Range("A1:A25"), 0)
s'exécute sans erreur par le fait que Range("A1:A25") est un tableau
(ce qu'attend Match en 2ème argument) alors que
Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
provoque un erreur parce que Range("A1:A25").Value n'en est pas un
(tableau). D'où ma question.
Mais si j'ai compris de travers, je la retire :)
Mais, si j'ai bien compris (mon anglais étant ce qu'il est !) le
message de "M. Rick Rothstein (MVP - VB)" cité par Denis, il explique
le fait que Application.Match(CLng(LaDate), Range("A1:A25"), 0)
s'exécute sans erreur par le fait que Range("A1:A25") est un tableau
(ce qu'attend Match en 2ème argument) alors que
Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
provoque un erreur parce que Range("A1:A25").Value n'en est pas un
(tableau). D'où ma question.
Mais si j'ai compris de travers, je la retire :)
Mais, si j'ai bien compris (mon anglais étant ce qu'il est !) le
message de "M. Rick Rothstein (MVP - VB)" cité par Denis, il explique
le fait que Application.Match(CLng(LaDate), Range("A1:A25"), 0)
s'exécute sans erreur par le fait que Range("A1:A25") est un tableau
(ce qu'attend Match en 2ème argument) alors que
Application.Match(CLng(LaDate), Range("A1:A25").Value, 0)
provoque un erreur parce que Range("A1:A25").Value n'en est pas un
(tableau). D'où ma question.
Mais si j'ai compris de travers, je la retire :)
Mais que faites-vous donc lors de vos nombreux pèlerinages à Seattle ?
Proablement autre chose que de parler d'excel ?
Ah ! ça devient intéressant ....
;-))
Mais que faites-vous donc lors de vos nombreux pèlerinages à Seattle ?
Proablement autre chose que de parler d'excel ?
Ah ! ça devient intéressant ....
;-))
Mais que faites-vous donc lors de vos nombreux pèlerinages à Seattle ?
Proablement autre chose que de parler d'excel ?
Ah ! ça devient intéressant ....
;-))