Syntaxe CountIF

Bonjour le forum,

Je viens de nouveau solliciter votre aide.

J'ai commencé la macro suivante:

Sub rer()

Dim s As Integer, j As Integer
Dim myRange As Range

Set f = Sheets("Feuil1")

    ''Définir les limites du planning
    DerniereLigne = Feuil1.Range("A300").End(xlUp).Address
    L = Range(DerniereLigne).Row

    For i = 3 To L 'Definit lignes

    With f
    j = 4 'colonne
    Set myRange = .Cells(i, j)
    End With

    s = Application.WorksheetFunction.CountIf(myRange, "Super")
    Next i

    'Modif 1ère tache de super

    If Cells(i, 4) = "Super" Then
        Cells(i, 3) = Cells(i, 3) + (1 / (s * 3))

    'Modif 2ème tache de super

    ElseIf Cells(i, 4) = "Super" Then
        Cells(i, 3) = Cells(i, 3) + (1 / (s * 3))
        Cells(i, 2) = Cells(i, 2) + (1 / (s * 3))

End Sub

Ce que je souhaite faire c'est :

1 - Compter le nombre total de tâches dans la colonne 4 de mon classeur portant le nom "Super" pour l'utiliser ensuite pour modifier les valeurs de mes colonnes 2 et 3.

2 - Pour la première tâche "Super" je veux juste modifier la valeur de la colonne 3.

3 - Pour toutes les autres tâches "Super" qui suivent, je souhaite modifier les valeurs des colonnes 2 et 3.

Ci-joint le fichier Excel.

Je vous remercie d'avance de votre aide !

Barrym

18test1.xlsm (15.32 Ko)

Bonjour,

Que fait-on pour les autres tâches que "Super" ?

Bonjour Raja,

Merci de t'être penché sur mon problème.

Pour les autres tâches autres que "Super", on ne les prend pas en compte, elles restent comme elles sont.

Re,

Essaye le code suivant :

Option Explicit

Sub rer()
    Dim nbS As Integer, nbSPrec As Integer, derLig As Integer, i As Integer, f As Worksheet
    Set f = Sheets("Feuil1")
    'Définir les limites du planning
    With f
        derLig = .Range("A" & Rows.Count).End(xlUp).Row
        For i = 3 To derLig 'Definit lignes
            nbS = WorksheetFunction.CountIf(.Range(.Cells(3, 4), .Cells(i, 4)), "Super")
            If nbS = 1 Then
                .Cells(i, 3) = .Cells(i, 3) + (1 / (nbS * 3))
            'Modif 2ème tache de super
            ElseIf nbS > 1 And nbSPrec < nbS Then
                .Cells(i, 2) = .Cells(i, 2) + (1 / (nbS * 3))
                .Cells(i, 3) = .Cells(i, 3) + (1 / (nbS * 3))
            End If
            nbSPrec = nbS
        Next i
    End With
    Set f = Nothing
End Sub

Re Raja,

Merci beaucoup pour cette macro qui fonctionne !

En faisant un test sur mon projet, je me suis aperçu que j'avais oublié une chose.

Est-il possible d'ajouter une incrémentation dans cette macro ?

Par exemple, la première tâche de "Super" ne changerait pas, on aurait toujours :

.Cells(i, 3) = .Cells(i, 3) + (1 / (nbS * 3))

Pour la deuxième tâche de "Super", on aurait:

.Cells(i, 2) = .Cells(i, 2) + (1 / (nbS * 3))
.Cells(i, 3) = .Cells(i, 3) + ( 2/ (nbS * 3))

Pour la troisième tâche de "Super", on aurait:

.Cells(i, 2) = .Cells(i, 2) + (2 / (nbS * 3))
.Cells(i, 3) = .Cells(i, 3) + ( 3/ (nbS * 3))

Pour la quatrième tâche de "Super", on aurait:

.Cells(i, 2) = .Cells(i, 2) + (3 / (nbS * 3))
.Cells(i, 3) = .Cells(i, 3) + ( 4/ (nbS * 3))

Et ainsi de suite...

merci d'avance !

Re,

A tester :

