Microsoft 365 Ecrire une formule de calcul en Vba Excel

  • Initiateur de la discussion Initiateur de la discussion NONO14
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

NONO14

XLDnaute Impliqué
Bonjour à toutes et à tous,

Comment pourrait-on écrire cette formule de calcul en Vba, s'il vous plaît ? Pour le moment elle est écrite en dur dans des cellules Excel de mon tableau.
Cependant, il m'est demandé de l'écrire dans du code afin que personne ne puisse y accéder. Cette formule se trouve dans la colonne J du tableau de la feuille "Recap", il y en d'autres du même genre dans les colonnes K et L et un peu plus simples dans les colonnes M, N, O.
Bien sûr je pourrais protéger ces colonnes mais ce n'est pas ce qui m'est demandé, j'ai proposé cette solution, mais elle ne garantie pas une sécurité suffisante en cas d'effacement malencontreux par la personne qui va gérer ce fichier.
MAX_MAT et autres sont des Noms donnés à des cellules de la feuille "Données", soit les cellules L3 à O5.
Mot de passe de la feuille "falaise"
Merci par avance pour vos idées.
VB:
=SI(A2="";"";SI(A2<>"";SI(ET(D2<>"";E2<>"");E2-D2;SI(ET(D2<>"";E2="";F2<>"");MAX_MAT-D2;SI(ET(D2<>"";E2="";ET(F2<>"";G2=""));"";SI(ET(D2<>"";E2="";F2="";G2="";H2="";I2<>"");MAX_MAT-D2;SI(ET(D2<>"";E2="";F2="";G2<>"");MAX_MAT-D2;SI(ET(D2<>"";E2="";ET(F2="";G2="");ET(H2="";I2<>""));I2-D2;SI(ET(D2<>"";E2="";F2="";G2="");MAX_MAT-D2;SI(D2="";""))))))))))
 

Pièces jointes

Dernière édition:
Solution
Bonjour le Fil
juste pour signaler qu'a ce Niveau il y a un problème !
VB:
Private Sub TextCode_Change()
Dim Ctrl As Control
Dim Ctrl2 As Control
Dim Trouvé As Boolean
 Dim Trouve As Range

    Me.TextCode.Text = UCase(Me.TextCode) 'On met en Majuscule tout le Contenu du TextBox
    If Not EnableEvents Then Exit Sub
    Sheets("Liste_agents").Unprotect "falaise"
    'on cherche le nom associé au code dans la TS "t_Noms"
    With Sheets("Liste_agents").ListObjects("t_Noms")
    'ci-dessous on recherche dans une colonne ou se trouvent des Minuscules
    Set Trouve = .ListColumns(1).Range.Find(Me.TextCode, lookat:=xlWhol
Tu peux si la case n'a pas d'importance mettre Option Compare Text en tête de Module.
et supprimer ...
regarde: j'ai déja pu simplifier ta formule
VB:
=SI(OU(A2="";D2="");"";
SI(E2<>"";E2-D2;
SI(F2<>"";MAX_MAT-D2;
SI(ET(F2<>"";G2="");"";
SI(ET(G2="";H2="";I2<>"");MAX_MAT-D2;
SI(G2<>"";MAX_MAT-D2;
SI(ET(G2="";H2="";I2<>"");I2-D2;
SI(G2="";MAX_MAT-D2;
))))))))

je pense que pour la simplifier encore, il faudrait juste expliquer la logique du calcul..
 
Enrichi (BBcode):
=SI(OU(A2="";D2="");"";
SI(E2<>"";E2-D2;
SI(F2<>"";MAX_MAT-D2;
SI(ET(F2<>"";G2="");"";
SI(ET(G2="";H2="";I2<>"");MAX_MAT-D2;
SI(G2<>"";MAX_MAT-D2;
SI(ET(G2="";H2="";I2<>"");I2-D2;
SI(G2="";MAX_MAT-D2;
))))))))
Je pense qu'il y a un truc qui ne va pas.
 
regarde: j'ai déja pu simplifier ta formule
VB:
=SI(OU(A2="";D2="");"";
SI(E2<>"";E2-D2;
SI(F2<>"";MAX_MAT-D2;
SI(ET(F2<>"";G2="");"";
SI(ET(G2="";H2="";I2<>"");MAX_MAT-D2;
SI(G2<>"";MAX_MAT-D2;
SI(ET(G2="";H2="";I2<>"");I2-D2;
SI(G2="";MAX_MAT-D2;
))))))))

je pense que pour la simplifier encore, il faudrait juste expliquer la logique du calcul..
Je vais écrire en clair ma logique et je reviens vers vous. Je l'avoue ce n'est pas simple, même moi je m'y perds parfois.
 
En attendant, je me suis permis quelques modifs/optimisations de ton code

pour l'instant j'ai commenté tout ce qui protège ou déprotège les feuilles

1) un module dans lequel tu définis ton mot de passe une seule fois (ca évite de l'écrire un peu partout dans le code)
2) un module avec deux macros pour protéger ou déprotéger la feuille saisie

