Microsoft 365 Ecrire une formule de calcul en Vba Excel

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

  • Tablo_Heures.xlsm
    282.8 KB · Affichages: 17
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 ...

vgendron

XLDnaute Barbatruc
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..
 

TooFatBoy

XLDnaute Barbatruc
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.
 

NONO14

XLDnaute Impliqué
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.
 

vgendron

XLDnaute Barbatruc
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

  • Tablo_Heures.xlsm
    257.2 KB · Affichages: 2

NONO14

XLDnaute Impliqué
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.
 

NONO14

XLDnaute Impliqué
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.
 

vgendron

XLDnaute Barbatruc
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

  • Tablo_Heures.xlsm
    256.6 KB · Affichages: 4

NONO14

XLDnaute Impliqué
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
 

vgendron

XLDnaute Barbatruc
en PJ, une proposition avec des colonnes supplémentaires qui calculent les heures "réelles" déclarées

et des MFC qui colorent en rouge les heures de départ et d'arrivée qui sont "HORS" plage
 

Pièces jointes

  • Tablo_Heures.xlsm
    254.7 KB · Affichages: 4

Discussions similaires

Réponses
9
Affichages
474
Réponses
5
Affichages
434
Réponses
3
Affichages
261

Statistiques des forums

Discussions
315 126
Messages
2 116 482
Membres
112 760
dernier inscrit
GANA