Visual basic diffDate
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 43

Visual basic diffDate



  1. #1
    dalfred

    Visual basic diffDate


    ------

    Bonsoir,


    Je rencontre un soucis concernant la manipulation des dates sur excel avec visual Basic.
    En gros je dois calculer la différence entre deux dates mais je voudrais que cette différence me soit donnée en nombre de jours. Je sais qu'il existe des fonctions mais voici le probleme.
    Par exemple :

    Code:
    Sub diffDate()
    Dim date1 As Date
    Dim date2 As Date
    Dim wD As Long
    Dim wM As Long
    Dim wY As Long
    
    
    wY = DateDiff("yyyy", "1/10/2013", "25/11/2013")
    wM = DateDiff("m", "1/10/2013", "25/11/2013")
    wD = DateDiff("d", "1/10/2013", "25/11/2013")
    
    MsgBox (wD)
    MsgBox (wM)
    MsgBox (wY)
    
    End Sub
    Sur excel ca me renvoit pour le nombre de jours 319, nombre de mois 10 et année 0 je ne comprends pas. En admettant que ca soit mon excel qui bug je voudrais savoir si
    wD = DateDiff("d", "1/10/2013", "25/11/2013") devrait me donner 24 soit (25-1) ou 55 c'est a dire 30 jours en octobre + 25 en novembre ?

    Merci de vos réponses.
    Stai.

    -----

  2. #2
    Optimix

    Re : Visual basic diffDate

    Il y a beaucoup plus simple :
    Vous mettez :
    - la cellule B1 (Date début) au format date
    - la Cellule B2 (Date fin) au format date
    - la cellule B3 au format Nombre avec 0 décimale
    - Dans la cellule B3, vous tapez la formule = B2 - B1

    Vous aurez directement en B3 le Delta en nombre de jours. En procédant ainsi, vous travaillez sur le numéro de série des jours, le 1er du calendrier étant étant le 01/01/1900.
    Aujourd'hui, 11 novembre 2013, nous sommes le 41589 e jours.

    La fonction VBA qui permet de transformer une date en n° de série est Cnlg( ). Exemple : Nbjours = Clng(Range("A1").value)
    Dernière modification par Optimix ; 11/11/2013 à 09h13.

  3. #3
    whoami

    Re : Visual basic diffDate

    Bonjour,

    Rien que pour mettre mon petit grain de sel, les fonctions dates de Excel (en tout cas, la version que j'utilise : 2013) fait des erreurs.

    Exemple, pour utiliser le petit calcul proposé par Optimix, on obtient:

    Code:
        j1           j2      j2-j11
    
    28/02/1900	01/03/1900	    2
    28/02/1900	29/02/1900	    1
    
    01/01/1900	01/01/1901	   366
    
    28/02/2100	29/2/2100 ==> refusée, ok, 2100 ne sera pas bissextile
    En clair, Excel considère que l'année 1900 était bissextile, et les nombres de jours obtenus sont donc faux.

  4. #4
    Optimix

    Re : Visual basic diffDate

    Bonjour whoami,

    Un grain de sel peut en cacher un autre .
    Le fautif : Lotus 1-2-3 qui a fait l'erreur de considérer l'année 1900 comme bissextile. Ce tableur a été le premier à introduire la notion de n° de série du jour. Par la suite, Excel, Quattro Pro (le tableur de la NASA) et d'autres logiciels comme Multiplan ont été contraints d'entériner cette erreur pour des raisons de compatibilité entre leurs numéros de série.

    En vérité, il ne faut pas utiliser les dates antérieures au 1er mars 1900 sans correction, car les fonctions Clng( ) et WeekDay() donnent des résultats erronés. A partir du 1er mars 1900, on peut utiliser directement les numéros de série.

  5. A voir en vidéo sur Futura
  6. #5
    whoami

    Re : Visual basic diffDate

    Bonjour,

    Je le savais bien, mais j'ai mis mon grain de sel car cette restriction n'est indiquée nulle part dans les docs officielles (du moins, je je l'ai jamais vue), et qu'il est bon de la rappeler de temps en temps.

    La maintenance de compatibilité va trop loin quand elle va jusqu'à maintenir des bugs, c'est même carrément stupide, car ça revient à dire "On se trompe, à vous de vous débrouiller". Si je faisais ça avec mes clients, il y a longtemps que je n'en aurais plus, de clients.

  7. #6
    bisou10

    Re : Visual basic diffDate

    1904 non d'ailleurs ? C'est une option a paramétrer de mémoire. Mais oui c'est un détail

  8. #7
    Optimix

    Re : Visual basic diffDate

    On ne peut pas dire, whoami, que Microsoft ait cherché à cacher ce bug. Si on tape "bug 1900" dans l'aide d'Excel 2003, on est redirigé au bon endroit vers la base de connaissances. Je ne partage pas entièrement votre analyse lorsque vous écrivez "On se trompe, à vous de vous débrouiller". L'interopérabilité des systèmes était une priorité stratégique à l'époque ; je crois que Microsoft a fait le bon choix en sacrifiant les deux premiers mois de 1900 (une infime partie des besoins des utilisateurs).

    C'est la raison pour laquelle Excel possède 2 calendriers (1900 et 1904) et laisse à l'utilisateur le choix d'être compatible avec les tableurs initialement sous DOS et Windows (Lotus 1-2-3, Multiplan, etc. : qui utilisent le calendrier buggé 1900) et le monde Mac qui utilise le calendrier 1904. Mais attention, cette possibilité est extrêmement dangereuse (à mon avis pire que le mal) : le calendrier choisi est propre au classeur et non pas au système, si bien qu'on peut très bien travailler sans le savoir avec des classeurs utilisant des calendriers différents.

  9. #8
    whoami

    Re : Visual basic diffDate

    Bonjour,

    "L'interopérabilité des systèmes était une priorité stratégique à l'époque", certes, mais comme ça démarrait, il était plus simple de rectifier tout de suite, les programmeurs suivaient leurs produits, et, comme la correction n'était pas un gros travail à faire, ça aurait été fait sans problème.

    Ce serait beaucoup plus difficile de nos jours, où l'interopérabilité est encore plus nécessaire, et met en jeu beaucoup plus de systèmes et logiciels.

  10. #9
    dalfred

    Re : Visual basic diffDate

    Merci, mais je n'ai pas trop compris ce qui concerne le numéro de série, ce que ca donne.
    Autre chose, je désire faire ce calcule par l'intermédiaire d'une macro dois-je faire tout simplement ceci par exemple ?

    Code:
    Sub TestDiff()
    Dim date1 As Date
    Dim date2 As Date
    
    Cells(5, 1) = InputBox("Entrez la date à partir de laquelle la carte est valide")
    Cells(5, 2) = InputBox("Entrez la date d'expiration")
    Cells(5, 3) = Cells(5, 1).Value - Cells(5, 2).Value
    
    End Sub
    Le résultat obtenu est -274, apparemment c'est faux. Est-ce un bug de la version que j'ai ou est ce tout simplement faux ?
    Dernière modification par dalfred ; 12/11/2013 à 22h35.

  11. #10
    Optimix

    Re : Visual basic diffDate

    Comme ceci, ça ne devrait pas planter :

    Code:
    Sub TestDiff()
        Dim date1 As Date
        Dim date2 As Date
        
        date1 = InputBox("Entrez la date à partir de laquelle la carte est valide")
        date2 = InputBox("Entrez la date d'expiration")
        Cells(5, 3).Value = date2 - date1
    End Sub

  12. #11
    dalfred

    Re : Visual basic diffDate

    Oui pardon j'avais créé les variables sans les utiliser, cependant je viens d'exécuter la correction mais ca marche toujours pas.
    En plus de ca je vois pas pourquoi en définissant seulement date1 et date2 comme étant des dates quand on fait la différence ca donnerait le nombre de jours qui les séparent.
    Dernière modification par dalfred ; 13/11/2013 à 21h01.

  13. #12
    dalfred

    Re : Visual basic diffDate

    En réalité ce que je voudrais faire c'est que dès qu'on exécute le programme, celui ci calcule la différence en jours entre la date d'expiration et la date actuelle donc j ai fait pareil :

    Code:
    Sub TestDiff()
    Dim date1 As Date
    Dim date2 As Date
    
    date1 = Now
    date2 = InputBox("Entrez la date d'expiration")
    Cells(5, 3) = date2 - date1
    
    End Sub
    Et là aussi ca marche pas tout le temps, y a t il une limite pour faire les différences de dates, je veux dire est ce que je peux faire par exemple 01/05/2015-now ?
    Parce qu'apparemment ca ne fonctionne pas vu les résultats que ca me sort

  14. #13
    Optimix

    Re : Visual basic diffDate

    Alors essayez ceci. Si ça ne marche toujours pas, il faudra nous dire la version Excel que vous utilisez.

    Code:
    Sub TestDiff()
        Dim date1 As Date
        Dim date2 As Date
    
        date1 = Now
        date2 = InputBox("Entrez la date d'expiration")
        ' Pour éviter les durées négatives
        Cells(5, 3) = Abs(CLng(date2) - CLng(date1))
    End Sub

  15. #14
    dalfred

    Re : Visual basic diffDate

    J'ai essayé cependant ca marche quand je fais des différences ou le mois et l'annee ne changent pas donc par exemple 01/12/2013-now donne quelque chose d'absurde.
    Je travaille avec la version 2010.

  16. #15
    Optimix

    Re : Visual basic diffDate

    Etrange parce que je ne constate pas d'anomalie sous Excel 2003. Chez moi 01/12/2013 donne 16. Est-ce que votre cellule C5 est bien au format standard ? Quelle absurdité relevez-vous ?
    Si tout semble normal, il faudrait que quelqu'un qui possède la version 2010 teste ce bout de macro.

  17. #16
    dalfred

    Re : Visual basic diffDate

    Ca me donne 317, et le format est standard, je vais essayer sur les ordinateurs à mon établissement pour voir ce que ca donne

  18. #17
    Stan_94

    Re : Visual basic diffDate

    Bonjour,
    avec Excel 2007, ça marche bien dans tout les cas.
    Mais il faut bien renseigner l'inputbox avec une date au bon format.
    Il serait étonnant que sur Excel 2010 ça ne marche pas !

  19. #18
    Optimix

    Re : Visual basic diffDate

    Effectivement, il serait prudent d'éviter de passer par cette InputBox qui est reine de tous les dangers et par ce Now qui n'est pas sans risque également si on touche à la date système de l'UC ou si l'accu de la carte mère rend l'âme. Ce n'est pas très solide sur une grosse appli.

  20. #19
    whoami

    Re : Visual basic diffDate

    Bonjour,

    L'éternel problème avec les formats de dates.

    Il y a belle lurette que j'utilise mes propres fonctions pour tout ce qui concerne les dates et heures, dans tous les langages que j'utilise régulièrement.
    Elles ont au moins l'avantage de donner les mêmes résultats, quels que soient le langage et le système.

  21. #20
    dalfred

    Re : Visual basic diffDate

    A mon établissement ca marche très bien, ca doit être ma version qui bug, par contre j'ai une question.
    Quand j'aurai fini mon programme dans l'intégralité, je voudrais que la personne qui va utiliser ce programme n'est pas besoin d'exécuter le programme pour effectuer les différences de dates, en gros il faudrait que ca se fasse automatiquement dès qu'elle ouvrira le programme, existe t il une commande speciale pour faire cela ?
    Dernière modification par dalfred ; 16/11/2013 à 11h24.

  22. #21
    Optimix

    Re : Visual basic diffDate

    Sans aucun problème, il suffit de placer les instructions de votre choix dans :

    Private Sub Workbook_Open()
    [instructions]
    End Sub

    Mais attention, ces instructions ne seront exécutées qu'une seule fois, à l'ouverture du classeur.

    Je ne comprends pas bien pourquoi vous avez ce bug chez vous. Il est important d'élucider ce mystère avant d'aller plus loin. Vérifiez la date système de votre UC et, si elle est bonne, il faudra peut-être envisager de réinstaller Excel. Si elle est mauvaise, vous devriez être vers le 15 janvier 2013.

  23. #22
    dalfred

    Re : Visual basic diffDate

    Elle est bonne la date

  24. #23
    dalfred

    Re : Visual basic diffDate

    Autre chose (désolé j'ai pas trop fait de vba), si dans le menu je crée une option permettant d'afficher les personnes dont les cartes vont bientot expirer c'est obligatoirement dans un UserForm ou pas ?

  25. #24
    Optimix

    Re : Visual basic diffDate

    Je reformule ce que j'ai cru comprendre : à l'ouverture du classeur, vous voulez scanner et mettre dans une ListBox la liste des personnes dont la carte va prochainement arriver à expiration.

    Si c'est le cas, vous n'êtes pas obligé de passer par une UserForm, car vous avez encore 2 possibilités :
    - mettre un contrôle ListBox directement sur une feuille du classeur et le remplir à son ouverture
    - remplir à l'ouverture du classeur une colonne d'une feuille avec les noms et/ou les identifiants de ces personnes.

    En général, on fait appel aux UserForm pour des interfaces plus complexes.

    J'ai l'impression de voir arriver votre projet au goutte-à-goutte. Si vous nous disiez au départ ce que vous souhaitez automatiser, nul doute que nous pourrions mieux cibler nos réponses.

  26. #25
    dalfred

    Re : Visual basic diffDate

    En effet mon projet est plus conséquent, et moi avec les membres de mon groupe nous nous sommes répartis les tâches. Globalement, on doit créer un programme qui contrôle les entrées et sorties dans notre établissement car chaque étudiant, professeur, ou autre à une carte ( mais ces différents groupes de personnes n'ont pas les même droits d'accès, certains peuvent aller dans certaines zones d'autres non).
    Moi pour le moment je veux faire en sorte qu'à partir d'une date d'expiration inscrite par la personne qui va utiliser le logiciel, il soit calculé le temps restant avant l'expiration de la carte, c'est
    pourquoi, je voudrais qu'il y ait une option dans le menu permettant de récapituler tous les noms des personnes avec leur date d'expiration, donc en faisant apparaître une fenêtre. J'aurai pu
    en effet le marquer sur la même feuille ou la personne entre le numéro de la carte de l'élève, son nom, prénom, ... mais je voudrais plutôt l'afficher dans une fenêtre à part à l'aide du menu.

  27. #26
    Optimix

    Re : Visual basic diffDate

    Dans ce cas, l'utilisation d'une UserForm me semble préférable à la mise en place de contrôles directement sur une feuille.

    Vous trouverez ci-joint un petit exemple que vous devriez n'avoir aucun mal à adapter à votre besoin (tel que vous l'avez exprimé).

    Vous nous avez bien dégrossi ce besoin, mais il n'est pas complet.
    Je m'en explique : admettons que votre établissement ait délivré 1000 cartes. Lorsque vous aurez sur votre écran la liste des 1000 noms avec la durée de validité des cartes, comment allez-vous travailler ? Pour le moment, vous devez recopier à la main le nom des détenteurs de carte dont la date de péremption approche. Je vous suggère de mettre en place un curseur d'alerte à N jours. Si, par exemple, ce curseur est fixé à 30 jours, vous n'auriez dans votre liste que le nom des personnes dont la carte arrive à péremption dans les 30 jours qui viennent. Cette opération d'extraction permettrait d'imprimer directement les résultats.
    Fichiers attachés Fichiers attachés

  28. #27
    dalfred

    Re : Visual basic diffDate

    Merci je vais voir

  29. #28
    dalfred

    Re : Visual basic diffDate

    Effectivement c'est ce que je voulais faire, afficher dans le UserForm que les personnes dont la date arrive à expiration, et en plus changer la taille et couleur de la date d'expiration dans la feuille ou la personne entrera toutes les données concernant une personne

  30. #29
    Optimix

    Re : Visual basic diffDate

    Le même exemple avec prise en compte de la durée en jours en deçà de laquelle on estime qu'une carte arrive à expiration et mise en rouge des lignes correspondantes dans la liste générale.
    Fichiers attachés Fichiers attachés

  31. #30
    dalfred

    Re : Visual basic diffDate

    Par contre j'ai vu que toutes les dates d'expiration étaient sous la forme MM/JJ/AAAA l'autre forme JJ/MM/AAAA marche t elle ?
    Dernière modification par dalfred ; 17/11/2013 à 19h09.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Problème de réception port série visual basic ( visual studio 2012)
    Par extremgear dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 30/07/2013, 22h44
  2. visual basic
    Par alzon dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 03/05/2012, 16h55
  3. visual basic ??!!
    Par omar.STE dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 13/07/2008, 20h02
  4. Visual Basic
    Par invited280a227 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 17/09/2007, 12h45
  5. Visual Basic
    Par invite16ba2b9a dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 09/01/2007, 10h09