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: 16
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
déjà.. je te propose de repartir sur CE fichier rev7
j'ai retravaillé toute l'indentation
et simplifié certaines lignes de code

et maintenant.. il faudrait expliquer sur quel point tu es en train de travailler..
et ce que tu cherches à faire avec le set trouve=....
 

Pièces jointes

  • PointHeure7.xlsm
    652 KB · Affichages: 2

NONO14

XLDnaute Impliqué
Je dois faire un test sur le code de l'employé(e) (TextCode) et sur la date du jour (T_bx_Datejour).
Si le code employé(e) est bon et que la date du jour correspond à celle du tableau alors on affiche les données dans les TextBox sinon, elles restent vides.
 

NONO14

XLDnaute Impliqué
déjà.. je te propose de repartir sur CE fichier rev7
j'ai retravaillé toute l'indentation
et simplifié certaines lignes de code

et maintenant.. il faudrait expliquer sur quel point tu es en train de travailler..
et ce que tu cherches à faire avec le set trouve=....
Merci beaucoup pour ton excellent travail.
Pour répondre à ta question ici :
VB:
Set Trouve2 = .ListColumns("Date").Range.Find(Me.T_bx_DateJour, LookIn:=xlValues) 'pourquoi faire?
        If Not Trouve2 Is Nothing Then MsgBox Trouve2
    End With

Le but est de n'afficher que les heures du jour. Si on oublie de sauvegarder les heures de la veille, seules les heures du jour doivent être affichées.
 

NONO14

XLDnaute Impliqué
déjà.. je te propose de repartir sur CE fichier rev7
j'ai retravaillé toute l'indentation
et simplifié certaines lignes de code

et maintenant.. il faudrait expliquer sur quel point tu es en train de travailler..
et ce que tu cherches à faire avec le set trouve=....
Ensuite je vais travailler sur le code pour colorer en rouge les checkBox lorqu'il manquera un pointage et pas seulement le matin comme c'est le cas actuellement. Par exemple s'il y a un pointage arrivée le matin et un pointage arrivée APM mais pas de pointage départ du matin, alors la CheckBox "Chk_FinMat" sera en rouge, à moins que je travaille directement dans le tableau de la feuille "Saisie" avec des formules conditionnelles.
 

vgendron

XLDnaute Barbatruc
Je ne comprend pas et je pense qu'il y a une mauvaise définition sur ce que tu veux faire

pour être sur qu'on se comprend bien
on est sur le formulaire UfPointage

quand tu saisis un code employé dans le Textbox "TextCode"
Ce que le code actuel fait:
1) on cherche la ligne de l'employé dans le tableau t_Saisie
==> comme on cherche le nom avec un set trouve=...
on va récuperer la PREMIERE occurence de l'employé (meme si il y a d'autres lignes avec le meme code employé)
la date n'intervient pas du tout
2) tu charges les heures déjà enregistrées
3) tu actives/affiches ou pas les checkbox
4) le set trouve2.. ne sert à rien en l'état
5) on colorie les tbx en fonction de l'activation des controls

Ce que tu veux faire (enfin.. je pense)
1) on cherche la ligne qui correspond à l'employé ET la date..

ensuite;. on charge les données..

si j'ai bien compris; on a donc le meme cas que déjà vu dans le formulaire GestTemps, ou il fallait remplacer le Set trouve=... par une boucle for i..

correct??
 

NONO14

XLDnaute Impliqué
Je ne comprend pas et je pense qu'il y a une mauvaise définition sur ce que tu veux faire

pour être sur qu'on se comprend bien
on est sur le formulaire UfPointage

quand tu saisis un code employé dans le Textbox "TextCode"
Ce que le code actuel fait:
1) on cherche la ligne de l'employé dans le tableau t_Saisie
==> comme on cherche le nom avec un set trouve=...
on va récuperer la PREMIERE occurence de l'employé (meme si il y a d'autres lignes avec le meme code employé)
la date n'intervient pas du tout
2) tu charges les heures déjà enregistrées
3) tu actives/affiches ou pas les checkbox
4) le set trouve2.. ne sert à rien en l'état
5) on colorie les tbx en fonction de l'activation des controls

Ce que tu veux faire (enfin.. je pense)
1) on cherche la ligne qui correspond à l'employé ET la date..

