Problème avec la fonction datediff(--,--,--[,--,--]) sous excel2003 [Résolu]

Signaler
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008
-
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008
-
Bonjours,

Mon application est exécutée sur un document .xls (ce document est une exportation de données).

La colomne F contient des dates, celle ci lors de la généréation du .xls ne sont pas au format date car elles ont l'année composé des deux dernier chiffre, j'es donc écrit dans ma macro le code suivant:

 Do While (i <= cpt)
      If Cells(i, 6) <> "" Then
        Cells(i, 6) = Left(Cells(i, 6), 6) & "20" & Right(Cells(i, 6), 2)
        Cells(i, 6).NumberFormat = "dd/mm/yy;@"
      End If
      i = i + 1
 Loop
 
afin de mettre les date au format adéqua.

Par la suite je fiais éxécuter la fonction datediff() dans un if compris dans un traitement itératif:

    i = 1
    j = 5
   
    Do While (Cells(i, j) = "") 'positionnement sur le premier resp
      i = i + 1
    Loop
    
Do While (i <= cpt)
      unresp = Cells(i, j)
      nbcandidatfin = 0
      nbcandidatsansfin = 0
      nbcandidatfinsup = 0
      nbdiff = 0
     Do While (Cells(i, j) = unresp)
        If Cells(i, j + 1) = "" Then
          nbcandidatsansfin = nbcandidatsansfin + 1
          tot1 = tot1 + 1
        Else
          nbcandidatfin = nbcandidatfin + 1    'Right(Year(vsDate), 2)
          tot2 = tot2 + 1
          If (Cells(i, j + 1) < Date) Then  'datevalue(date)
            nbcandidatfinsup = nbcandidatfinsup + 1
            tot3 = tot3 + 1
          Else
erreur => If (DateDiff("m", Date, Cells(i, j + 1)) <= "3") And (DateDiff("m", Date, Cells(i, j + 1)) >= "0") Then
              nbdiff = nbdiff + 1
              MsgBox i
            End If
          End If
        End If
        i = i + 1
      Loop       

//--affichage d'un tableau d'indicateur sur une autre page du classeur
  Sheets("indicateurs").Select

ce traitement marche mais après un certain nombre de passage dans la boucle une erreur est détecté:

Plusieur lignes sont publiées sur la page indicateurs, mon code marche donc bien mais je ne sais aps pourquoi survient l'erreur. En théorie si il y avait une erreur de programation l'erreur devrai ce produire des le premier passage dans la boucle.

Erreur d'exécution '13' :
incompatibilité de type

Merci d'avance.                                                    killy99

17 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Ben... tu en connais beaucoup des 31 novembre, toi ??? 

et comme ce n'est pas une date, ma foi ...
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Ami Killy,

voilà un geste de prudence (à ne jamais oublier quand on développe) :

   nbcandidatfinsup = nbcandidatfinsup + 1
            tot3 = tot3 + 1
          Else
              If not isdate(Cells(i, j + 1))  then
                  msgbox "STOPPEZ LA, NOM DE NOM car la cellule "  & i & ":" &  j + 1 & "a une date erronée"
                  exit sub
              end if   
erreur => If (DateDiff("m", Date, Cells(i, j + 1)) <= "3") And (DateDiff("m", Date, Cells(i, j + 1)) >= "0") Then
              nbdiff = nbdiff + 1
              MsgBox i
            End If
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

bon en fait j'es préféré finir ce matin(domage je vais avoir des bouchons sur le périf), voila ce que ça donne:

 Do While (i <= cpt)
      unresp = Cells(i, j)
      nbcandidatfin = 0
      nbcandidatsansfin = 0
      nbcandidatfinsup = 0
      nbdiff = 0
      Do While (Cells(i, j) = unresp)
        If Cells(i, j + 1) = "" Then
          nbcandidatsansfin = nbcandidatsansfin + 1
          tot1 = tot1 + 1
        Else
          nbcandidatfin = nbcandidatfin + 1    'Right(Year(vsDate), 2)
          tot2 = tot2 + 1
          If (Cells(i, j + 1) < Date) Then  'datevalue(date)
            nbcandidatfinsup = nbcandidatfinsup + 1
            tot3 = tot3 + 1
          Else
            If Not IsDate(Cells(i, j + 1)) Then
                  MsgBox "une date érronée dans la cellule " & i & ":" & j + 1
            Else
              If (DateDiff("m", Date, Cells(i, j + 1).Value) <= 3) And (DateDiff("m", Date, Cells(i, j + 1).Value) >= 0) Then
                nbdiff = nbdiff + 1
                tot4 = tot4 + 1
              End If
            End If
          End If
        End If
        i = i + 1
      Loop                  'Conseiller responsable
            'affichage nom resp---------------------------------------------------------
        Sheets("indicateurs").Select
        Cells(z, y) = unresp
        Cells(z, y).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone



    With Selection.Borders(xlEdgeLeft)
