IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[débutant] Aide génération de dates [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut [débutant] Aide génération de dates
    Bonjour à tous,

    Dans le cadre d'un stage, je suis chargé de développer un procédé en VB/VBA qui doit extraire et traiter des informations dans différents fichiers excel existants.

    Précision: J'ai appris le VB très rapidement (en une journée), et lorsque je suis bloqué je vais chercher les informations sur le net via divers forums, mais là je suis bloqué sur ce souci sans trouver de solution. Je suis plutôt d'habitude adepte du Java (je suis étudiant, on a surtout insisté sur ce langage) mais on m'a "imposé" VB pour le traitement excel (ce qui semble logique).

    Pour le moment, mon souci est de générer la liste des jours ouvrés (chaque date dans une case différente). J'ai recherché pas mal sur le net (dont sur ce forum) pour exécuter des fonctions excel en VBA mais j'ai quelques soucis actuellement. J'ai bien connaissance de la fonction NB.JOURS.OUVRES().

    Pour le moment je n'ai pas traité la partie insertion des dates dans les cellules voulues, je pense m'y prendre comme cela:

    Une boucle de génération des dates, dès qu'elle est générée, je l'insère à l'aide d'une incrémentation de cellule (il m'a semblé voir que c'était possible)

    Voici donc mon code actuel, qui n'insère rien pour le moment, et ne va pas pour le moment utiliser les données des fichiers sources.

    Je précise encore que je suis vraiment un débutant en VBA, et que j'ai donc fatalement fait des erreurs grossières qui ne m'ont pas sauté aux yeux. Je précise aussi le type de logiciel utilisé: Excel 2003 standard version française.

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Function genererJoursOuvres(mois As Byte, annee As Integer)
     
        'déclarations des variables
        Dim moisCourant As Byte, semPremierJourMois As Byte, cptJour As Byte
        Dim premierJourMois As Date, dernierJourMois As Date
        Dim nbJour As Integer
        Dim premierJourMoisString As String
     
        'construction d'une date à partir des paramètres mois et annee
        'ici mois +1 pour ensuite l'utiliser pour connaitre le dernier jour du mois:
        'on prend le premier jour du mois précédent puis on enlève un jour
        premierJourMoisString = "01/" & mois + 1 & "/" & annee
     
        'détermination du dernier jour du mois à partir de la date précédente
        dernierJourMois = Format(DateAdd("d", -1, premierJourMoisString), "dd/mm/yyyy")
     
        'détermination de la date du premier jour du mois
        premierJourMoisString = "01/" & mois & "/" & annee
     
        'conversion de la date premierJourMoisString en format date
        premierJourMois = Format(CDbl(CDate(premierJourMoisString)), "dd/mm/yyyy")
     
        'vérification qu'il s'agit bien d'une date
        'If (IsDate(premierJourMois) = False) Then
        '    MsgBox "C'est pas une date. La conversion a échoué."
        'End If
     
        'Variable contenant le nombre de jours dans le mois courrant.
        nbJourMois = (dernierJourMois - premierJourMois) + 1
     
        'Vérification visuelle des informations
        MsgBox "Premier jour du mois: " & premierJourMois & " Dernier jour du mois: " & dernierJourMois
     
        'Compte le nombre de jours ouvrés (lundi => vendredi) sur le mois
        'NE FONCTIONNE PAS, testé avec Formula, avec Application.WorksheetFunction.NB.JOURS.OUVRES()
        NBJoursOuvres = Range("A5").Formula = "=NB.JOURS.OUVRES(" & premierJourMois & "; " & dernierJourMois & ")"
     
        'déclaration d'un compteur
        cptJour = 0
     
        'Boucle servant à déterminer quels jours sont ouvrés;
        'Doit ensuite inscrire ces dates dans un tableau déterminé // pas encore construit
        For i = 1 To Format(dernierJourMois, "dd")
     
            'conversion de la date incrémentée (1er au dernier jour du mois) en numéro série
            'afin de faciliter l'utilisation de JOURSEM et savoir quel jour de la semaine est le jour en cours
            NbJourSem = DateSerial(annee, mois, i)
     
            'tentative d'utilisation de JSEM
            jourSemaine = Application.WorksheetFunctions.JOURSEM(NbJourSem)
     
            'Affichage de jourSemaine dans un but vérificatif durant débuggage
            MsgBox jourSemaine
     
            'switch, voir lorsque le jour en cours est un jour ouvrable
            Select Case jourSemaine
     
                'vérification du jour
                Case 1, 2, 3, 4, 5
     
                    'incrémentation de cptJour, qui détermine le nombre de jours ouvrables traités
                    'à la fin, cptJour doit être égal à nbJoursOuvres
                    cptJour = cptJour + 1
     
                    'à terme le code pour insérer la date dans les cases se fera ici
                Case Else
            End Select
     
            'affichage dans un but de débuggage
            MsgBox i
        Next
     
        'affichage dans un but de débuggage
        MsgBox cptJour
    End Function

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 764
    Par défaut
    Bonjour,

    Je ne suis pas un pro non plus mais je peux te conseilller d'ajouter un préfixe au nom de tes variables afin de reconnaître facilement si c'est des entiers, des booléens, des strings, des bytes ect.

    Perso, pour une variable qui par exemple s'appellerai Jours et qui serai un integer, je l'appelle intJours.

    Comme ca tu n'est pas tout le temps obligé de remonter dans les déclarations pour savoir !



    Re !

    Tu as une variable "IsDate(premierJourMois)" qui n'est pas déclarée !

    Cette variable est spéciale car c'est en fait un tableau !

    Si ton tableau contient 10 variables tu peux le déclarer comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Redim IsDate(10) as byte

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut
    Coucou,

    Merci de tes réponses. Il m'avait semblé que IsDate(variable) était une fonction chargée de vérifier que la variable était bien une date, vérifier sa validité.

    Ce code n'étant pas nécessaire (juste pour vérifier que la date finale était bien valide pour être utilisée), je le change pour le mettre en commentaire pour le moment.

    J'ai oublié de préciser l'erreur obtenue lorsque j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =genererJoursOuvres(mois(AUJOURDHUI()); annee(AUJOURDHUI()))
    J'obtiens #VALEUR dans la cellule

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 764
    Par défaut
    Si tu n'obtiens pas ce que tu veux dans la cellule (exemple ici #valeur), tu dois forcer les cellules avec le bon type. Si tu veux du texte, il faut utiliser ce code. Pour des dates ... je ne sais pas .....
    Mais tu dois remplacer @ par autre chose (peut-être "date" ??? )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cells.Select
    Selection.NumberFormat = "@"

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut
    Pour le moment en fait je n'insère pas de date, nul part, juste un chiffre dans A5 qui devrait être un byte (nombre de jours ouvrés entre début et fin du mois). Et j'affiche en MsgBox des choses pour vérifier les données au fur et à mesure (j'en ai enlevé pas mal là, toutes les données jusqu'à la tentative de NB.JOURS.OUVRES() sont à priori correctes).

    Le principal souci (hors peut-être code inutile & non-optimisation) doit se situer sur la ligne Formula = "=NB...."

    puis dans l'utilisation de JOURSEM dans la boucle.

    L'insertion des dates se fera plus tard, lorsque les dates générée seront ok.

  6. #6
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par garheb Voir le message
    ....
    J'obtiens #VALEUR dans la cellule
    Ta fonction ne retourne rien ... ! je ne sais pas compris ce qu'elle était censé retourner ... mais le codage de la valeur à retourné manque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     (...)
      genererJoursOuvres  = 1 '?
    end function

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut
    Coucou et merci pour la réponse,

    Elle ne retourne rien pour le moment, et elle ne doit rien retourner pour le moment, en fait ce qui m'intéresse c'est la trace d'exécution, pour vérifier que tout fonctionne, mais tout ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jourSemaine = Application.WorksheetFunctions.JOURSEM(NbJourSem)
     
            'Affichage de jourSemaine dans un but vérificatif durant débuggage
            MsgBox jourSemaine
    N'affiche rien en MsgBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        NBJoursOuvres = Range("A5").Formula = "=NB.JOURS.OUVRES(" & premierJourMois & "; " & dernierJourMois & ")"
    N'affiche rien dans A5

    Mais merci pour l'erreur dans la cellule, je ne savais pas ce qui faisait ça je vais mettre une valeur

    Edit: J'ai mis:

    Avant End Function, mais ça n'affiche toujours rien

  8. #8
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    mais que voudrais tu qu'elle retourne ? n'utilise pas une fonction de feuille de calcul pour tes essais avec tous tes messagebox et consorts ..

  9. #9
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut
    Ok

    Merci pour le conseil. Je teste ça comment?

    Sinon je pense que (si c'est possible), elle retournera un booléen; elle sera liée à une image, et si possible l'image changera selon si false ou true

    Mais là je suis un peu bloqué car l'exécution ne se fait pas

  10. #10
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    avant de l’appeler en tant que feuille de calcul tu peu faire cela depuis la fenêtre exécution (CTRL+G dans l'éditeur VBA)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print genererJoursOuvres( 10, 2010)
    pour le jour de la semaine tu peu utiliser directement la fonction VBA WeekDay :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       'tentative d'utilisation de JSEM
           JourSemaine = Weekday(NbJourSem)
           'Affichage de jourSemaine dans un but vérificatif durant débuggage
            Debug.Print "JourSemaine = " & JourSemaine
            Stop 'Appuyez sur F5 pour continuer
    tu devrais peu être remplacer tes message box par des debug.print .. ce qui à l'avantage de ne pas être bloquant, tu vois le résultat dans la fenêtre exécution ... et si tu as besoin de bloquer tu ajoute l'instruction stop dans ton code (un appuis

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut
    Merci, je vais suivre vos conseils et corriger ça, je vous tiens au courant!

    Au sujet de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NBJoursOuvres = WorksheetFunction.NB.JOURS.OUVRES(premierJourMois, dernierJourMois)
    Qu'est ce qui ne va pas?

    Re,

    J'ai suivi tes conseils, et utilise des fonctions internes à VB qui font la même chose (weekday & networkdays). Weekday me renvoyait "faux" à chaque fois, donc j'ai format(serialdate(...), "yyyy-mm-dd") et ça fonctionne nickel.

    Par contre pour networkingdays ça ne fonctionne pas, erreur:

    "Sub ou Fonction non définie" en pointant sur le mot networkdays

    La ligne en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    premierJourMoisString = "01/" & mois + 1 & "/" & annee
    dernierJourMois = Format(DateAdd("d", -1, premierJourMoisString), "yyyy-mm-dd")
    premierJourMoisString = "01/" & mois & "/" & annee
    premierJourMois = Format(CDate(premierJourMoisString), "yyyy-mm-dd")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NBJoursOuvres = Evaluate(networkdays(premierJourMois, dernierJourMois))

  12. #12
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut,juste à titre d'information la contribution de Joel sur http://www.developpez.net/forums/d29...-jours-ouvres/

  13. #13
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut
    Trouvé

    Il fallait cocher la référence atpvbaen.xls pour que networkdays fonctionne

    Si ça peut servir à quelqu'un! Tout ce que je voulais fonctionne maintenant, merci à vous!

    Merci Kiki29 pour le lien je vais lire ça avec le plus grand intérêt!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Vérrification d'une date
    Par Darkenshin dans le forum C
    Réponses: 17
    Dernier message: 09/11/2005, 10h51
  2. Débutant: Aide avec nombre Armstrong
    Par D3V1L J4M dans le forum C++
    Réponses: 5
    Dernier message: 31/10/2005, 11h35
  3. [débutant] Aide pour mettre une FOREIGN KEY sur une table
    Par cauldron dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/11/2004, 17h16
  4. [Débutant] Aide utilisation fonctions :(
    Par trakiss dans le forum Débuter
    Réponses: 10
    Dernier message: 27/08/2004, 15h59
  5. Création requete besoin d'aide pour une date
    Par royrremi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/07/2004, 22h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo