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
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,
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
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,
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