OVH Cloud OVH Cloud

Vba Recherche de la date du jour dans une colonne qui les contient toutes

23 réponses
Avatar
Jac
Bonjour à tous,

je cherche à me positionner dans un tableau qui contient toutes les
dates de l'année sur le jour actuel. Je reçois systématiquement une
erreur d'exécution 13 / Incompatibilité de type avec cette syntaxe :

[C:C].Find(What:=Date, After:=ActiveCell, LookIn:=xlValues).Activate

J'ai essayé de formater la date pour qu'elle soit identique au
formatage de la colonne C. Rien à faire. Si je mets Date en variable,
Excel l'affiche au même format la date qui existe dans le tableau.

Et maintenant, je manque d'imagination pour résoudre le problème...

Merci d'avance à qui pourrait me mettre sur la voie.

Jac

10 réponses

1 2 3
Avatar
Frédéric Sigonneau
> Range("A1:A25") meets this definition whereas Range("A1:A25").Value does not



Dans ce cas, pourquoi est-ce que
Range("A1:A25").Value2
fonctionne sans erreur ?

A mon avis, dans tous les cas de figure
(ie ,
-Range("A1:A25")
-Range("A1:A25").Value
-Range("A1:A25").Value2),
Match considère le 2ème argument comme un tableau de valeurs.
En précisant .Value, le type de valeur ne convient pas à une recherche de date,
alors qu'avec .Value2, si.

Par ailleurs, je n'ai nullement cherché à démontrer que tu profères ou
prolifères (là, c'est trop, quand même :)) des âneries, pour te citer, mais
seulement à rappeler qu'il n'y a pas, comme souvent avec Excel, qu'une seule
approche possible pour la recherche de dates, et que celle que je propose est
tout aussi valide que d'autres, même si elle n'a manifestement pas ta préférence !

FS
---
Frédéric Sigonneau
http://frederic.sigonneau.free.fr

michdenis a écrit :
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.








Avatar
michdenis
| comme souvent avec Excel, qu'une seule
| approche possible pour la recherche de dates, et que celle que je propose
est
| tout aussi valide que d'autres, même si elle n'a manifestement pas ta
préférence !

Ce n'est pas une question de préférence .... mais plutôt une question de
curiosité.
Pourquoi cela fonctionne avec des chaînes de caractères et valeurs
numériques et
non avec des dates et Currency.

La solution ne doit pas être évidente. voici un commentaire de Dave Peterson
sur le sujet :
'------------------------------
You'll have to ask MS why date/times and currency are special. I don't have
an
idea why they did such a thing. But they did.
'------------------------------

Voilà !

Merci de ta collaboration.
Avatar
michdenis
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 !
Avatar
Misange
Quels contacts ? :-)
Sérieusement, ne te fais aucune illusion sur le fait qu'un statut MVP te
donne accès à l'oreille des développeurs pour faire remonter des bugs.
Il te donne encore moins leur bouche pour t'expliquer pourquoi ils ont
conçu ceci de telle ou telle façon. Je pense qu'ils n'attendent en fait
rien des MVP et qu'en échange ils s'attendent à ce que les MVP
n'attendent rien d'eux :-(
Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

michdenis a écrit :
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 !







Avatar
Modeste
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.

--
--
@+
;o)))
Avatar
Frédéric Sigonneau
Tout à fait Gilbert, c'est dans l'aide.
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 :)

FS
---
Frédéric Sigonneau
http://frederic.sigonneau.free.fr

Modeste a écrit :
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.



Avatar
Modeste
Salut Fred avec ferveur ;o))) vous nous disiez :

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



;o)))
tu as parfaitement compris
ce que le message erreur d'éxécution 13 (incompatibilité de type) confirme.

Range en tant que tel est un objet et ne posséde la propriété Value que s'il est assimilé à UNE cellule
ce qui n'est pas le cas d'une plage pour laquelle il y a alors X value(s)

Sub fred()
MsgBox Range("A1").Value
MsgBox Range("A1:A25").Value
End Sub

--
@+
;o)))
Avatar
michdenis
Ce pourquoi l'explication de Rich Rothstein fait du sens :

Son explication
'-------------------------------------
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).
'-------------------------------------

Un tableau de cellules : C'est en fait un tableau de data.
dont le format "Date" et "Currency" n'existe pas en ce
sens que l'interface nous permet d'en faire un affichage
particulier mais le contenu réel de la cellule ne change
jamais. En conséquence, la lecture se fait directement
à partir du contenu "brut" de la cellule.

Un petit exemple : Une plage C1:C25 dans un format "Currency"
qui est passé directement en tableau par une variable "T"
T représente un tableau de données...
Résultat : Une erreur est générée
'------------------------
Sub test3()
Dim MyVar, X
Dim T
T = Range("C1:C25")
q = TypeName(T(1, 1)) '-> currency
MyVar = (Range("C1")
X = Application.Match(MyVar, T, 0)
'Une erreur est générée
End Sub
'------------------------

Je refais le même exercice mais cette fois, je passe directement
la plage de cellules ...Ceci fonctionne correctement
'-------------------------
Sub test3()
Dim MyVar, X
X = Application.Match(MyVar, Range("C1:C25"), 0)
End Sub
'-------------------------

Vous pouvez refaire l'exercice avec des dates, et vous constaterez
le même résultat.

Conclusion : Lorsque l'on passe directement la plage de cellules,
ce sont les données brut dont le type "Currency" et "Date" n'existe
pas. Lorsque l'on utilise la propriété "Value" et que nous faisons
face à des données de type "Date" et "Currency", nous passons
au tableau des données non seulement les données bruts mais
aussi leur format et ça la fonction "Match" ne les gères pas.
En fait l'usage de la propriété "Value2" n'a pour but que de transformer
le contenu d'un tableau "Date" ou "Currency" en données bruts.
(type double).

Je crois bien que je devrai me contenter de cette explication !
Merci à vous, l'échange a été fructueux.





"Modeste" a écrit dans le message de news:
%238e8RfI$
Salut Fred avec ferveur ;o))) vous nous disiez :

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



;o)))
tu as parfaitement compris
ce que le message erreur d'éxécution 13 (incompatibilité de type) confirme.

Range en tant que tel est un objet et ne posséde la propriété Value que
s'il est assimilé à UNE cellule
ce qui n'est pas le cas d'une plage pour laquelle il y a alors X value(s)

Sub fred()
MsgBox Range("A1").Value
MsgBox Range("A1:A25").Value
End Sub

--
@+
;o)))
Avatar
michdenis
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 ....

;-))
Avatar
Misange
euh... j'ai pas les ronds pour me payer un pélerinage à Seattle ! Je
préfère tant qu'à faire de dépenser mes sous persos pour aller aux US
aller voir des coins plus sympas et plus vacances !
Cet heureux temps ou microsoft était riche est parait-il fini...

Misange migrateuse
XlWiki : Participez à un travail collaboratif sur excel !
http://xlwiki.free.fr/wiki
http://www.excelabo.net

michdenis a écrit :
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 ....

;-))




1 2 3