ensuite;. on charge les données..

si j'ai bien compris; on a donc le meme cas que déjà vu dans le formulaire GestTemps, ou il fallait remplacer le Set trouve=... par une boucle for i..

correct??
Quand on saisit le code employé(e), on recherche l'occurrence qui correspond à la fois au code et à la date du jour, pour n'avoir dans le formulaire que les heures du jour. Dans mon tableau actuel, les heures saisies de dimanche et lundi ne doivent plus apparaître dans le formulaire.
S'il n'y a pas d'occurrence, alors on créé une nouvelle saisie.
 

vgendron

XLDnaute Barbatruc
donc, c'est bien ce que j'ai compris..
il faut bien te rappeler que la fonction trouve cherche la PREMIERE occurence
c'est l'équivalent de la fonction Recherchev sous excel

trouve=plagederecherche.find(CequeJecherche,optionde recherche)
Set Trouve = .ListColumns("Code Employé").Range.Find(Me.TextCode, Lookat:=xlwhole)
ici, la plagederecherche = la colonne "Code Employé"
ce qu'on recherche; le Code

la fonction parcourt la colonne ligne à ligne, et DES qu'elle trouve la correspondance, elle s'arrete
==> si on a plusieurs fois le code dans la colonne, on ne récupère que la première occurence

ici. tu vois bien qu'à aucun moment on a dit de chercher aussi une correspondance sur la date...
admettons, qu'on ait donc trouvé la ligne 5

ensuite, tu fais un
set trouve2=...
idem, la fonction va chercher la date dans la colonne des dates (SANS se soucier des codes) et va trouver la première occurence
laquelle peut tout a fait etre la ligne 1 dont le code est totalement différent

d'ou le besoin d'une boucle
for i=1 to nb delignes
si colonneCode = Code ET colonneDate=date alors
on a trouvé la ligne
sinon.. rien.. la boucle continue jusqu'à la fin
next i
 

NONO14

XLDnaute Impliqué
Dans le cas de GestTemps, on créé les plannings et on ne revient pas dessus, pas avec le formulaire.
Pour UfPointage, on doit pouvoir ajouter des pointages dans la journée, donc afficher les saisies déjà réalisées dans la journée, pas celles de la veille ou des autres jours avant, cela en cas d'oublie de sauvegarde des pointages déjà réalisés.
Dis-moi si je ne suis pas assez clair....
 

NONO14

XLDnaute Impliqué
donc, c'est bien ce que j'ai compris..
il faut bien te rappeler que la fonction trouve cherche la PREMIERE occurence
c'est l'équivalent de la fonction Recherchev sous excel

trouve=plagederecherche.find(CequeJecherche,optionde recherche)
Set Trouve = .ListColumns("Code Employé").Range.Find(Me.TextCode, Lookat:=xlwhole)
ici, la plagederecherche = la colonne "Code Employé"
ce qu'on recherche; le Code

la fonction parcourt la colonne ligne à ligne, et DES qu'elle trouve la correspondance, elle s'arrete
==> si on a plusieurs fois le code dans la colonne, on ne récupère que la première occurence

ici. tu vois bien qu'à aucun moment on a dit de chercher aussi une correspondance sur la date...
admettons, qu'on ait donc trouvé la ligne 5

ensuite, tu fais un
set trouve2=...
idem, la fonction va chercher la date dans la colonne des dates (SANS se soucier des codes) et va trouver la première occurence
laquelle peut tout a fait etre la ligne 1 dont le code est totalement différent

d'ou le besoin d'une boucle
for i=1 to nb delignes
si colonneCode = Code ET colonneDate=date alors
on a trouvé la ligne
sinon.. rien.. la boucle continue jusqu'à la fin
next i
Oui, tu as tout à fait raison, c'est de ma faute, j'aurai dû être plus précis dès le départ.
Je vous ai fait perdre votre temps à toi et à TootFatBoy.
Je m'en excuses sincèrement
 

Discussions similaires

Réponses
9
Affichages
435
Réponses
5
Affichages
406
Réponses
3
Affichages
224

Membres actuellement en ligne

Statistiques des forums

Discussions
314 611
Messages
2 111 140
Membres
111 051
dernier inscrit
MANUREVALAND