Comment adapter une formule matriciel en macro
Bonjour
comment adapter cette formule matriciel en macro pour la gestion des absence des 10 collaborateurs
Je souhaite que l'équivalent de cette formule s'applique pour le collaborateur 1 dans la plage(FU14 : TU14)
En fonction des dates de debut et de fin que je saisi dans les différente periode plus bas dans la feuille a la ligne 39 dans le fichier joint
{=SI(OU(ET(FU$3>=$FP39;FU$3<=$FR39);ET(FU$3>=$FS39;FU$3<=$FU39);ET(FU$3>=$FX39;FU$3<=$GB39);ET(FU$3>=$GE39;FU$3<=$GI39);ET(FU$3>=$GL39;FU$3<=$GP39));"CP";SI(OU(ET(FU$3>=$FP40;FU$3<=$FR40);ET(FU$3>=$FS40;FU$3<=$FU40);ET(FU$3>=$FX40;FU$3<=$GB40);ET(FU$3>=$GE40;FU$3<=$GI40);ET(FU$3>=$GL40;FU$3=$GP40));"CN";SI(OU(ET(FU$3>=$FP41;FU$3<=$FR41);ET(FU$3>=$FS41;FU$3<=$FU41);ET(FU$3>=$FX41;FU$3<=$GB41);ET(FU$3>=$GE41;FU$3<=$GI41);ET(FU$3>=$GL41;FU$3=$GP41));"CD";SI(OU(ET(FU$3>=$FP42;FU$3<=$FR42);ET(FU$3>=$FS42;FU$3<=$FU42);ET(FU$3>=$FX42;FU$3<=$GB42);ET(FU$3>=$GE42;FU$3<=$GI42);ET(FU$3>=$GL42;FU$3=$GP42));"MA";SI(OU(ET(FU$3>=$FP43;FU$3<=$FR43);ET(FU$3>=$FS43;FU$3<=$FU43);ET(FU$3>=$FX43;FU$3<=$GB43);ET(FU$3>=$GE43;FU$3<=$GI43);ET(FU$3>=$GL43;FU$3=$GP43));"MOD";SI(OU(ET(FU$3>=$FP44;FU$3<=$FR44);ET(FU$3>=$FS44;FU$3<=$FU44);ET(FU$3>=$FX44;FU$3<=$GB44);ET(FU$3>=$GE44;FU$3<=$GI44);ET(FU$3>=$GL44;FU$3=$GP44));"FOR";SI(OU(ET(FU$3>=$FP45;FU$3<=$FR45);ET(FU$3>=$FS45;FU$3<=$FU45);ET(FU$3>=$FX45;FU$3<=$GB45);ET(FU$3>=$GE45;FU$3<=$GI45);ET(FU$3>=$GL45;FU$3<=$GP45));"CCS";"")))))))}
J’espère être suffisamment explicite dans ma demande merci d'avance
Bonsoir,
J'ai peut-être mal vu mais je n'ai aperçu aucune matrice !
En tout cas pour moi elle n'a rien de matriciel.
Cordialement.
Qu'est-ce que tu entends par "adapter" ?
Une formule Excel reste une formule Excel !
Si on l'insère en VBA, on l'écrit selon le choix de la méthode d'insertion (Formula ou FormulaR1C1 ou FormulaLocal, etc.).
Le fond de ma pensée est simple !
Donc, pour mon compte, je ne commencerais pas à l'écrire si je prévois un tel allongement. Si je dois me pencher sur la question, je pars des données et de ce qu'on veut obtenir pour chercher un moyen d'écrire une formule beaucoup plus courte. Si vraiment cela n'apparaît pas possible, même en la scindant, en général je finis par opter pour traiter la question en VBA.
Mais à ce moment là, j'ai la faiblesse de penser que VBA présente alors l'avantage de me permettre de me passer de formule, je m'en passe !
Il peut m'arriver d'insérer des formules en VBA, quand cela est particulièrement justifié, je l'ai d'ailleurs fait récemment pour une formule utilisant une fonction non volatile, donc ne se recalculant et qu'il fallait revalider matriciellement sur une plage pour modifier le résultat, il était alors pleinement ergonomique de presser un bouton pour le faire faire... Mais pour une formule normale, qui une fois dans sa cellule n'a plus qu'à renvoyer son résultat sans qu'on ait à y retoucher, sachant qu'insérer manuellement une formule est toujours plus rapide manuellement, vouloir l'insérer en VBA me paraît toujours irrationnel.
Cordialement.
Bonjour
le but est : par exemple pour le collaborateur 1 la formule dans les cellules de la plage (FU14:TU14) pour chaque jour de l'annee
elle renvoie un motif d'absence CP,CN,CD,MA,MOD,FOR,CSS en fonction des dates renseigner dans la plage des périodes d'absence
(FP39 :GP44)
et le meme chose pour les 9 autre collaborateurs
Qu'est-ce que tu entends par "adapter" ?
Une formule Excel reste une formule Excel !
Si on l'insère en VBA, on l'écrit selon le choix de la méthode d'insertion (Formula ou FormulaR1C1 ou FormulaLocal, etc.).
Le fond de ma pensée est simple !
Comme je l'ai dit quand je vois une formule qui dépasse 3 lignes ça m'effraie !! Donc, pour mon compte, je ne commencerais pas à l'écrire si je prévois un tel allongement. Si je dois me pencher sur la question, je pars des données et de ce qu'on veut obtenir pour chercher un moyen d'écrire une formule beaucoup plus courte. Si vraiment cela n'apparaît pas possible, même en la scindant, en général je finis par opter pour traiter la question en VBA.
Mais à ce moment là, j'ai la faiblesse de penser que VBA présente alors l'avantage de me permettre de me passer de formule, je m'en passe !
Les calculs sont fait intégralement en VBA (sans utiliser de formule, ni dans le cas général de fonctions Excel) et ce sont les résultats qui sont affectés. Il peut m'arriver d'insérer des formules en VBA, quand cela est particulièrement justifié, je l'ai d'ailleurs fait récemment pour une formule utilisant une fonction non volatile, donc ne se recalculant et qu'il fallait revalider matriciellement sur une plage pour modifier le résultat, il était alors pleinement ergonomique de presser un bouton pour le faire faire... Mais pour une formule normale, qui une fois dans sa cellule n'a plus qu'à renvoyer son résultat sans qu'on ait à y retoucher, sachant qu'insérer manuellement une formule est toujours plus rapide manuellement, vouloir l'insérer en VBA me paraît toujours irrationnel.
Cordialement.
Bonjour et bonne année
je reviens vers vous pour sollicite votre expertise
j'ai cette macro qui fais exactement ce je souhaite mais elle ne fonction que pour le premier collaborateur 1
serait il possible de la corriger et de la faire fonctionner avec l’événement
Private Sub Worksheet_Change(ByVal Target As Range)
merci d'avance
Sub formulesCumul()
Set ListeCollaborateurs = Range("FO14:FO23")
For Each Collaborateur In ListeCollaborateurs
lig = Collaborateur.Row
Set DebZone = Range("FO38:FO126").Find(Collaborateur, lookat:=xlWhole)
If Not DebZone Is Nothing Then
zoneCode = DebZone.Offset(1, 0).Resize(7, 1).Address
DebPeriode1 = Range("FP" & DebZone.Row + 1).Resize(7).Address
FinPeriode1 = Range("FR" & DebZone.Row + 1).Resize(7).Address
DebPeriode2 = Range("FS" & DebZone.Row + 1).Resize(7).Address
FinPeriode2 = Range("FU" & DebZone.Row + 1).Resize(7).Address
DebPeriode3 = Range("FX" & DebZone.Row + 1).Resize(7).Address
FinPeriode3 = Range("GB" & DebZone.Row + 1).Resize(7).Address
DebPeriode4 = Range("GE" & DebZone.Row + 1).Resize(7).Address
FinPeriode4 = Range("GI" & DebZone.Row + 1).Resize(7).Address
DebPeriode5 = Range("GL" & DebZone.Row + 1).Resize(7).Address
Finperiode5 = Range("GP" & DebZone.Row + 1).Resize(7).Address
formule = "=IfError(INDEX(" & zoneCode & ",(sumproduct((FU3>=" & DebPeriode1 & ")*(FU3<=" & FinPeriode1 & ")*row(" & zoneCode & "))+sumproduct((FU3>=" & DebPeriode2 & ")*(FU3<=" & FinPeriode2 & ")*row(" & zoneCode & "))+sumproduct((FU3>=" & DebPeriode3 & ")*(FU3<=" & FinPeriode3 & ")*row(" & zoneCode & "))+sumproduct((FU3>=" & DebPeriode4 & ")*(FU3<=" & FinPeriode4 & ")*row(" & zoneCode & "))+sumproduct((FU3>=" & DebPeriode5 & ")*(FU3<=" & Finperiode5 & ")*row(" & zoneCode & ")))-38),"""")"
Range("FU" & lig).Formula = formule
Range("FU" & lig).Resize(1, 365).FillRight
End If
Next Collaborateur
Range("FU14:TU24").Value = Range("FU14:TU24").Value
End Sub