Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Ecrire une formule de calcul en Vba Excel

NONO14

XLDnaute Occasionnel
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: 13
Dernière édition:
Solution
Bonjour
tu dis ne pas vouloir protéger les colonnes..et pourtant tu postes un fichier protégé...

pour inscrire une formule dans une cellule J2 par VBA, voici ma méthode
1) créer une variable qui contient la formule en Anglais
FormuleJ="=if(A2="""",""""if(A2<>""""................)"
en anglais veut dire: les fonctions sont écrites dans la version Anglaise ==> Si==>IF, et==> And....
les ; sont remplacés par des ,
les " sont remplacés par ""

2) inscrire la formule
range("J2").formula=formuleJ

3) pour étirer la formule: autofill

NONO14

XLDnaute Occasionnel
Lorsque j'écris Total=0, je veux dire que le résultat du calcul sera zéro.
Apparemment ce n'est pas la bonne façon de faire.
 

vgendron

XLDnaute Barbatruc
pour le calcul total, il faut "juste" définir comment tu calcules lorsqu'il manque des pointages
VB:
Public Sub CalculerTotalJournée() 'à revoir
Dim Total As Date

    If Me.Tbx_DebMat <> "" And Me.Tbx_FinMat <> "" Then Total = CDate(Me.Tbx_FinMat) - CDate(Me.Tbx_DebMat) 'total du matin si deux pointages le matin
    If Me.Tbx_DebAPM <> "" And Me.Tbx_FinAPM <> "" Then Total = Total + CDate(Me.Tbx_FinAPM) - CDate(Me.Tbx_DebAPM) 'on rajoute le total de l'APM si deux pointages l'APM
    If Me.Tbx_DebSoir <> "" And Me.Tbx_FinSoir <> "" Then Total = Total + CDate(Me.Tbx_FinSoir) - CDate(Me.Tbx_DebSoir) 'on rajoute le total du soir si deux pointages le soir
 
    'traiter ensuite les cas ou un seul pointage sur deux a été fait ??
    
    If Me.Tbx_DebMat <> "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM = "" And Me.Tbx_FinAPM = "" Then
        Total = CDate(Total = 0) 'calcul erroné ==> mettre Total=0 suffit
    End If
    
    If Me.Tbx_DebMat <> "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM = "" And Me.Tbx_FinAPM <> "" Then
        Total = CDate(Me.Tbx_FinAPM) - CDate(Me.Tbx_DebMat) 'pas de pause du midi?
    End If
    
    If Me.Tbx_DebMat <> "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM = "" And Me.Tbx_FinAPM = "" And Me.Tbx_DebSoir = "" And Me.Tbx_FinSoir = "" Then
        Total = CDate(Total = 0) 'calcul erroné ==> mettre Total=0 suffit
    End If
    
    If Me.Tbx_DebMat <> "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM = "" And Me.Tbx_FinAPM = "" And Me.Tbx_DebSoir = "" And Me.Tbx_FinSoir <> "" Then
        Total = CDate(Me.Tbx_FinSoir) - CDate(Me.Tbx_DebMat) 'journée continue?
    End If
    
    If Me.Tbx_DebMat <> "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM = "" And Me.Tbx_FinAPM <> "" And Me.Tbx_DebSoir <> "" And Me.Tbx_FinSoir <> "" Then
        Total = CDate(Me.Tbx_FinAPM) - CDate(Me.Tbx_DebMat) + CDate(Me.Tbx_FinSoir) - CDate(Me.Tbx_DebSoir)
    End If
    
    If Me.Tbx_DebMat <> "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM = "" And Me.Tbx_FinAPM = "" And Me.Tbx_DebSoir <> "" And Me.Tbx_FinSoir <> "" Then
        Total = CDate(Me.Tbx_FinSoir) - CDate(Me.Tbx_DebSoir)
    End If
    
    If Me.Tbx_DebMat = "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM = "" And Me.Tbx_FinAPM = "" And Me.Tbx_DebSoir = "" And Me.Tbx_FinSoir <> "" Then
        Total = CDate(Total = 0) 'calcul erroné ==> mettre Total=0 suffit
    End If
    
    If Me.Tbx_DebMat = "" And Me.Tbx_FinMat = "" And Me.Tbx_DebAPM <> "" And Me.Tbx_FinAPM = "" And Me.Tbx_DebSoir = "" And Me.Tbx_FinSoir <> "" Then
        Total = CDate(Me.Tbx_FinSoir) - CDate(Me.Tbx_DebAPM)
    End If
    
    Me.T_bx_TotJour = CDate(Total)
    Me.T_bx_TotJour = Application.Text(Total, "[h]:mm")
End Sub
 

NONO14

XLDnaute Occasionnel
Tu as raison concernant le temps de pause qui est à déterminer selon le planning de travail.
Un(e) employé(e) commençant à 11h00 n'aura pas sa pause au même moment que celui ou celle commençant à 6, 7 ou 8h. Je ne sais pas encore comment on va appliquer ça, c'est pourquoi, pour le moment j'ai besoin de ces calculs. Pour un planning normal, arrivée/départ le matin ou après-midi ou soir ne va pas engendré de problème, mais les plannings sur plusieurs plages ça risque de se compliquer. Est-ce que le responsable va imposer une pause ou pas, cela va dépendre du temps de travail. En tout état de cause, d'après les informations reçues, le temps de travail devrait rarement dépasser le temps prévu au planning de chacun ou chacune.
Cependant, merci beaucoup pour la correction du code.
 

Discussions similaires

Réponses
9
Affichages
344
Réponses
5
Affichages
370
Réponses
3
Affichages
162
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…