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

15demo.xlsm (270.66 Ko)

Bonsoir,

J'ai peut-être mal vu mais je n'ai aperçu aucune matrice ! dans cette longue formule (bien trop longue pour que je puisse imaginer l'écrire, mais c'est une autre question).

En tout cas pour moi elle n'a rien de matriciel.

Cordialement.

Bonsoir,

J'ai peut-être mal vu mais je n'ai aperçu aucune matrice ! dans cette longue formule (bien trop longue pour que je puisse imaginer l'écrire, mais c'est une autre question).

En tout cas pour moi elle n'a rien de matriciel.

Cordialement.

Re

est il possible de l' adapter svp ?

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

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
Rechercher des sujets similaires à "comment adapter formule matriciel macro"