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 10/03/2010, 16h57   #1
Invité de passage
 
Inscription : mars 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 19
Points : 3
Points : 3
Par défaut Problème de date en VBA

Bonjour,

Dans cette procédure, je passe en revue un certain nombre de date calculée à partir d'une date initiale et incrémentée à chaque passage. J'ai besoin de savoir si cette date est un jour férié ou non. Je dispose donc dans une feuille de la liste des jours fériés, et j'utilise la fonction FIND

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
             Option Explicit
Dim DateEnCours As Date
Dim DateFin As Date
Dim c As Range
Sub recherche()
 
    DateEnCours = CDate("01/01/2010")
    DateFin = CDate("20/01/2010")
 
    Do While DateEnCours < DateFin
 
        Set c = Sheets("JoursFériés").Columns(1).Cells.Find(what:=DateEnCours)
            If Not c Is Nothing Then
                MsgBox DateEnCours & " FERIE"
            Else
                MsgBox DateEnCours & " OUVRE"
            End If
        DateEnCours = DateEnCours + 1
    Loop
End Sub
La liste des jours fériés dans la feuille JoursFériés est la suivante :

Jour
14/07/2008
15/08/2008
11/11/2008
25/12/2008
01/01/2009
13/04/2009
01/05/2009
08/05/2009
21/05/2009
01/06/2009
14/07/2009
15/08/2009
01/11/2009
11/11/2009
25/12/2009
01/01/2010
05/04/2010
01/05/2010
08/05/2010
13/05/2010
24/05/2010
14/07/2010
01/11/2010
11/11/2010
25/12/2010


Ca marche bien en général : c renvoie Nothing si le jour n'est pas férié, et la date trouvée si le jour est férié. SAUF dans un cas particulier : pour le cas où DateEn Cours est le 11/01/2010 (non férié...) il me renvoie la date du 11/11/2010. J'ai beau tourner le pb dans tous les sens, je ne trouve pas d'explication, donc pas de solution.

D'où cela peut-il venir ?

Merci pour votre réponse.
ogeiger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 20h09   #2
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 201
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 201
Points : 4 195
Points : 4 195
Bonjour,

une solution peut-être...

Tu sélectionnes tes données de jours et tu passes les cellules en format Standard, tu obtiendras des nombres (Numéro de série)*.
*vois le tutoriel à côté de ma signature si besoin pour les explications.

et tu modifies ton code ainsi :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim DateEnCours As Variant
Dim DateFin As Variant
Dim c As Range
Sub recherche()
 
    DateEnCours = CDec(CDate("01/01/2010"))
    DateFin = CDec(CDate("20/01/2010"))
 
    Do While DateEnCours < DateFin
 
        Set c = Sheets("JoursFériés").Columns(1).Cells.Find(what:=DateEnCours)
            If Not c Is Nothing Then
                MsgBox CDate(DateEnCours) & " FERIE"
            Else
                MsgBox CDate(DateEnCours) & " OUVRE"
            End If
        DateEnCours = DateEnCours + 1
    Loop
End Sub

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
Vieux 11/03/2010, 17h07   #3
Invité de passage
 
Inscription : mars 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 19
Points : 3
Points : 3
Merci pour la réponse. J'avais bien pensé à cette solution, mais je trouve bizarre qu'il faille mettre en œuvre des solutions de contournement... Est ce un bug ? J'ai constaté que cela se produisait pour toutes les années : le 11/01 est confondu avec le 11/11. Je ne pense pas que cela soit un problème de format de date. J'ai essayé de formater de différentes manières sans résoudre quoi que ce soit. Alors que la fonction RECHERCHEV ne provoque pas cette erreur dans une feuille de calcul.
ogeiger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 22h05   #4
Membre confirmé
 
Inscription : décembre 2008
Messages : 264
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 264
Points : 264
Points : 264
J'ai bien essayer de comprendre pourquoi mais je ne vois vraiment pas.

Effectivement ça ne parait pas normal de contourner le problème, et encore faut-il savoir qu'il y a un problème. Lorsque l'on développe quelque chose on ne peut matériellement pas vérifier toutes les dates.
J'espère qu'on aura une explication
Merci de l'info

JP

Petite omission

Même problème avec Excel 2007

Dernière modification par Pierre Fauconnier ; 11/03/2010 à 22h08. Motif: Merci d'édier votre message pour le modifier
JPierreM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2010, 22h13   #5
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 7 906
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 7 906
Points : 13 687
Points : 13 687
Envoyer un message via Skype™ à Pierre Fauconnier
VBA ne confond pas 11/01 avec 11/11 mais avec 01/11 (01/11 et 11/11 sont tous deux fériés)=> c'est bien un problème de format de date (date us vs date fr)

Le tuto de Didier explique bien le pourquoi du comment...
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2010, 09h42   #6
Invité de passage
 
Inscription : mars 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 19
Points : 3
Points : 3
J'ai bien pensé à un pb de format US ... Mais je ne crois pas que ça vienne de là. Le code suivant montre bien qu'il trouve le 11/11 et pas le 01/11.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
 
