Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/11/2011, 17h35   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 84
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 84
Points : 12
Points : 12
Par défaut Confusion de résultats dans recherche des occurrences d'une valeur avec Find sur des dates

Bonjour,

Voici le problème qui m'amenne ici :

Je veux trouver dans une colonne la première et la dernière occurence d'une date.
Concrètement, il s'agit de l'historique de cotation du cac40 depuis le 1er janvier 2011 minute par minute.
Je veux donc trouver pour jour 1 : ligne 1 à 200, jour 2: ligne 201 à 350 etc...
Mon code est le suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
Sub toto()
    Dim BORNE_P As Range, BORNE_N As Range, BORNE_9H As Range
    Dim i As Double, j As Double
 
    Dim DL As Double
    DL = 0
 
    Set WS_SOURCE = Sheets("Travail")
    Dim CharDate As Date
 
    With WS_SOURCE
        DL = .Columns(1).End(xlDown).Row ' Trouve la derniere ligne de la colonne
        Debug.Print "Derniere ligne : " & DL
        For i = 2 To DL
 
            CharDate = CDate(.Cells(i, 1).Value) ' Valeur recherchée
            Set BORNE_P = .Columns(1).Find(CharDate) ' 1ere occurence
            Set BORNE_N = .Columns(1).Find(CharDate, SearchDirection:=xlPrevious) ' Dernière occurence
 
            Debug.Print BORNE_P.Row & " : " & BORNE_N.Row
 
            i = BORNE_N.Row + 1 ' Passe à la journée suivante
            Set BORNE_P = Nothing
            Set BORNE_N = Nothing
 
            Next i
    End With
 
End Sub
Il marche très bien... dans certains cas. Je m'explique, le 1er jour de recherche est le 03/01/2011.
Si je lance le code j'obtient : http://imageshack.us/f/526/66798249.png/
Je n'arrive pas à comprendre pourquoi, le programme butte sur la date 03/11/2011 et me l'indique comme étant le 03/01/2011.

En effet du moment que je supprime toutes les valeurs pour le 03/11/2011 :
http://imageshack.us/f/339/10914709.png/
Tout marche comme sur des roulettes...

J'avoue être un peu perdu sur le sens des choses...

Ici mon fichier : http://goo.gl/BFD1w
Je me suis permis de le mettre sur RS, car il est trop lourd pour le mettre en PJ (8mo) et est au format xlsm.

Merci d'avance pour votre aide !
iperkut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 19h07   #2
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

Ton fichier ne serais pas trop gros si tu faisais l'effort de supprimer les milliers de lignes non significatives pour reproduire le problème
A la limite 4 lignes pour chaque dates significatives dont les 2 qui se télescopent, bref 40 lignes serait déjà plus que suffisant...
Ton contexte étant par ailleurs bien décris.

En faisant un minimum d'effort de recherche tu te serais aperçu qu'un fil quelques lignes avant ton message traitait du même problème
http://www.developpez.net/forums/d11...omprehensible/

Donc déjà voir l'importance pour Find de préciser tous les paramètres pour ne pas toi même te piéger suite à d'autres manips sur une l'instance en cours.

Ensuite tu peux tester avec le paramètre "LookAt:=xlWhole" pour voir si ça marche et nous tenir au courant bien que je pense de plus en plus que ce ne soit qu'une pirouette en non le fond du problème ( qui vient des interprétations US / autres langues).

En dernier pour ton cas précis, voici comment je procéderais, ce qui devrait te donner une solution béton. Je fais ainsi sur les bases de données clients et pas de souci.

Vu que ta feuille est une feuille de données et pas une présentation (et qu'en colonne B elle comporte les dates lisibles sous un format autre) , je ferais ceci :

- 1 Un clic sur la A de la colonne A et mettre Standard pour le format de cellules => tu te retrouves avec des numéros du coup ce qui est tout à fait normal (numéros de série).

- 2 tu transformes ton code comme ci-après (sauf qu'encore une fois, il faudrait que tu spécifies les paramètres)

Code :
1
2
Set BORNE_P = .Columns(1).Find(CLng(CharDate))  ' 1ere occurence
Set BORNE_N = .Columns(1).Find(CLng(CharDate), SearchDirection:=xlPrevious) ' Dernière occurence
PS : attention OK pour des dates, pas pour des dates-heures !

Vu que tu travailles sur le codage des dates natif d'Excel, et qu'un numéro de série est unique, tu seras OK sans souci.
Ceci bien sûr pour une base de données correcte ou la colonne date ne comporte que des dates , si on s'amuse à y mettre d'autres valeurs dont des nombres qui peuvent égaler un numéro de série, il est évident que ...

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h29.


 
 
 
 
Partenaires

Hébergement Web