Sub rer()
    Dim nbS As Integer, nbSPrec As Integer, derLig As Integer, i As Integer, f As Worksheet
    Set f = Sheets("Feuil1")
    With f
        'Définit la limite du tableau
        derLig = .Range("A" & Rows.Count).End(xlUp).Row
        For i = 3 To derLig 'Definit la limite du boucle
            nbS = WorksheetFunction.CountIf(.Range(.Cells(3, 4), .Cells(i, 4)), "Super")
            If nbSPrec < nbS Then 'la colonne 4 contient le mot "Super"
                'avec les lignes possédant le mot "Super"
                If nbS >= 1 Then .Cells(i, 3) = .Cells(i, 3) + (nbS / (nbS * 3))
                'uniquement avec les lignes possédant au delà de la 1ère occurence du mot "Super"
                If nbS > 1 Then .Cells(i, 2) = .Cells(i, 2) + (nbS - 1 / (nbS * 3))
                nbSPrec = nbS
            End If
        Next i
    End With
    Set f = Nothing
End Sub

Re Raja,

Merci une nouvelle fois pour cette macro.

J'ai encore question à te poser. Lorsqu'on utilise la fonction CountIf par exemple dans mon cas

nbS = WorksheetFunction.CountIf(.Range(.Cells(3, 4), .Cells(i, 4)), "Super")

, nbs est-il égal au nombre total de tâches portant le nom "Super"?

En fait j'essaie d'automatiser un planning sur excel avec un enchaînement de tâches. La tache "Super" contient des sous-tâches.

Supposons une tâche "Super" comprenant 3 sous-tâches appelées R+1 , R+2 et R+3.

R+1 débute à 1 et se termine à 5.

R+2 débute à 3 (soit 2 jours avant la fin du R+1) et se termine à 10

R+3 débute à 10 (le jour où se termine le R+2) et se termine à 15.

Les dates de début sont dans la colonne 2 de mon classeur et les dates de fin dans ma colonne 3.

Mon but c'est de pouvoir ajouter 1/3 à ma tâche "Super" (comprenant R+1, R+2, R+3).

Si on note nbs le nombre total de sous-tâches comprises dans ma tâche "Super", on obtient ici nbs = 3

Ainsi pour chaque sous-tâche (R+1, R+2, R+3), je dois donc ajouter 1/nbs*3.

- Pour la première sous-tâche (R+1), on aurait un début à 1 et une fin à 5 + (1/3*3)

- Pour la deuxième sous-tâche (R+2), on aurait un début à 3 + (1/3*3) pour respecter l’enchaînement initial avec le R+1 et une fin à 10 + ( (1/3*3) pour respecter la durée initiale de la tâche + (1/3*3) pour augmenter la durée de la tâche de 1/nbs*3 ) soit un début à 3 + (1/nbs*3) et une fin à 20 + (2/nbs*3)

-Pour la troisième sous-tâche (R+3), on aurait un début à 10 + ((1/3*3) + (1/3*3) )pour respecter l’enchaînement initial avec le R+2 et une fin à 15 + ((1/3*3)+(1/3*3)) pour respecter la durée initiale de la tâche + (1/3*3) pour augmenter la durée de la tâche de 1/nbs*3)

Soit un début à 10 + (2/nbs*3) et une fin à 15 + (3/nbs*3)

Et ainsi de suite.

je reconnais que mes explications précédentes n'étaient pas très claires !

Penses-tu donc qu'il faudrait introduire une nouvelle variable ou utiliser une fonction autre que CountIf pour que nbs soit égale au total des sous-tâches de "Super"?

Je te remercie d'avance pour ton aide.

Barrym

Re,

Merci de joindre un fichier à nouveau pour expliciter ta dernière demande.

Re,

Ci-joint mon fichier Excel.

Barrym

5test1.xlsm (17.33 Ko)

Re,

Je suis navré de ne pas comprendre ton problème. Il vaut mieux présenter ton problème à résoudre dans sa globalité au lieu de présenter ton tableau.

Re,

Effectivement, ce sera plus compréhensible avec ce fichier là.

Les couleurs pour chaque tâche se font automatiquement en fonction des dates de début et de fin de celles-ci (en faisant un test tu comprendras mieux).

Ce planning concerne la construction d'un immeuble, il y a donc un enchaînement logique des tâches à respecter (ce que j'ai voulu expliquer dans mon message précédent).

Dans cet exemple, on a deux sous-tâches de "super" . La première appelée "RDC " et la deuxième "débord R+1 cis pointes".

