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 :

VBA - Appliquer une formule à une colonne puis additionner [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut VBA - Appliquer une formule à une colonne puis additionner
    Bonjour,

    Je sollicite votre aide car mes connaissances de VBA sont assez limitées.
    Vous trouverez en pièce jointe l'extrait du fichier sur lequel je travaille et qui me pose problème. Il s'agit d'un fichier de suivi de projet.
    • L'onglet Holidays comporte un tableau dans lequel je rentre manuellement les jours fériés et les congés.
    • L'onglet Feuil_calc_budg: des colonnes A à I, il s'agit de la liste de tâches de mon projet, leur type, leur date de fin la durée,...ces informations sont extraites d'une autre feuille (mise en forme) via une macro. Cette liste à une longueur variable.
      Des colonnes J à GO, c'est le calendrier semaine par semaine de mon projet.


    Mon but est d'obtenir l'évolution globale de la worload calculée par semaine puis cumulée de la première semaine à la dernière semaine, pour les tâches définies comme Activity (en colonne A).

    J'ai essayé de faire ceci via des formules, ce qui m'a poussé à calculer ce que je cherche tâche par tâche puis d’additionner.
    J'ai réussi à établir les deux types de formules nécessaires, elles semblent fonctionner comme il faut.

    • Pour la colonne J, je calcule la workload pour la première semaine du projet (il n'y a pas de cumul car pas de semaine précédente). Formule pour la cellule J3:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      =SI($A3="Activity";SI($H3<J$1;;SI(ET($F3<J$1;$H3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES(J$1;$H3;Holidays!$A$6:$A$150)*$C3;SI(ET($F3<J$1;$H3>(J$1+5));NB.JOURS.OUVRES(J$1;J$1+5;Holidays!$A$6:$A$150)*$C3;SI(ET($F3>=J$1;$F3<=(J$1+5);$H3>(J$1+5));NB.JOURS.OUVRES($F3;J$1+5;Holidays!$A$6:$A$150)*$C3;SI(ET($F3>(J$1+5));;SI(ET($F3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES($F3;$H3;Holidays!$A$6:$A$150)*$C3;))))));)
    • Pour chaque colonne de J à GO, je calcule la workload et je cumule avec la semaine précédente. Formule pour la cellule K2:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      =SI($A3="Activity";SI($H3<K$1;J3;SI(ET($F3<K$1;$H3>=K$1;$H3<=(K$1+5));NB.JOURS.OUVRES(K$1;$H3;Holidays!$A$6:$A$150)*$C3+J3;SI(ET($F3<K$1;$H3>(K$1+5));NB.JOURS.OUVRES(K$1;K$1+5;Holidays!$A$6:$A$150)*$C3+J3;SI(ET($F3>=K$1;$F3<=(K$1+5);$H3>(K$1+5));NB.JOURS.OUVRES($F3;K$1+5;Holidays!$A$6:$A$150)*$C3+J3;SI(ET($F3>(K$1+5));J3;SI(ET($F3>=K$1;$H3<=(K$1+5));NB.JOURS.OUVRES($F3;$H3;Holidays!$A$6:$A$150)*$C3+J3;))))));)

    Et ensuite je fais la somme de chaque colonne en ligne 2. Tout cela fonctionne très bien mais cela prend beaucoup de temps à calculer et rend le fichier très lourd.

    J'ai donc pensé qu'il serait possible de faire tout cela via VBA, d'automatiser cela pour éviter tous ces calculs ligne par ligne et colonne par colonne.

    La macro ferait les calculs, de la ligne 3 à la dernière ligne non vide (qui serait déterminée par le fait que la cellule B soit vide), pour la colonne J, indiquerait la somme en J2, puis pour les colonnes K à GO en indiquant la somme en ligne 2.

    Afin de pour télécharger le fichier car il était trop lourd, j'ai du supprimer les colonnes après EA et m’arrêter à la ligne 20.

    J'espère avoir été clair...

    Je vous remercie par avance.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Je regarde. Ca va prendre quelques jours. La macro de calcul va être assez longue. Il sera intéressant de faire aussi une macro événementielle qui recalcule uniquement la ligne qui a été modifiée.

    Est-ce que la seule différence entre J3 et K3, ce sont les "+J3" ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour Daniel,

    Oui c'est la seule différence (pas de cumul pour la colonne J).

    J'ai commencé ce bout de code pour la colonne J mais ça plante: incompatibilité de type (13) lors du calcul de s (Désolé s'il y a avait une manip pour insérer proprement du code dans mon message mais je ne l'ai pas trouvé).

    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
    Sub Macro6()
    Dim i, s, t  As Integer
    Sheets("Feuil_calc_budg").Select
     
    Range("A2").Select
    Selection.End(xlDown).Select
    ligne_active_cachée = ActiveCell.Row
     
    For i = 3 To ligne_active_cachée
    s = 0
    If Cells(i, 1) = "Activity" Then
        If Cells(i, 8) < Cells(1, 10) Then
        s = 0
        Else
             If Cells(i, 6) < Cells(1, 10) And Cells(i, 8) >= Cells(1, 10) And Cells(i, 8) <= DateAdd("d", 5, Cells(1, 10)) Then
             s = [NetworkDays(Cells(1, 10), Cells(i, 8))] * Cells(i, 3)
             Else
                  If Cells(i, 6) < Cells(1, 10) And Cells(i, 8) >= Cells(1, 10) + 5 Then
                  s = [NetworkDays(Cells(1, 10), DateAdd("d", 5, Cells(1, 10)))] * Cells(i, 3)
                  Else
                       If Cells(i, 6) >= Cells(1, 10) And Cells(i, 6) <= DateAdd("d", 5, Cells(1, 10)) And Cells(i, 8) > DateAdd("d", 5, Cells(1, 10)) Then
                       s = [NetworkDays(Cells(i, 6), DateAdd("d", 5, Cells(1, 10)))] * Cells(i, 3)
                       Else
                            If Cells(i, 6) > Cells(1, 10) + 5 Then
                            s = 0
                            Else
                                 If Cells(i, 6) >= Cells(1, 10) And Cells(i, 8) <= DateAdd("d", 5, Cells(1, 10)) Then
                                 s = [NetworkDays(Cells(i, 6), Cells(i, 8))] * Cells(i, 3)
                                 Else
                                 s = 0
                                 End If
                            End If
                       End If
                  End If
             End If
        End If
    End If
            t = t + s
    Next
    Range("J2") = t
     
    End Sub

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Voici mon code pour la colonne J. Si tu pouvais déjà vérifier si c'est bon :

    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
    Sub Calculs()
        Dim C As Range, Ligne As Long
        With Sheets("Feuil_calc_budg")
            Ligne = .Cells(.Rows.Count, 2).End(xlUp).Row
            For Each C In .Range("J3:J" & Ligne)
                C.Value = 0
                If .Cells(C.Row, 1) = "Activity" Then
                    If .Cells(C.Row, 8) < .Cells(1, C.Column) Then
                    Else
                        If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) >= .Cells(1, C.Column) And _
                            .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                            C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(C.Row, 8), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                        Else
                            If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                .Cells(C.Row, 8) > .Cells(1, C.Column) + 5 Then
                                C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                            Else
                                If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                    .Cells(C.Row, 8) > .Cells(1, C.Column) Then
                                    C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                Else
                                    If .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                    Else
                                        If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                                            C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(C.Row, 8), _
                                            [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next C
        End With
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    J'ai fait une correction à ton code (une histoire de > ou >=) et ça fonctionne très bien, merci!

    Par contre ça mouline pas mal. Je me suis dis que cela venait du fait que l'on inscrit la valeur dans chaque cellule de la colonne, donc j'ai modifié le code comme suit, mais rien ni fait.

    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
    Sub Macro6()
    Dim i, s, t  As Integer
    Sheets("Feuil_calc_budg").Select
     
    Range("A2").Select
    Selection.End(xlDown).Select
    ligne_active_cachée = ActiveCell.Row
     
    For i = 3 To ligne_active_cachée
    s = 0
    If Cells(i, 1) = "Activity" Then
     
        If Cells(i, 8) < Cells(1, 10) Then
        s = 0
        Else
        If Cells(i, 6) < Cells(1, 10) And Cells(i, 8) >= Cells(1, 10) And Cells(i, 8) <= DateAdd("d", 5, Cells(1, 10)) Then
        s = [NetworkDays(Cells(1, 10), Cells(i, 8))] * Cells(i, 3)
        Else
        If Cells(i, 6) < Cells(1, 10) And Cells(i, 8) >= Cells(1, 10) + 5 Then
        s = [NetworkDays(Cells(1, 10), DateAdd("d", 5, Cells(1, 10)))] * Cells(i, 3)
        Else
        If Cells(i, 6) >= Cells(1, 10) And Cells(i, 6) <= DateAdd("d", 5, Cells(1, 10)) And Cells(i, 8) > DateAdd("d", 5, Cells(1, 10)) Then
        s = [NetworkDays(Cells(i, 6), DateAdd("d", 5, Cells(1, 10)))] * Cells(i, 3)
        Else
        If Cells(i, 6) > Cells(1, 10) + 5 Then
        s = 0
        Else
        If Cells(i, 6) >= Cells(1, 10) And Cells(i, 8) <= DateAdd("d", 5, Cells(1, 10)) Then
        s = [NetworkDays(Cells(i, 6), Cells(i, 8))] * Cells(i, 3)
        Else
        s = 0
        End If
        End If
        End If
        End If
        End If
        End If
        End If
            t = t + s
    Next
    Range("J2") = t
     
    End Sub
     
     
    Sub Calculs()
        Dim C As Range, s As Integer, t As Integer, Ligne As Long
        With Sheets("Feuil_calc_budg")
            Ligne = .Cells(.Rows.Count, 3).End(xlUp).Row
            For Each C In .Range("J3:J" & Ligne)
            s = 0
                C.Value = 0
                If .Cells(C.Row, 1) = "Activity" Then
                    If .Cells(C.Row, 8) < .Cells(1, C.Column) Then
                    Else
                        If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) >= .Cells(1, C.Column) And _
                            .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                            s = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(C.Row, 8), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                        Else
                            If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                s = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                            Else
                                If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                    .Cells(C.Row, 8) > .Cells(1, C.Column) Then
                                    s = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                Else
                                    If .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                    Else
                                        If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                                            s = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(C.Row, 8), _
                                            [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
                t = t + s
            Next C
    Range("J2") = t
                End With
    End Sub
    Bon, reste à trouver la même chose pour les autres colonnes.

    Encore merci

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Tu peux me dire où est l'erreur dans mon code ? (je n'ai pas envie de décortiquer le tien !) Sinon, oui, Ca va être assez long, c'est pourquoi je t'ai parlé d'une macro événementielle qui ne recalculera que ce qui est nécessaire.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Il s'agit des lignes 14 à 16:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                .Cells(C.Row, 8) > .Cells(1, C.Column) + 5 Then
                                C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
    que j'ai remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                s = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
    (outre le fait que comme je disais j'ai bricolé ton code pour ne pas renseigner chaque cellule mais plutôt les stocker sous s et les appliquer à t)

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Ou je dors encore (possible) ou je ne comprends pas. Comment les deux conditions ".Cells(C.Row, 6) < .Cells(1, C.Column)" et .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 peuvent être remplies ?
    Dès que les deux formules seront remplies, j'essaierai de passer par des variables tableau pour accélérer le traitement.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Au temps pour moi, la deuxième condition concernant .Cells(C.Row, 8) et non .Cells(C.Row, 6).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) > .Cells(1, C.Column) + 5 Then
    s = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Essaie cette macro. J'ai utilisé le timer pou voir la durée d'exécution : /2 seconde :

    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
    Sub Calculs()
        Dim C As Range, Ligne As Long
        deb = Timer
        With Sheets("Feuil_calc_budg")
            Ligne = .Cells(.Rows.Count, 2).End(xlUp).Row
            For Each C In .Range("J3:J" & Ligne)
                C.Value = 0
                If .Cells(C.Row, 1) = "Activity" Then
                    If .Cells(C.Row, 8) < .Cells(1, C.Column) Then
                    Else 'SI(ET($F3<J$1;$H3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES(J$1;$H3;Holidays!$A$6:$A$150)*$C3;
                        If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) >= .Cells(1, C.Column) And _
                            .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                            C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(C.Row, 8), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                        Else 'SI(ET($F3<J$1;$H3>(J$1+5));NB.JOURS.OUVRES(J$1;J$1+5;Holidays!$A$6:$A$150)*$C3;
                            If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) > .Cells(1, C.Column) Then
                                C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                            Else 'SI(ET($F3>=J$1;$F3<=(J$1+5);$H3>(J$1+5));NB.JOURS.OUVRES($F3;J$1+5;Holidays!$A$6:$A$150)*$C3;
                                If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                    .Cells(C.Row, 8) > .Cells(1, C.Column) + 5 Then
                                    C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                Else 'SI(ET($F3>(J$1+5));;SI(ET($F3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES($F3;$H3;Holidays!$A$6:$A$150)*$C3;))))));)
                                    If .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                    Else
                                        If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                                            C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(C.Row, 8), _
                                            [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next C
            For Each C In .Range("K3:GO" & Ligne)
                C.Value = 0
                If .Cells(C.Row, 1) = "Activity" Then
                    If .Cells(C.Row, 8) < .Cells(1, C.Column) Then
                        C.Value = C.Offset(, -1).Value
                    Else 'SI($H3<J$1;;SI(ET($F3<J$1;$H3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES(J$1;$H3;Holidays!$A$6:$A$150)*$C3;
                        If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) >= .Cells(1, C.Column) And _
                            .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                            C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(C.Row, 8), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                        Else
                            If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) > .Cells(1, C.Column) Then
                                C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                            Else
                                If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                    .Cells(C.Row, 8) > .Cells(1, C.Column) + 5 Then
                                    C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                                Else
                                    If .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                    Else
                                        If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                                            C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(C.Row, 8), _
                                            [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next C
        End With
        MsgBox Timer - deb
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    bah écoute, ça marche du tonnerre et c'est super rapide, le timer indique environ 4!

    merci infiniment Daniel.Problème résolu!

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    bonsoir Daniel,

    Je vais abuser de tes talents..dans le but de pouvoir réutiliser le fichier pour d'autres projets avec une durée variable, est-il possible d'avoir un nombre de colonnes variable, de K à la dernière colonne non vide(en se basant sur la ligne 1 ), plutôt que de limiter la seconde partie des calcul à K3:GO ?

  13. #13
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    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
    Sub Calculs()
        Dim C As Range, Ligne As Long, Col As Integer
        deb = Timer
        With Sheets("Feuil_calc_budg")
            Ligne = .Cells(.Rows.Count, 2).End(xlUp).Row
            For Each C In .Range("J3:J" & Ligne)
                C.Value = 0
                If .Cells(C.Row, 1) = "Activity" Then
                    If .Cells(C.Row, 8) < .Cells(1, C.Column) Then
                    Else 'SI(ET($F3<J$1;$H3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES(J$1;$H3;Holidays!$A$6:$A$150)*$C3;
                        If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) >= .Cells(1, C.Column) And _
                            .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                            C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(C.Row, 8), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                        Else 'SI(ET($F3<J$1;$H3>(J$1+5));NB.JOURS.OUVRES(J$1;J$1+5;Holidays!$A$6:$A$150)*$C3;
                            If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) > .Cells(1, C.Column) Then
                                C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                            Else 'SI(ET($F3>=J$1;$F3<=(J$1+5);$H3>(J$1+5));NB.JOURS.OUVRES($F3;J$1+5;Holidays!$A$6:$A$150)*$C3;
                                If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                    .Cells(C.Row, 8) > .Cells(1, C.Column) + 5 Then
                                    C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                Else 'SI(ET($F3>(J$1+5));;SI(ET($F3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES($F3;$H3;Holidays!$A$6:$A$150)*$C3;))))));)
                                    If .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                    Else
                                        If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                                            C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(C.Row, 8), _
                                            [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next C
            Col = .Cells(1, .Columns.Count).End(xlToLeft).Column
            For Each C In .Range("K3", .Cells(Ligne, Col))
                C.Value = 0
                If .Cells(C.Row, 1) = "Activity" Then
                    If .Cells(C.Row, 8) < .Cells(1, C.Column) Then
                        C.Value = C.Offset(, -1).Value
                    Else 'SI($H3<J$1;;SI(ET($F3<J$1;$H3>=J$1;$H3<=(J$1+5));NB.JOURS.OUVRES(J$1;$H3;Holidays!$A$6:$A$150)*$C3;
                        If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) >= .Cells(1, C.Column) And _
                            .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                            C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(C.Row, 8), [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                        Else
                            If .Cells(C.Row, 6) < .Cells(1, C.Column) And .Cells(C.Row, 8) > .Cells(1, C.Column) Then
                                C.Value = WorksheetFunction.NetworkDays(.Cells(1, C.Column), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                            Else
                                If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 6) <= .Cells(1, C.Column) + 5 And _
                                    .Cells(C.Row, 8) > .Cells(1, C.Column) + 5 Then
                                    C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(1, C.Column) + 5, [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                                Else
                                    If .Cells(C.Row, 6) > .Cells(1, C.Column) + 5 Then
                                    Else
                                        If .Cells(C.Row, 6) >= .Cells(1, C.Column) And .Cells(C.Row, 8) <= .Cells(1, C.Column) + 5 Then
                                            C.Value = WorksheetFunction.NetworkDays(.Cells(C.Row, 6), .Cells(C.Row, 8), _
                                            [Holidays!$A$6:$A$150]) * .Cells(C.Row, 3) + C.Offset(, -1).Value
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next C
        End With
        MsgBox Timer - deb
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Juste...parfait!

    je te remercie!

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

Discussions similaires

  1. [VBA-E] problème avec une formule
    Par jamelie dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 25/04/2007, 11h13
  2. [VBA] Macro qui envoie une formule dans une cellule
    Par Okoss dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2007, 22h32
  3. [VBA-Excel] transposition d'une formule
    Par cedric59dk dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/01/2007, 15h28
  4. [VBA-Excel] Calcul d'une formule avec une inconnue
    Par micwiss dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/10/2006, 16h04
  5. [VBA-E]copie d'une formule tant que
    Par arkazar dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/03/2006, 12h27

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