Explication Formule Excel : Calcule paie
📌 Explication de la formule d’ancienneté :
Cette formule permet de
déterminer le taux d’indemnité ou prime
en fonction du
nombre d’années d’ancienneté
saisi dans la cellule E4.
🔍 Détail étape par étape :
-
E4: contient le nombre d’années d’ancienneté du salarié. -
'Base de calcule'!$AJ$3:$AJ$8: plage contenant les années MINIMUM par palier. -
'Base de calcule'!$AK$3:$AK$8: plage contenant les années MAXIMUM par palier. -
'Base de calcule'!$AL$3:$AL$8: plage contenant le taux correspondant à chaque intervalle d’ancienneté.
🧠 Que fait la formule ?
-
Elle vérifie si l’ancienneté (
E4) est supérieure à 0. -
Ensuite, elle cherche le bon intervalle dans lequel se trouve
E4:
| Formule |
|---|
| =SIERREUR(SI(E4>0;INDEX('Base de calcule'!$AL$3:$AL$8;EQUIV(1;(E4>='Base de calcule'!$AJ$3:$AJ$8)*(E4<'Base de calcule'!$AK$3:$AK$8);0));"");"") |
Cette formule compare l’ancienneté à chaque plage (min ≤ E4 ≤ max), puis
retourne la position du bon palier.
Ensuite, elle utilise INDEX(...; ...) pour récupérer le taux correspondant
dans la colonne $AL$3:$AL$8.
Finalement, SIERREUR(...) est là pour éviter une erreur si l’ancienneté ne
correspond à aucun palier (dans ce cas, elle renvoie vide " ").
📌 Pourquoi la cellule E4 change et les autres restent figées ?
E4 est une cellule relative.
👉 Quand on tire la formule vers le bas, Excel la change automatiquement en
E5, E6, etc. pour s’adapter à chaque ligne du tableau.
'Base de calcule'!$AJ$3:$AJ$8, $AK$3:$AK$8 et $AL$3:$AL$8 sont des cellules
absolues, grâce au signe $.
👉 Cela signifie qu’elles ne changent jamais, même si on copie ou tire la
formule vers une autre cellule. C’est important car ces plages contiennent les
données de référence (les intervalles et les taux), qui restent toujours les
mêmes pour tous les salariés.
📌 Explication de la formule des indemnités non imposable IR & CNSS :
dans cette formule aussi je vais utiliser $ pour figer les plage mais après on va utiliser les Plages nommées c'est plus pratique
| Formule |
|---|
|
=SI(F4="";0; SI(ET(F4<>""; INDEX('Base de calcule'!$AE$2:$AE$11; EQUIV(F4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AG$2:$AG$11; EQUIV(F4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"; INDEX('Base de calcule'!$AB$2:$AB$11; EQUIV(F4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AD$2:$AD$11; EQUIV(F4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"); G4 ;0)) + SI(H4="";0; SI(ET(H4<>""; INDEX('Base de calcule'!$AE$2:$AE$11; EQUIV(H4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AG$2:$AG$11; EQUIV(H4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"; INDEX('Base de calcule'!$AB$2:$AB$11; EQUIV(H4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AD$2:$AD$11; EQUIV(H4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"); I4;0)) + SI(J4="";0; SI(ET(J4<>""; INDEX('Base de calcule'!$AE$2:$AE$11; EQUIV(J4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AG$2:$AG$11; EQUIV(J4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"; INDEX('Base de calcule'!$AB$2:$AB$11; EQUIV(J4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AD$2:$AD$11; EQUIV(J4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"); K4;0)) + SI(L4="";0; SI(ET(L4<>""; INDEX('Base de calcule'!$AE$2:$AE$11; EQUIV(L4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AG$2:$AG$11; EQUIV(L4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"; INDEX('Base de calcule'!$AB$2:$AB$11; EQUIV(L4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AD$2:$AD$11; EQUIV(L4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"); M4;0)) + SI(N4="";0; SI(ET(N4<>""; INDEX('Base de calcule'!$AE$2:$AE$11; EQUIV(N4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AG$2:$AG$11; EQUIV(N4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"; INDEX('Base de calcule'!$AB$2:$AB$11; EQUIV(N4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AD$2:$AD$11; EQUIV(N4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"); O4;0)) + SI(P4="";0; SI(ET(P4<>""; INDEX('Base de calcule'!$AE$2:$AE$11; EQUIV(P4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AG$2:$AG$11; EQUIV(P4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"; INDEX('Base de calcule'!$AB$2:$AB$11; EQUIV(P4; 'Base de calcule'!$AA$2:$AA$11; 0))="FAUX"; INDEX('Base de calcule'!$AD$2:$AD$11; EQUIV(P4; 'Base de calcule'!$AA$2:$AA$11; 0))="NULL"); Q4;0)) |
- Si la cellule F4 est vide → on met 0
- Sinon, on vérifie plusieurs conditions dans la feuille 'Base de calcule', en fonction du code de l’indemnité (F4).
- Si toutes les conditions sont vraies, on prend la valeur de G4 (le montant de l’indemnité).
- Sinon, on prend 0.
- qu’elle ne soit pas imposable
- pas soumise à abattement
- pas soumise à CNSS
- et pas soumise à une autre cotisation (ou champ vide)
📌 Explication des la formule Plages nommées
Plages nommées utilisées dans le fichier
Les plages nommées ci-dessous ont été créées à partir de la feuille
"Base de calcul", pour
faciliter les recherches par fonction
EQUIV et
INDEX dans les formules de
calcul des indemnités :
|
Nom de la plage |
Plage Excel | Contenu / Rôle |
|---|---|---|
nom_PRIME_Indemnité
|
'Base de calcule'!$AA$2:$AA$20
|
Liste des noms des primes/indemnités |
imposable_CNSS
|
'Base de calcule'!$AB$2:$AB$20
|
Indique si la prime est
soumise à la CNSS
(VRAI /
FAUX)
|
imposable_Taux
|
'Base de calcule'!$AC$2:$AC$20
|
Taux applicable CNSS si soumis |
imposable_CNSS_plafond
|
'Base de calcule'!$AD$2:$AD$20
|
Plafond de soumission CNSS le cas échéant |
imposable_IR
|
'Base de calcule'!$AE$2:$AE$20
|
Indique si la prime est
soumise à l’IR
(VRAI /
FAUX)
|
imposable_IR_Taux
|
'Base de calcule'!$AF$2:$AF$20
|
Taux applicable IR si imposable |
imposable_IR_plafond
|
'Base de calcule'!$AG$2:$AG$20
|
Plafond d’exonération IR si existant (ex : 20% du salaire brut) |
appliquer_abatement_IR
|
'Base de calcule'!$AH$2:$AH$20
|
Indique si un abattement pour frais professionnels doit être appliqué |
🔧 Comment ces plages ont été créées ?
-
Aller dans Formules > Gestionnaire de noms.
-
Cliquer sur Nouveau.
-
Donner un nom clair (ex :
imposable_IR). -
Dans Fait référence à :, sélectionner la plage voulue (ex :
'Base de calcule'!$AE$2:$AE$20). -
Répéter l’opération pour chaque plage.
✅ Avantage
L’utilisation des plages nommées permet d’avoir :
-
des formules plus lisibles et compréhensibles
-
une meilleure organisation des données
-
une facilité de mise à jour des paramètres en un seul endroit
📌 Explication de la formule des Indemnité imposable soumis à l'abattement de FRAIS PROFESSIONEL :
| Formule |
|---|
|
=SI(F4="";0;
SI(ET(F4<>"";
INDEX(imposable_IR; EQUIV(F4;
nom_PRIME_Indemnité;
0))="FAUX"; INDEX(imposable_IR_plafond; EQUIV(F4;
nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(F4<>"";
INDEX(imposable_IR; EQUIV(F4;
nom_PRIME_Indemnité;
0))="VRAI"; INDEX(appliquer_abatement_IR; EQUIV(F4;
nom_PRIME_Indemnité;
0))="VRAI";
INDEX(imposable_IR_plafond; EQUIV(F4;
nom_PRIME_Indemnité;
0))="NULL"); G4;
SI(ET(F4<>""; INDEX(imposable_IR; EQUIV(F4;
nom_PRIME_Indemnité;
0))="VRAI"; INDEX(appliquer_abatement_IR; EQUIV(F4;
nom_PRIME_Indemnité;
0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(F4;
nom_PRIME_Indemnité;
0))="NULL"); 0;
SI(ET(F4<>""; INDEX(imposable_IR; EQUIV(F4;
nom_PRIME_Indemnité;
0))="FAUX"; INDEX(imposable_IR_plafond; EQUIV(F4;
nom_PRIME_Indemnité;
0))>0;
INDEX(appliquer_abatement_IR; EQUIV(F4;
nom_PRIME_Indemnité;
0))="VRAI";G4>$D4*INDEX(imposable_IR_plafond; EQUIV(F4; nom_PRIME_Indemnité;
0)));
G4-$D4*INDEX(imposable_IR_plafond; EQUIV(F4; nom_PRIME_Indemnité;
0));
0))))) +
SI(H4="";0;
SI(ET(H4<>""; INDEX(imposable_IR; EQUIV(H4;
nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_IR_plafond;
EQUIV(H4; nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(H4<>""; INDEX(imposable_IR; EQUIV(H4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(H4; nom_PRIME_Indemnité; 0))="VRAI";
INDEX(imposable_IR_plafond; EQUIV(H4;
nom_PRIME_Indemnité; 0))="NULL"); I4;
SI(ET(H4<>""; INDEX(imposable_IR;
EQUIV(H4; nom_PRIME_Indemnité; 0))="VRAI";
INDEX(appliquer_abatement_IR; EQUIV(H4; nom_PRIME_Indemnité;
0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(H4;
nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(H4<>""; INDEX(imposable_IR;
EQUIV(H4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(H4; nom_PRIME_Indemnité; 0))>0;
INDEX(appliquer_abatement_IR; EQUIV(H4; nom_PRIME_Indemnité;
0))="VRAI";I4>$D4*INDEX(imposable_IR_plafond; EQUIV(H4;
nom_PRIME_Indemnité; 0)));
I4-$D4*INDEX(imposable_IR_plafond;
EQUIV(H4; nom_PRIME_Indemnité; 0));
0)))))
+
SI(J4="";0;
SI(ET(J4<>""; INDEX(imposable_IR; EQUIV(J4;
nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_IR_plafond;
EQUIV(J4; nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(J4<>""; INDEX(imposable_IR; EQUIV(J4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(J4; nom_PRIME_Indemnité; 0))="VRAI";
INDEX(imposable_IR_plafond; EQUIV(J4; nom_PRIME_Indemnité;
0))="NULL"); K4;
SI(ET(J4<>""; INDEX(imposable_IR; EQUIV(J4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(J4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(J4;
nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(J4<>""; INDEX(imposable_IR;
EQUIV(J4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(J4; nom_PRIME_Indemnité; 0))>0;
INDEX(appliquer_abatement_IR; EQUIV(J4; nom_PRIME_Indemnité;
0))="VRAI"; K4>$D4*INDEX(imposable_IR_plafond; EQUIV(J4;
nom_PRIME_Indemnité; 0)));
K4-$D4*INDEX(imposable_IR_plafond;
EQUIV(J4; nom_PRIME_Indemnité; 0));
0)))) +
SI(L4="";0;
SI(ET(L4<>""; INDEX(imposable_IR; EQUIV(L4;
nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_IR_plafond;
EQUIV(L4; nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(L4<>""; INDEX(imposable_IR; EQUIV(L4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(L4; nom_PRIME_Indemnité; 0))="VRAI";
INDEX(imposable_IR_plafond; EQUIV(L4;
nom_PRIME_Indemnité; 0))="NULL"); M4;
SI(ET(L4<>""; INDEX(imposable_IR;
EQUIV(L4; nom_PRIME_Indemnité; 0))="VRAI";
INDEX(appliquer_abatement_IR; EQUIV(L4; nom_PRIME_Indemnité;
0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(L4;
nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(L4<>""; INDEX(imposable_IR;
EQUIV(L4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(L4; nom_PRIME_Indemnité; 0))>0;
INDEX(appliquer_abatement_IR; EQUIV(L4; nom_PRIME_Indemnité;
0))="VRAI"; M4>$D4*INDEX(imposable_IR_plafond; EQUIV(L4;
nom_PRIME_Indemnité; 0)));
M4-$D4*INDEX(imposable_IR_plafond;
EQUIV(L4; nom_PRIME_Indemnité; 0));
0))))) +
SI(N4="";0;
SI(ET(N4<>""; INDEX(imposable_IR; EQUIV(N4;
nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_IR_plafond;
EQUIV(N4; nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(N4<>""; INDEX(imposable_IR; EQUIV(N4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(N4; nom_PRIME_Indemnité; 0))="VRAI";
INDEX(imposable_IR_plafond; EQUIV(N4;
nom_PRIME_Indemnité; 0))="NULL"); O4;
SI(ET(N4<>""; INDEX(imposable_IR; EQUIV(N4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(N4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(N4;
nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(N4<>""; INDEX(imposable_IR;
EQUIV(N4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(N4; nom_PRIME_Indemnité; 0))>0;
INDEX(appliquer_abatement_IR; EQUIV(N4; nom_PRIME_Indemnité;
0))="VRAI"; O4>$D4*INDEX(imposable_IR_plafond; EQUIV(N4;
nom_PRIME_Indemnité; 0)));
O4-$D4*INDEX(imposable_IR_plafond;
EQUIV(N4; nom_PRIME_Indemnité; 0));
0))))) +
SI(P4="";0;
SI(ET(P4<>""; INDEX(imposable_IR; EQUIV(P4;
nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_IR_plafond;
EQUIV(P4; nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(P4<>""; INDEX(imposable_IR; EQUIV(P4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(P4; nom_PRIME_Indemnité; 0))="VRAI";
INDEX(imposable_IR_plafond; EQUIV(P4; nom_PRIME_Indemnité;
0))="NULL"); Q4;
SI(ET(P4<>""; INDEX(imposable_IR; EQUIV(P4;
nom_PRIME_Indemnité; 0))="VRAI"; INDEX(appliquer_abatement_IR;
EQUIV(P4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(P4;
nom_PRIME_Indemnité; 0))="NULL"); 0;
SI(ET(P4<>""; INDEX(imposable_IR;
EQUIV(P4; nom_PRIME_Indemnité; 0))="FAUX";
INDEX(imposable_IR_plafond; EQUIV(P4; nom_PRIME_Indemnité; 0))>0;
INDEX(appliquer_abatement_IR; EQUIV(P4; nom_PRIME_Indemnité;
0))="VRAI"; Q4>$D4*INDEX(imposable_IR_plafond; EQUIV(P4;
nom_PRIME_Indemnité; 0)));
Q4-$D4*INDEX(imposable_IR_plafond;
EQUIV(P4; nom_PRIME_Indemnité; 0));
0))))))
|
🧠 Explication ligne par ligne
Imaginons une colonne nommée Recherche contenant des matricules (ou identifiants) dans un tableau Excel structuré.
La formule :
🔍 Étape 1 : Détecter les doublons
-
Si le matricule apparaît une seule fois dans la colonne
Recherche, ce n'est pas un doublon, donc on retourne""(vide).
🔍 Étape 2 : Identifier la première occurrence d’un doublon
-
EQUIV(...;...;0): renvoie la position de la première occurrence de ce matricule. -
INDEX(...;position): renvoie la cellule contenant cette première occurrence. -
On compare sa
LIGNE()avec celle de la ligne courante.
💡 Si elles sont égales, cela signifie qu'on est sur la première apparition d’un doublon ⇒ on affiche :
🔍 Étape 3 : Pour les doublants suivants
-
NB.SI.ENS(...): compte combien de fois ce matricule est apparu jusqu’à cette ligne. -
Cela permet d’indiquer si c’est le 2e, 3e, 4e doublant, etc.
-
On affiche aussi le matricule pour clarté.
📝 Exemple :
| Recherche | Doublon Info |
|---|---|
| 101 | 1ère entrée - a des doublants |
| 102 | |
| 101 | Doublant 2 - Matricule 101 |
| 101 | Doublant 3 - Matricule 101 |
Doublons sous contrôle : première entrée ou répétition ?
| NB.SI($CH$12:$CH$600;CH12)=1 |
|---|
=SI(NB.SI($CH$12:$CH$600;CH12)=1; SUBSTITUE(I12;" ";"")&" "&J12&". mois : "&TEXTE(F12;"mmmm"); SI(LIGNE()-LIGNE(INDEX($CH$12:$CH$600;EQUIV(CH12;$CH$12:$CH$600;0)))=0; SUBSTITUE(I12;" ";"")&" "&J12&". mois : "&TEXTE(F12;"mmmm")&" - Premier a des double"; SUBSTITUE(I12;" ";"")&" "&J12&". mois : "&TEXTE(F12;"mmmm") & " - Double " & NB.SI.ENS($CH$12:CH12;CH12) & " " )) |
🎯 Objectif de la formule :
Détecter les doublons dans une colonne contenant un identifiant combiné (ex. : Période & Matricule), puis générer un texte personnalisé selon :
-
s’il s’agit d’une entrée unique,
-
de la première apparition parmi les doublons,
-
ou d’un doublon ultérieur.
🧩 Décomposition ligne par ligne :
1. Vérifier si l’entrée est unique
🔎 Vérifie s’il n’y a qu’une seule fois cette valeur dans la colonne
CH. Si oui → résultat pour une entrée unique.
2. Si c’est unique : afficher juste l'identité et le mois
✅ Nettoie les espaces dans le matricule (colonne I), concatène avec le nom (J), et le mois (F).
3. Sinon, vérifier si c’est la première apparition
💡 Compare la ligne actuelle avec la ligne de la première apparition (grâce à
EQUIVetINDEX).
Si la différence est 0 → c’est bien la première apparition.
4. Résultat pour la première apparition :
🥇 Ajoute le texte "Premier a des double" à l'identité et au mois.
5. Résultat pour les doublons suivants :
➕ Compte combien de fois cette valeur est déjà apparue jusqu’à la ligne courante (rang du doublon).
Exemple : "Double 2", "Double 3", etc.
✅ Résumé :
-
Entrée unique ➝ juste le nom et mois.
-
Première apparition parmi les doublons ➝ + "Premier a des double".
-
Autres doublons ➝ + "Double n".
--------------



Commentaires
Enregistrer un commentaire