Dim DateEnCours As Date
Dim DateFin As Date
Dim c As Range
Sub recherche()
 
    DateEnCours = CDate("01/01/2010")
    DateFin = CDate("20/01/2010")
 
    Do While DateEnCours < DateFin
 
        Set c = Sheets("JoursFériés").Columns(1).Cells.Find(what:=DateEnCours)
                    If Not c Is Nothing Then
                MsgBox DateEnCours & "-->" & c
            Else
                MsgBox DateEnCours & " pas trouvé"
            End If
        DateEnCours = DateEnCours + 1
    Loop
End Sub
ogeiger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2010, 13h46   #7
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 201
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 201
Points : 4 195
Points : 4 195
Bonjour,

Find ne bogue pas et se comporte normalement par rapport à sa définition et aux choix de la langue et des paramètres système, mais peut causer des résultats inattendus si on ne prend pas en compte tous les paramètres

Fais le test suivant :

colonne 7, mets la liste suivante :

6
667
666
669
3663
66664



Dans un module les macros suivantes (brouillions adapté des tiennes qui sont propres)


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub recherchecodebrouillon1()
Dim DateEnCours As Long
Dim DateFin As Long
Dim c As Range
 
    DateEnCours = 1
    DateFin = 30
    Do While DateEnCours < DateFin
 
        Set c = Sheets("JoursFériés").Columns(7).Cells.Find(What:=DateEnCours, LookAt:=xlPart)
                    If Not c Is Nothing Then
                       c.Select
                MsgBox DateEnCours & "-->" & c
            Else
                MsgBox DateEnCours & " pas trouvé"
            End If
        DateEnCours = DateEnCours + 1
    Loop
End Sub
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub recherchecodebrouillon2()
Dim DateEnCours As Long
Dim DateFin As Long
Dim c As Range
 
    DateEnCours = 1
    DateFin = 30
    Do While DateEnCours < DateFin
 
        Set c = Sheets("JoursFériés").Columns(7).Cells.Find(What:=DateEnCours, LookAt:=xlWhole)
                    If Not c Is Nothing Then
                       c.Select
                MsgBox DateEnCours & "-->" & c
            Else
                MsgBox DateEnCours & " pas trouvé"
            End If
        DateEnCours = DateEnCours + 1
    Loop
End Sub
Fais les tourner et tires-en les conséquences

Attention, il y a un piège de mémorisation, invalide la paramètre ajouté d'une des deux et fais les tourner à suivre...

Conseils : voir attentivement l'aide vba, dans ce genre de cas, il est précisé de bien renseigner l'intégralité de certains paramètres, les derniers utilisés devenant ceux par défaut jusqu'au redémarrage d'Excel ! Ici, il serait bon aussi de préciser ceux concernés :

Citation:
Les paramètres des arguments LookIn, LookAt, SearchOrder et MatchByte sont enregistrés chaque fois que vous utilisez cette méthode. Si vous ne spécifiez aucun paramètre pour ces arguments lors du prochain appel de la méthode, les paramètres enregistrés sont utilisés. Le fait de définir les paramètres de ces arguments modifie les paramètres de la boîte de dialogue Rechercher, ce qui a pour effet de changer les paramètres enregistrés qui sont utilisés lorsque vous ne spécifiez pas les arguments. Pour éviter toute ambiguïté, définissez ces arguments de façon explicite chaque fois que vous utilisez cette méthode.
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 !

Dernière modification par Ormonth ; 14/03/2010 à 13h39. Motif: Ajout de "conseils"
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2010, 16h11   #8
Invité de passage
 
Inscription : mars 2008
Messages : 19
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 19
Points : 3
Points : 3
Ok, et merci pour la solution : ça marche en ajoutant le paramètre Lookat := xlWhole.
le code est donc le suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
 
Dim DateEnCours As Date
Dim DateFin As Date
Dim c As Range
Sub recherche()
 
    DateEnCours = CDate("01/01/2010")
    DateFin = CDate("20/01/2010")
 
    Do While DateEnCours < DateFin
 
        Set c = Sheets("JoursFériés").Columns(1).Cells.Find(What:=DateEnCours, LookAt:=xlWhole)
            If Not c Is Nothing Then
                MsgBox CDate(DateEnCours) & " FERIE"
            Else
                MsgBox CDate(DateEnCours) & " OUVRE"
            End If
        DateEnCours = DateEnCours + 1
    Loop
End Sub
Par contre je ne sais pas pourquoi :

le paramètre LookAt indique si la recherche doit se faire sur l'ensemble ou sur une partie de la chaîne (c'est l'équivalent de la fonction Edition>Recherche ou ^f du menu d'Excel) , ce qu'illustre parfaitement tes exemples.

Mais dans le cas d'une date ?

Je ne comprends pas comment il peut trouver que "11/11/2010" contient "11/01/2010" et ce qu'on soit en format jj/mm/aaaa ou mm/jj/aaaa.
ogeiger est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 04h19.


 
 
 
 
Partenaires

Hébergement Web