Explication Formule Excel : Calcule paie

 


Cliquez sur le lien pour  allez à : Calcule paie Maroc télécharger le fichier Excel


📌 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 :

  1. E4 : contient le nombre d’années d’ancienneté du salarié.

  2. 'Base de calcule'!$AJ$3:$AJ$8 : plage contenant les années MINIMUM par palier.

  3. 'Base de calcule'!$AK$3:$AK$8 : plage contenant les années MAXIMUM par palier.

  4. '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))
📌 But de cette formule : 
je veux additionner plusieurs indemnités (dans G4, I4, K4, M4, O4, Q4) seulement si elles répondent à certaines conditions, notamment si elles ne sont pas imposables (non imposables, non soumises à cotisation, etc.). 
📋 Structure générale : 

Pour chaque ligne (par exemple F4 et G4) : SI(F4="";0; SI(ET(...conditions...); G4; 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. 
 je fais ça pour : 
 F4 et G4 
 H4 et I4 
 J4 et K4 
 L4 et M4 
 N4 et O4 
 P4 et Q4 
 Puis j'additionnes tous les montants qui respectent les critères. 
🧠 Les conditions vérifiées dans 'Base de calcule' : 
Pour chaque indemnité, on cherche sa ligne dans la table 'Base de calcule'!$AA$2:$AA$11, et on vérifie : 
Colonne dans 'Base de calcule'             Ce que ça vérifie 
$AE$2:$AE$11                                     Si imposable IR = FAUX 
$AG$2:$AG$11                                    Si soumis à un plafond IR = NULL 
$AB$2:$AB$11                                    Si soumis à CNSS = FAUX 
$AD$2:$AD$11                                   Si soumis à un plafond CNSS = NULL 
Donc, pour qu’une indemnité soit considérée non imposable, il faut : 
  •  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 ?

  1. Aller dans Formules > Gestionnaire de noms.

  2. Cliquer sur Nouveau.

  3. Donner un nom clair (ex : imposable_IR).

  4. Dans Fait référence à :, sélectionner la plage voulue (ex : 'Base de calcule'!$AE$2:$AE$20).

  5. 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))))))

    📌 But de cette formule :
     
    Voici une explication détaillée de cette formule complexe : elle sert à déterminer la part imposable d'une indemnité, en tenant compte de plusieurs paramètres définis dans une feuille de paramétrage, notamment :
    • Si l’indemnité est imposable ou non (imposable_IR)

    • Si elle est soumise à l’abattement (appliquer_abatement_IR)

    • S’il existe un plafond d’exonération (imposable_IR_plafond)


    🔍 Principe général :

    Pour chaque cellule F4, H4, J4, L4, N4, P4 (les noms des indemnités) et leur montant correspondant G4, I4, K4, M4, O4, Q4, la formule :

    1. Ignore la ligne si la cellule est vide

    2. Teste plusieurs conditions pour décider si la prime est imposable et si un abattement s’applique

    3. Applique le traitement correspondant :

      • Si non imposable et pas de plafond → montant non imposable → 0

      • Si imposable et abattement autorisé et pas de plafond → montant intégralement imposable

      • Si imposable mais abattement non autorisé et pas de plafond → montant non imposable → 0

      • Si non imposable mais avec plafond et montant > plafond → seule la part dépassant le plafond est imposable

      • Sinon → 0


    🧠 Exemple pour F4/G4 :

    excel

    SI(F4="";0; SI(ET(...); 0; SI(ET(...); G4; SI(ET(...); 0; SI(ET(...); G4 - plafond; 0 ) ) ) ) )
    • F4 = nom de l'indemnité

    • G4 = montant

    • $D4 = Salaire brut (ou base pour appliquer le % de plafond)

    Le INDEX(...;EQUIV(F4;...)) va chercher, dans la base de données (nom_PRIME_Indemnité), les valeurs correspondantes à cette indemnité.


    Voici une explication claire et pratique de la combinaison INDEX et EQUIV utilisée dans la formule Excel :

    🧩 1. Fonction EQUIV : rechercher la position

    excel

    EQUIV(F4; nom_PRIME_Indemnité; 0)
    • F4 contient le nom de la prime ou indemnité (ex : "Indemnité de transport")

    • nom_PRIME_Indemnité est une plage verticale qui contient tous les noms des primes (dans une table de paramètres)

    • 0 signifie recherche exacte

    👉 Résultat : position de F4 dans la colonne des noms de primes.

    Exemple : Si F4 = "Indemnité de transport" et qu’elle est en 3e ligne de la liste → EQUIV(...) retourne 3


    📦 2. Fonction INDEX : récupérer la valeur

    excel

    INDEX(imposable_IR; EQUIV(F4; nom_PRIME_Indemnité; 0))
    • imposable_IR est une colonne parallèle contenant "VRAI" ou "FAUX" pour dire si la prime est imposable

    • INDEX(...) va chercher la valeur sur la même ligne que celle trouvée avec EQUIV

    👉 Résultat : "VRAI" ou "FAUX" selon la prime


    🔄 Résumé simple de cette combinaison


    Élément Signification
    EQUIV(F4; liste; 0)                         Trouve la ligne dans la liste
    INDEX(colonne; ligne)                     Va chercher la valeur dans une autre colonne (même ligne)

    Donc quand tu écris :

    excel

    INDEX(imposable_IR; EQUIV(F4; nom_PRIME_Indemnité; 0))

    Tu dis à Excel :

    "Va me chercher dans la colonne imposable_IR, la valeur qui correspond à la prime écrite dans F4."


    📌 Explication de la formule des indemnités qui ne sont ni imposables à l’IR, ni soumises à la CNSS. :

    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"; INDEX(imposable_CNSS; EQUIV(F4; nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_CNSS_plafond; EQUIV(F4; nom_PRIME_Indemnité; 0))="NULL"); G4
    ;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"; INDEX(imposable_CNSS; EQUIV(H4; nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_CNSS_plafond; EQUIV(H4; nom_PRIME_Indemnité; 0))="NULL"); I4;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"; INDEX(imposable_CNSS; EQUIV(J4; nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_CNSS_plafond; EQUIV(J4; nom_PRIME_Indemnité; 0))="NULL"); K4;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"; INDEX(imposable_CNSS; EQUIV(L4; nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_CNSS_plafond; EQUIV(L4; nom_PRIME_Indemnité; 0))="NULL"); M4;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"; INDEX(imposable_CNSS; EQUIV(N4; nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_CNSS_plafond; EQUIV(N4; nom_PRIME_Indemnité; 0))="NULL"); O4;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"; INDEX(imposable_CNSS; EQUIV(P4; nom_PRIME_Indemnité; 0))="FAUX"; INDEX(imposable_CNSS_plafond; EQUIV(P4; nom_PRIME_Indemnité; 0))="NULL"); Q4;0))

    📌 But de cette formule :

    la formule sert ici à calculer le total des indemnités qui ne sont ni imposables à l’IR, ni soumises à la CNSS.

    Voici une explication simple de son fonctionnement :

    🔍 Objectif de la formule :

    Additionner les montants (G4, I4, K4, … Q4) des primes ou indemnités non imposables à l’IR et non soumises à la CNSS, à condition qu’il n’y ait aucun plafond défini pour ces cas.


    🧱 Composants clés :

    Tu vérifies, pour chaque cellule (F4, H4, J4, etc.) représentant un type de prime ou indemnité, si :

    1. Elle est bien renseignée (F4<>"").

    2. L’indemnité n’est pas imposable à l’IR :
      INDEX(imposable_IR; EQUIV(F4; nom_PRIME_Indemnité; 0))="FAUX"

    3. Il n’y a pas de plafond IR :
      INDEX(imposable_IR_plafond; …)="NULL"

    4. L’indemnité n’est pas soumise à la CNSS :
      INDEX(imposable_CNSS; …)="FAUX"

    5. Il n’y a pas de plafond CNSS :
      INDEX(imposable_CNSS_plafond; …)="NULL"

    👉 Si toutes ces conditions sont réunies, alors le montant correspondant (ex. G4) est ajouté.

    Sinon, on ajoute 0.


    🧠 Exemple :

    Imaginons que :

    • En F4, tu as Indemnité Kilométrique

    • Cette indemnité n’est pas imposable à l’IR, pas soumise à la CNSS

    • Et aucun plafond n’est défini pour elle

    Alors le montant G4 (le montant versé) sera pris en compte dans le total.

    📌 Explication de la formule T° abattement 312 JOURS :

    Formule
    =SIERREUR(
      SI(ET(D4>0; C4>=26);
         INDEX(taux_Anuelle_Abatement_taxe_formaion_professionel;
               EQUIV(1;
                     (AQ4>=min_Anuelle_Abatement_taxe_formaion_professionel)
                    *(AQ4<=max_Anuelle_Abatement_taxe_formaion_professionel);
                     0));
         INDEX(taux_Anuelle_Abatement_taxe_formaion_professionel;
               EQUIV(1;
                     (AS4>=min_Anuelle_Abatement_taxe_formaion_professionel)
                    *(AS4<=max_Anuelle_Abatement_taxe_formaion_professionel);
                     0))
      );
      "")

    📌 But de cette formule :
    c’est déterminer le taux d’abattement annuel appliqué pour les frais professionnels, en te basant sur le salaire annuel brut, et en tenant compte du nombre de jours travaillés (312 jours = année complète).

    🧠 CE QU'ON VEUT FAIRE :

    Tu veux chercher dans un tableau de tranches (avec min et max) le taux d’abattement correspondant à un revenu annuel brut (AQ4 ou AS4).


    ⚙️ COMMENT ÇA MARCHE

    🔸 (AQ4>=min)*(AQ4<=max)

    C’est une astuce très puissante d’Excel !

    Cette partie retourne un tableau de 0 et 1, où :

    • 1 = Vrai → AQ4 est entre la borne min et max

    • 0 = Faux → AQ4 n’est pas dans cette tranche

    Exemple :


    AQ4 = 90 000 min = {0; 60 000; 100 000} max = {59 999; 99 999; 999 999} Résultat du test : (90000 >= min) = {1; 1; 0} (90000 <= max) = {1; 1; 1} Multiplication * : {1;1;0} * {1;1;1} = {1;1;0}

    🔸 EQUIV(1; ... ; 0)

    EQUIV cherche la 1ère position où le résultat = 1, donc la bonne tranche.

    → Dans l’exemple ci-dessus, EQUIV(1; {1;1;0}; 0) = 1 (car 1er vrai = à la ligne 1 de tes tranches)


    🔸 INDEX(...)

    Une fois la bonne ligne trouvée, INDEX va chercher le taux correspondant dans la plage taux_Anuelle_Abatement_taxe_formaion_professionel.


    🔸 SI(ET(D4>0;C4>=26); ... ; ...)

    C’est une condition :

    • Si l’employé a travaillé au moins 26 jours par mois → on prend AQ4

    • Sinon → on prend AS4 (proportionnel)


    🔸 SIERREUR(...;"")

    Protège ta formule : si une valeur n’est pas trouvée (ex. AQ4 en dehors de toutes les tranches), alors elle affiche "" (vide) au lieu d’une erreur.

    🧠  Identifier les doublons dans un tableau Excel : distinguer la 1ʳᵉ entrée des répétitions

    🧠  Explication ligne par ligne

    Imaginons une colonne nommée Recherche contenant des matricules (ou identifiants) dans un tableau Excel structuré.

    La formule :

    excel =SI(NB.SI([Recherche];[@Recherche])=1;
    ""; SI(LIGNE()-LIGNE(INDEX([Recherche];EQUIV([@Recherche];[Recherche];0)))=0; "1ère entrée - a des doublants"; "Doublant " & NB.SI.ENS(INDEX([Recherche];1):[@Recherche];[@Recherche]) & " - Matricule " & [@Recherche]))

    🔍 Étape 1 : Détecter les doublons

    excel NB.SI([Recherche];[@Recherche])=1
    • 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

    excel LIGNE() - LIGNE(INDEX([Recherche];EQUIV([@Recherche];[Recherche];0)))=0
    • 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 :

    arduino "1ère entrée - a des doublants"

    🔍 Étape 3 : Pour les doublants suivants

    excel "Doublant " & NB.SI.ENS(INDEX([Recherche];1):[@Recherche];[@Recherche]) & " - Matricule " & [@Recherche]
    • 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 :

    RechercheDoublon Info
    1011ère entrée - a des doublants
    102
    101Doublant 2 - Matricule 101
    101Doublant 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

    excel SI(NB.SI($CH$12:$CH$600;CH12)=1;

    🔎 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

    excel SUBSTITUE(I12;" ";"")&" "&J12&". mois : "&TEXTE(F12;"mmmm");

    ✅ 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

    excel SI(LIGNE()-LIGNE(INDEX($CH$12:$CH$600;EQUIV(CH12;$CH$12:$CH$600;0)))=0;

    💡 Compare la ligne actuelle avec la ligne de la première apparition (grâce à EQUIV et INDEX).
    Si la différence est 0 → c’est bien la première apparition.

    4. Résultat pour la première apparition :

    excel SUBSTITUE(I12;" ";"")&" "&J12&". mois : "&TEXTE(F12;"mmmm")&" - Premier a des double";

    🥇 Ajoute le texte "Premier a des double" à l'identité et au mois.

    5. Résultat pour les doublons suivants :

    excel SUBSTITUE(I12;" ";"")&" "&J12&". mois : "&TEXTE(F12;"mmmm") & " - Double " & NB.SI.ENS($CH$12:CH12;CH12) & " "

    ➕ 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

    Posts les plus consultés de ce blog

    🛠 Utilisation de CustomUIEditor pour Personnaliser le Ruban Excel

    🗓️ Simulateur de Congés et Calendrier Collaboratif sous Google Sheets

    Explication VBA : Facturation automatique Gestion client