//............
loop

en bref je zap la date.

Merci bcp jmfmarques et jrivet
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
If (DateDiff("m", Date, Cells(i, j + 1)) <= "3") And (DateDiff("m", Date, Cells(i, j + 1)) >= "0") Then


n'est pas orthodoxe
Réfléchis à ce que j'ai colorié en rouge .

DateDiff renvoie du numérique et pas une chaîne de caractères
DateDiff utilise des dates
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

En fait j'ai essayé pas mal de solutions, dont la comparaison avec une chaîne et une autre avec un numérique, mais l'erreur ce produit toujours.

If (DateDiff("m", Date, Cells(i, j + 1)) <= 3) And (DateDiff("m", Date, Cells(i, j + 1)) >= 0) Then

franchement je ne comprend pas, car sur environ 1000 occurances ,une trentaine entre dans la condition mais l'erreur ce produit après avoir testé environ 900 occurances.
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

et je rapelle que Cells(i, j + 1)est bien mise au format date.

ps: désoler pour la suite de ma réponse sur un autre post, mais l'on ne peus pas éditer.
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
57
Salut,
Peu être devrais tu utiliser les propriétés explicitement... J'entends par là que actuellement tu passes à datediff en 3ème parametre un objet de type Range .d'accord il possède une propriété "par défaut" mais certaines fonctions préfèrent (sous peine de pas fonctionner) que l'on écrive tout soit par exemple Cells(i, j + 1).Value (Ou .Text)

Si ce n'est pas cela (et je pense que c'est pas ca), as tu verifié le contenu de Cells(i, j + 1). au moment où il te met l'erreur d'incompatiblité de type

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

je viens de tester en .value, j'ai également vérifié le contenu de la céllule en cours et de la suivante.

Le problème persiste toujours.

Par contre j'ai fait la génération de deux .xls, un avec les données relative à l'académie de Toulouse et un autre avec toute les données de france. Ma macro marche parfaitement sur le document de toulouse mais pas sur l'autre(qui contient plus de données, ce qui vas de soit).

Alléa de l'informatique??
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
ta boucle passe probablement par une cellule Cells(i, j + 1) vide ou sans date
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

non ce n'est pas possible car le code le test, de plus l'erreur ce produit sur la date: 31/11/2007(qui est bien au format date).



Je désespère, en tout cas merci quant même d'avoir planché sur mon problème, je vous tiens au courant si je le résoud.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
C'est surement une cellule vide car :

Private Sub Command1_Click()
 MsgBox DateDiff("m", Date, 0)  ' ==== obtiendra un chiffre négatif

  MsgBox DateDiff("m", Date, "") ' ===>> ton erreur 13
End Sub
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

Maissss ça pas possible ça!!!!!!!!!!!

pourquoi les gens qui insère des données dans une base font des erreurs , pourquoi ne pas mettre un calendar pour selectionner la date, je vais en causé deux mots aux responsable du site.

Merci en tout cas.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
Private Sub Command1_Click()
  MsgBox DateDiff("m", Date, "30/11/2007") '               marche
 
  MsgBox DateDiff("m", Date, "31/11/2007") '           erreur 13, bien sur
End Sub
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
57
Re,
C'est bien marrant... désolé je ne devrais pas rire mais. c'est plus fort que moi. ca doit être nerveux.
Comme quoi, quand on propose de vérifier les valeurs, c'est pas pour rien.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

en fait je vérifiai les format et valeur à la vas vite:

ho une date 01/10/2007, c'est bon c'est le bon format donc ça passe!! cool
ho une date 31/11/2007, pareil...

Mais bon ça a été chian mais je vous l'accorde, c'est bien drôle.
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

bon maintenant il ne me reste plus qu'à gérer les erreurs sur les dates:


es ce que je peus traduire cet algo:


Si Erreur fonction datediff alors
i = i + 1 //passage à la ligne suivante sans prendre en compte celle de l'erreur.

en bref es ce que sous excel2003 et vb6.3 je peus géré les erreurs dans la macro pour zapé l'erreur et continuer l'exécution de la macro?
Messages postés
25
Date d'inscription
lundi 5 mars 2007
Statut
Membre
Dernière intervention
5 novembre 2008

Super jmfmarques,

là je vais manger, puis en fin d'aprem(ruénion en début) je vous post le code fini avec gestion d'erreur .

@+