La deuxième sous-tâche doit commencer une semaine avant la fin du "RDC".

Ainsi si je veux augmenter ma tâche "Super" (regroupant les deux sous-tâches) de 2 semaines, il faut que la chacune des sous-tâches soit augmentée d'une semaine.

- Le "RDC" commencerait à la semaine 27 (pas de modification) et se terminerait la semaine 32 (ajout d'une semaine)

- Le "débord R+1" commencerait la semaine 31 +1 (pour que celle-ci commence toujours une semaine avant la fin du "RDC") et se terminerait la semaine 35 +1 (pour respecter sa durée initiale) +1 (pour rajouter la semaine supplémentaire voulue).

J'espère que c'est plus compréhensible !

Barrym


Re,

Effectivement, ce sera plus compréhensible avec ce fichier là.

Les barres représentant les différentes tâches (les couleurs) se mettent automatiquement à jour en fonction des dates de début et de fin des tâches (tu comprendras mieux en faisant un test).

Le planning concernant la construction d'un bâtiment. Il y a donc un enchaînement logique des tâches à respecter (ce que j'ai voulu expliquer dans mon message précédent).

Dans cet exemple, ma tâche "super" est composée de sous-tâches: la première "RDC" et la deuxième "débord R+1".

Ma deuxième sous-tâche doit commencer une semaine avant la fin de la première sous tâche.

Si je veux augmenter ma tâche de "Super" de deux semaines par exemple, il faut que j'augmenter chacune de mes sous-tâches d'une semaine.

- Le "RDC" commencerait donc la semaine 27 ( pas de modification) et se terminerait la semaine 31 +1 (on rajoute la semaine supplémentaire).

-Le "débord R+1" commencerait donc la semaine 31 +1 (pour que celle-ci commence toujours une semaine avant la fin du "RDC") et se terminerait la semaine 35 +1 (pour respecter sa durée initiale) +1 (pour rajouter la semaine supplémentaire).

J'espère que ce sera un peu plus compréhensible comme ça !

Barrym

6test-planning.xlsm (138.53 Ko)
6test-planning.xlsm (138.53 Ko)

Re,

Si je comprends bien, dès qu'on touche le planning du code "Super" préalablement établi, il faudra caler les autres "Super" avec les délais prévus initialement. Sans se préoccuper d'autres codes. Non ?

Re,

Oui c'est exactement ça !

Barrym

Re,

Voir PJ. A tester.

Re,

Merci beaucoup de ton aide !

Peux-tu remettre la pj s'il te plait? tu l'a oublié dans ton dernier message

Re,

C'est fait. Voir le message précédent.

Re Raja,

J'ai repris les codes que t'avais effectués précédemment et je les ai adapté à ma situation. J'ai obtenu le code suivant qui fonctionne très bien.

Sub rer()

    Dim S As Integer, nbS As Integer, nbSPrec As Integer, derLig As Integer, i As Integer, f As Worksheet
    Set f = Sheets("Feuil1")

    With f
        'Définit la limite du tableau
       derLig = .Range("A" & Rows.Count).End(xlUp).Row
        For i = 3 To derLig 'Definit la limite du boucle
           S = WorksheetFunction.CountIf(.Range(.Cells(3, 4), .Cells(i, 4)), "Super")

     Next i

    End With

 With f
        derLig = .Range("A" & Rows.Count).End(xlUp).Row
        For i = 3 To derLig 'Definit lignes
           nbS = WorksheetFunction.CountIf(.Range(.Cells(3, 4), .Cells(i, 4)), "Super")
            If nbS = 1 Then
                .Cells(i, 3) = .Cells(i, 3) + (1 / (S * 3))
            'Modif 2ème tache de super
           ElseIf nbS > 1 And nbSPrec < nbS Then
                .Cells(i, 2) = .Cells(i, 2) + (nbSPrec / (S * 3))
                .Cells(i, 3) = .Cells(i, 3) + (nbS / (S * 3))
            End If
            nbSPrec = nbS
        Next i

    End With

    Set f = Nothing

End Sub

Je n'ai surement pas du être très clair dans mes explications, c'était un peu compliqué par message. En tout cas je te remercie beaucoup, sans toi je n'y serai jamais arrivé !

Bonne soirée à toi.

Barrym

Rechercher des sujets similaires à "syntaxe countif"