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

VBA Project Discussion :

Import CSV durée en jours calendaires


Sujet :

VBA Project

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Import CSV durée en jours calendaires
    Bonjour,

    Je cherche à importer un fichier CSV qui contient Start_Date et Duration. Le problème est que le champ Duration est exprimé en jours calendaires et non en working days qui est, je crois, le format par défaut de travail sous MS-project.

    J'ai essayé 2 méthodes mais je ne sais pas quelle est la meilleure et s'il existe une méthode plus appropriée*...
    (*) je peux aussi essayer de changer mon fichier .csv en entrée pour transformer la durée calendaire en nombre de working days mais il me faudrait alors aller sur un forum Python

    1ère méthode: créer un calendrier '7days', allouer une ressource qui travaille 7 jours sur 7 (pas très sympa...). Voir le code ci-dessous. Je ne comprends pas pourquoi MS-project n'alloue pas toujours les ressources à 100% de leur temps. Si j'affiche 'Resource Names', je vois parfois rC[45%]... Faut-il changer le code pour forcer une allocation à 100%? Si oui, je ne sais pas quel champ(s) positionner

    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
     
    '   aSetCalendar
    '   define '7days' calendar
    '
     Sub aSetCalendar()
        On Error GoTo aSetCalendarExit:
        BaseCalendarCreate Name:="7days", FromName:="Standard"
     
        ' set Sunday as working day
        '
        ActiveProject.BaseCalendars("7days").WeekDays(1).Shift1.Start = "08:00"
        ActiveProject.BaseCalendars("7days").WeekDays(1).Shift1.Finish = "12:00"
        ActiveProject.BaseCalendars("7days").WeekDays(1).Shift2.Start = "13:00"
        ActiveProject.BaseCalendars("7days").WeekDays(1).Shift2.Finish = "14:00"
        ActiveProject.BaseCalendars("7days").WeekDays(1).Shift3.Clear
        ActiveProject.BaseCalendars("7days").WeekDays(1).Shift4.Clear
        ActiveProject.BaseCalendars("7days").WeekDays(1).Shift5.Clear
     
        ActiveProject.BaseCalendars("7days").WeekDays(2).Default
        ActiveProject.BaseCalendars("7days").WeekDays(3).Default
        ActiveProject.BaseCalendars("7days").WeekDays(4).Default
        ActiveProject.BaseCalendars("7days").WeekDays(5).Default
        ActiveProject.BaseCalendars("7days").WeekDays(6).Default
     
        ' set Saturday as working day
        '
        ActiveProject.BaseCalendars("7days").WeekDays(7).Shift1.Start = "08:00"
        ActiveProject.BaseCalendars("7days").WeekDays(7).Shift1.Finish = "12:00"
        ActiveProject.BaseCalendars("7days").WeekDays(7).Shift2.Start = "13:00"
        ActiveProject.BaseCalendars("7days").WeekDays(7).Shift2.Finish = "14:00"
        ActiveProject.BaseCalendars("7days").WeekDays(7).Shift3.Clear
        ActiveProject.BaseCalendars("7days").WeekDays(7).Shift4.Clear
        ActiveProject.BaseCalendars("7days").WeekDays(7).Shift5.Clear
        Exit Sub
    aSetCalendarExit:
    End Sub
     
    '   aDefineResource
    '   define a resource 'rC' assigned to '7days' calendar
    '
    Private Sub aDefineResource(rC As String)
        On Error GoTo aDefineResourceExit:
        ViewApply Name:="Resource &Sheet"
        SelectResourceField Row:=0, Column:="Name"
        SetResourceField Field:="Name", Value:=rC
        SelectResourceField Row:=0, Column:="Base Calendar"
        SetResourceField Field:="Base Calendar", Value:="7days"
        SelectResourceField Row:=9, Column:="Group"
        ViewApply Name:="&Gantt Chart"
        Exit Sub
    aDefineResourceExit:
    End Sub
     
    '   aSetResource
    '   define a '7days' calendar and a 'rC' resource assigned to '7days'
    '   assign 'rC' resource to all tasks
    '
    Sub aSetResources()
        Dim t As Task
        Dim nT As Integer
     
        Call aSetCalendar
     
        Call aDefineResource("rC")
        For Each t In ActiveProject.Tasks
            t.ResourceNames = "rC"
        Next t
    End Sub
    2ème méthode: créer un calendrier '7days', affecter ce calendrier à toutes les tâches du projet. Ici, mon code semble être sans effet. Faut-il forcer un recalcul MS-projet? Si oui, je ne vois pas de fonction calculate() comme sous Excel... Si je fais juste appel à aSetCalendar et que ensuite je fais un double-clic sur une tâche, puis onglet Advanced, je mets Calendar à '7days', cette fois MS-project prend en compte la demande, d'où ma question sur le calculate()

    note: le code ci-dessous s'exécute après avoir appelé la macro aSetCalendar définie dans la 1ère méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub atestSetCalendar()
        Dim t As Task
     
        For Each t In ActiveProject.Tasks
            s = t.GetField(pjTaskCalendar)
            t.SetField FieldID:=pjTaskCalendar, Value:="7days"
        Next t
    End Sub
    Je tourne un peu en rond là et j'espère que vous allez pouvoir me débloquer...
    Merci d'avance!!

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2017
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    En réponse à ma question, une 3ème méthode, qui fait la conversion nombre de jours calendaires en nombre de jours travaillés:
    Le traitement "propre" consiste à importer le CSV sous Excel, à remplacer la durée calendaire par le nombre de jours travaillés. Ici, pour éviter cette étape sous Excel, on réalise la même opération directement sous MS project en utilisant la fonction vba trouvée à l'adresse http://www.cpearson.com/excel/betternetworkdays.aspx

    La macro aConvertByCalendarDaysToWorkingDays appelle donc NetWorkdays2 en considérant que la suppression des samedi et dimanche réalise la conversion.
    L'intérêt est qu'il n'est pas nécessaire de créér un calendrier spécial ni de crééer des ressources en overload.

    Exemple:

    A B C
    1 Start_Date CalendarDays WorkingDays
    2 30/09/2016 243 174


    En C2, on a =NETWORKDAYS(A2;A2+B2)

    On va donc remplacer dans le fichier .CSV la colonne CalendarDays par la colonne WorkingDays et c'est ce fichier modifié que l'on importe sous MS project.


    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    ' Ref: http://www.cpearson.com/excel/betternetworkdays.aspx
    '
     
    Public Function NetWorkdays2(StartDate As Date, EndDate As Date, _
        ExcludeDaysOfWeek As Long, Optional Holidays As Variant) As Variant
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' NetWorkdays2
    ' This function calcluates the number of days between StartDate and EndDate
    ' excluding those days of the week specified by ExcludeDaysOfWeek and
    ' optionally excluding dates in Holidays. ExcludeDaysOfWeek is a
    ' value from the table below.
    '       1  = Sunday     = 2 ^ (vbSunday - 1)
    '       2  = Monday     = 2 ^ (vbMonday - 1)
    '       4  = Tuesday    = 2 ^ (vbTuesday - 1)
    '       8  = Wednesday  = 2 ^ (vbWednesday - 1)
    '       16 = Thursday   = 2 ^ (vbThursday - 1)
    '       32 = Friday     = 2 ^ (vbFriday - 1)
    '       64 = Saturday   = 2 ^ (vbSaturday - 1)
    ' To exclude multiple days, add the values in the table together. For example,
    ' to exclude Mondays and Wednesdays, set ExcludeDaysOfWeek to 10 = 8 + 2 =
    ' Monday + Wednesday.
    ' If StartDate is less than or equal to EndDate, the result is positive. If
    ' StartDate is greater than EndDate, the result is negative. If either
    ' StartDate or EndDate is less than or equal to 0, the result is a
    ' #NUM error. If ExcludeDaysOfWeek is less than 0 or greater than or
    ' equal to 127 (all days excluded), the result is a #NUM error.
    ' Holidays is optional and may be a single constant value, an array of values,
    ' or a worksheet range of cells.
    ' This function can be used as a replacement for the NETWORKDAYS worksheet
    ' function. With NETWORKDAYS, the excluded days of week are hard coded
    ' as Saturday and Sunday. You cannot exlcude other days of the week. This
    ' function allows you to exclude any number of days of the week (with the
    ' exception of excluding all days of week), from 0 to 6 days. If
    ' ExcludeDaysOfWeek = 65 (Sunday + Saturday), the result is the same as
    ' NETWORKDAYS.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
    Dim TestDayOfWeek As Long
    Dim TestDate As Date
    Dim Count As Long
    Dim Stp As Long
    Dim Holiday As Variant
    Dim Exclude As Boolean
     
    If ExcludeDaysOfWeek < 0 Or ExcludeDaysOfWeek >= 127 Then
        ' invalid value for ExcludeDaysOfWeek. get out with error.
        NetWorkdays2 = CVErr(xlErrNum)
        Exit Function
    End If
     
    If StartDate <= 0 Or EndDate <= 0 Then
        ' invalid date. get out with error.
        NetWorkdays2 = CVErr(xlErrNum)
        Exit Function
    End If
     
    ' set the value used for the Step in
    ' the For loop.
    If StartDate <= EndDate Then
        Stp = 1
    Else
        Stp = -1
    End If
     
    For TestDate = StartDate To EndDate Step Stp
        ' get the bit pattern of the weekday of TestDate
        dn = Weekday(TestDate, vbSunday)
     
        TestDayOfWeek = 2 ^ (Weekday(TestDate, vbSunday) - 1)
        If (TestDayOfWeek And ExcludeDaysOfWeek) = 0 Then
            ' do not exclude this day of week
            If IsMissing(Holidays) = True Then
                ' count day
                Count = Count + 1
            Else
                Exclude = False
                ' holidays provided. test date for holiday.
                If IsObject(Holidays) = True Then
                    ' assume Excel.Range
                    For Each Holiday In Holidays
                        If Holiday.Value = TestDate Then
                            Exclude = True
                            Exit For
                        End If
                    Next Holiday
                Else
                    ' not an Excel.Range
                    If IsArray(Holidays) = True Then
                        For Each Holiday In Holidays
                            If Int(Holiday) = TestDate Then
                                Exclude = True
                                Exit For
                            End If
                        Next Holiday
                    Else
                        ' not an array or range, assume single value
                        If TestDate = Holidays Then
                            Exclude = True
                        End If
                    End If
                End If
                If Exclude = False Then
                    Count = Count + 1
                End If
            End If
        Else
            ' excluded day of week. do nothing
        End If
    Next TestDate
    ' return the result, positive or negative based on Stp.
    NetWorkdays2 = Count * Stp
     
    End Function
     
    Sub aConvertByCalendarDaysToWorkingDays()
        Dim t As Task
     
        For Each t In ActiveProject.Tasks
            t.Finish = t.Start + NetWorkdays2(t.Start, t.Finish, 1 + 64) - 1
        Next t
    End Sub

Discussions similaires

  1. IMP - Import de partitions mises-à-jours
    Par JahPil78 dans le forum Import/Export
    Réponses: 8
    Dernier message: 09/07/2007, 10h16
  2. export & import avec mise a jours
    Par meskOra dans le forum Administration
    Réponses: 1
    Dernier message: 04/04/2007, 19h00
  3. Import XML pour mise à jour de données
    Par stylee307 dans le forum Access
    Réponses: 2
    Dernier message: 20/09/2006, 21h29
  4. Durée en jours, entre deux dates
    Par Arvulis dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/09/2006, 18h45
  5. Durée en jour, minute et heure entre 2 dates
    Par nora_ora dans le forum Oracle
    Réponses: 7
    Dernier message: 10/08/2005, 22h47

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