3) pour la saisie d'heures, ton code "_change" passe son temps à déprotéger, reprotéger, modifier..
plutot que devoir cliquer sur le bouton en haut à gauche, un double clic suffit
voir code dans évènement _beforedoubleclic
 

Pièces jointes

Voici ma logique (loin d'être parfaite)

Pour la colonne J



Si le cellule en A est vide alors on écrit rien.

Si la cellule D n’est pas vide et que la cellule E n’est pas vide alors E moins D

Si la cellule D n’est pas vide et que la cellule E est vide et que la cellule F n’est pas vide alors TOT_MAT (Cellule G5 de la feuille Données) moins D.

Si la cellule D n’est pas vide et que les cellules E et F sont vides mais que la cellule G n’est pas vide alors TOT_MAT (Cellule G5 de la feuille Données) moins D.

Si la cellule D n’est pas vide mais que les cellules E à H sont vides et que la cellule I n’est pas vide alors TOT_MAT (Cellule G5 de la feuille Données) moins D



Pour la colonne K



Si la cellule en A est vide alors on écrit rien.

Si les cellules E et F ne sont pas vides alors F moins E

Si la cellule D n’est pas vide et que la cellule E est vide et que la cellule F n’est pas vide et la cellule G est pas vide mais que la cellule H n’est pas vide alors TOT_AM (cellule H5 de la feuille Données) moins F.

Si la cellule D n’est pas vide et que les cellules E à H sont vides et que la cellule n’est pas vide alors TOT_AM (cellule H5 de la feuille Données) moins F.



Pour la colonne L



Si la cellule en A est vide alors on écrit rien.

Si les cellules H et I ne sont pas vides alors I moins H

Si la cellule D n’est pas vide et que la cellule E est vide et que la cellule F n’est pas vide et que la cellule G est vide et que la cellule H n’est pas vide et que cellule I est vide alors TOT_Soir (cellule I5 de la feuille Données) moins H.

Si la cellule D n’est pas vide et que les cellules E à H sont vides alors TOT_Soir moins I.
 
En attendant, je me suis permis quelques modifs/optimisations de ton code

pour l'instant j'ai commenté tout ce qui protège ou déprotège les feuilles

1) un module dans lequel tu définis ton mot de passe une seule fois (ca évite de l'écrire un peu partout dans le code)
2) un module avec deux macros pour protéger ou déprotéger la feuille saisie

3) pour la saisie d'heures, ton code "_change" passe son temps à déprotéger, reprotéger, modifier..
plutot que devoir cliquer sur le bouton en haut à gauche, un double clic suffit
voir code dans évènement _beforedoubleclic
Merci beaucoup, je dois m'absenter pour raison médicale.
Je regarde ça et je reviens vers vous dès que possible.
 
de ce que je comprends..
pour chaque section "matin, Après midi et soir", il y a 2 horaires à pointer: arrivée et départ
si l'heure d'arrivée et l'heure de départ sont inscrites, on calcule la différence
si seule l'arrivée est pointée (le départ à été oublié), on calcule la différence entre l'arrivée et le départmax autorisé
ok.. donc..si le gars s'en va au bout de 5mn sans pointer.. la formule va dire qu'il est resté au bout de son shift..

dans les explications que tu donnes.. les 3 dernières conditions donnent toujours le meme résultat.. max-arrivée
PS : tu as mis Tot_Mat.. au lieu de Max_Mat.. je pense..

du coup.. les formules deviennent toutes simples==> voir PJ
 

Pièces jointes

de ce que je comprends..
pour chaque section "matin, Après midi et soir", il y a 2 horaires à pointer: arrivée et départ
si l'heure d'arrivée et l'heure de départ sont inscrites, on calcule la différence
si seule l'arrivée est pointée (le départ à été oublié), on calcule la différence entre l'arrivée et le départmax autorisé
ok.. donc..si le gars s'en va au bout de 5mn sans pointer.. la formule va dire qu'il est resté au bout de son shift..

dans les explications que tu donnes.. les 3 dernières conditions donnent toujours le meme résultat.. max-arrivée
PS : tu as mis Tot_Mat.. au lieu de Max_Mat.. je pense..

du coup.. les formules deviennent toutes simples==> voir PJ
ok.. donc..si le gars s'en va au bout de 5mn sans pointer.. la formule va dire qu'il est resté au bout de son shift..
Oui je n'avais pas pensé à cela. Alors il ne faut rien mettre dans le doute.
Désolé mais je dois partir. A plus tard
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
491
Réponses
3
Affichages
271
Réponses
4
Affichages
445
Réponses
4
Affichages
697
Réponses
9
Affichages
646
Retour