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

NONO14

XLDnaute Impliqué
Bonjour à toutes et à tous,
J'ai avancé dans mon projet mais j'aurai besoin de votre aide pour simplifier un code.
Celui-ci se trouve dans UfPointage et TextCode_Change, il y a 6 fois ce genre de code que je souhaiterai simplifier.
Pouvez-vous m'aiguiller s'il vous plait ?
J'ai essayé d'utiliser le 2ème code, en modifiant les controls, mais je n'arrive pas à mettre les conditions.
Merci par avance
VB:
f Me.Lbl_DebMat.Caption <> "" Then
    Me.Chk_DebMat.Enabled = False
    Me.Chk_DebMat.Visible = False
    Me.Lbl_DebMat.Enabled = False
    End If
Code:
Private Sub Btx_Annul_Click()
Dim Ctrl As Control
    For Each Ctrl In Frame2.Controls
        Select Case TypeName(Ctrl)
    Case "CheckBox"
Ctrl.Value = False
Ctrl.Enabled = True
Ctrl.Visible = True
    Case "Label"
Ctrl.Caption = ""
        End Select
Next Ctrl

Me.TextCode.Value = ""
Me.Tbx_Noms.Value = ""
Me.Tbx_Commentaire.Value = ""

Me.Lbx_Information.Caption = "Veuillez saisir votre code employé(e)"
End Sub
 

Pièces jointes

  • PointHeure5.xlsm
    742.6 KB · Affichages: 2

vgendron

XLDnaute Barbatruc
Hello

essaie ceci
VB:
Private Sub TextCode_Change()
Dim CtrlOb As Control
    With Sheets("Liste agents").ListObjects("t_Noms")
        Set trouve = .ListColumns("Code").Range.Find(Me.TextCode, lookat:=xlWhole)
        If Not trouve Is Nothing Then
            Me.Tbx_Noms = trouve.Offset(0, 1)
        End If
    End With
    With Sheets("Saisie").ListObjects("t_Saisie")
        Set trouve = .ListColumns("Code agent").Range.Find(Me.TextCode, lookat:=xlWhole)
        If Not trouve Is Nothing Then
            Me.Lbl_DebMat.Caption = Format(trouve.Offset(0, 3), "hh:mm")
            Me.Lbl_FinMat.Caption = Format(trouve.Offset(0, 4), "hh:mm")
            Me.Lbl_DebAPM.Caption = Format(trouve.Offset(0, 5), "hh:mm")
            Me.Lbl_FinAPM.Caption = Format(trouve.Offset(0, 6), "hh:mm")
            Me.Lbl_DebSoir.Caption = Format(trouve.Offset(0, 7), "hh:mm")
            Me.Lbl_FinSoir.Caption = Format(trouve.Offset(0, 8), "hh:mm")
            Me.Tbx_Commentaire = trouve.Offset(0, 9)
           
            For Each Ctrl In Me.Frame2.Controls
                If TypeName(Ctrl) = "Label" Then
                    Nom = Replace(Ctrl.Name, "Lbl_", "")
                    If Nom <> "TotJour" Then 'il s'agit aussi d'un label, mais pas concerné
                        Ctrl.Enabled = (Ctrl.Caption = "")
                        Me.Frame2.Controls("Chk_" & Nom).Enabled = (Ctrl.Caption = "")
                        Me.Frame2.Controls("Chk_" & Nom).Visible = (Ctrl.Caption = "")
                    End If
                End If
            Next Ctrl
           
'            Me.Chk_DebMat.Enabled = (Me.Lbl_DebMat.Caption = "")
'            Me.Chk_DebMat.Visible = (Me.Lbl_DebMat.Caption = "")
'            Me.Lbl_DebMat.Enabled = (Me.Lbl_DebMat.Caption = "")
'
'            Me.Chk_DebAPM.Enabled = (Me.Lbl_DebAPM.Caption = "")
'            Me.Chk_DebAPM.Visible = (Me.Lbl_DebAPM.Caption = "")
'            Me.Lbl_DebAPM.Enabled = (Me.Lbl_DebAPM.Caption = "")
'
'            Me.Chk_DebSoir.Enabled = (Me.Lbl_DebSoir.Caption = "")
'            Me.Chk_DebSoir.Visible = (Me.Lbl_DebSoir.Caption = "")
'            Me.Lbl_DebSoir.Enabled = (Me.Lbl_DebSoir.Caption = "")
'
'            Me.Chk_FinMat.Enabled = (Me.Lbl_FinMat.Caption = "")
'            Me.Chk_FinMat.Visible = (Me.Lbl_FinMat.Caption = "")
'            Me.Lbl_FinMat.Enabled = (Me.Lbl_FinMat.Caption = "")
'
'            Me.ChK_FinAPM.Enabled = (Me.Lbl_FinAPM.Caption = "")
'            Me.ChK_FinAPM.Visible = (Me.Lbl_FinAPM.Caption = "")
'            Me.Lbl_FinAPM.Enabled = (Me.Lbl_FinAPM.Caption = "")
'
'            Me.Chk_FinSoir.Enabled = (Me.Lbl_FinSoir.Caption = "")
'            Me.Chk_FinSoir.Visible = (Me.Lbl_FinSoir.Caption = "")
'            Me.Lbl_FinSoir.Enabled = (Me.Lbl_FinSoir.Caption = "")
        End If
    End With
End Sub

j'ai laissé en commentaire, les blocs de 3 lignes qui sont déjà une simplification de tes blocs "IF" associés aux 6 controls
 

NONO14

XLDnaute Impliqué
Hello

essaie ceci
VB:
Private Sub TextCode_Change()
Dim CtrlOb As Control
    With Sheets("Liste agents").ListObjects("t_Noms")
        Set trouve = .ListColumns("Code").Range.Find(Me.TextCode, lookat:=xlWhole)
        If Not trouve Is Nothing Then
            Me.Tbx_Noms = trouve.Offset(0, 1)
        End If
    End With
    With Sheets("Saisie").ListObjects("t_Saisie")
        Set trouve = .ListColumns("Code agent").Range.Find(Me.TextCode, lookat:=xlWhole)
        If Not trouve Is Nothing Then
            Me.Lbl_DebMat.Caption = Format(trouve.Offset(0, 3), "hh:mm")
            Me.Lbl_FinMat.Caption = Format(trouve.Offset(0, 4), "hh:mm")
            Me.Lbl_DebAPM.Caption = Format(trouve.Offset(0, 5), "hh:mm")
            Me.Lbl_FinAPM.Caption = Format(trouve.Offset(0, 6), "hh:mm")
            Me.Lbl_DebSoir.Caption = Format(trouve.Offset(0, 7), "hh:mm")
            Me.Lbl_FinSoir.Caption = Format(trouve.Offset(0, 8), "hh:mm")
            Me.Tbx_Commentaire = trouve.Offset(0, 9)
          
            For Each Ctrl In Me.Frame2.Controls
                If TypeName(Ctrl) = "Label" Then
                    Nom = Replace(Ctrl.Name, "Lbl_", "")
                    If Nom <> "TotJour" Then 'il s'agit aussi d'un label, mais pas concerné
                        Ctrl.Enabled = (Ctrl.Caption = "")
                        Me.Frame2.Controls("Chk_" & Nom).Enabled = (Ctrl.Caption = "")
                        Me.Frame2.Controls("Chk_" & Nom).Visible = (Ctrl.Caption = "")
                    End If
                End If
            Next Ctrl
          
'            Me.Chk_DebMat.Enabled = (Me.Lbl_DebMat.Caption = "")
'            Me.Chk_DebMat.Visible = (Me.Lbl_DebMat.Caption = "")
'            Me.Lbl_DebMat.Enabled = (Me.Lbl_DebMat.Caption = "")
'
'            Me.Chk_DebAPM.Enabled = (Me.Lbl_DebAPM.Caption = "")
'            Me.Chk_DebAPM.Visible = (Me.Lbl_DebAPM.Caption = "")
'            Me.Lbl_DebAPM.Enabled = (Me.Lbl_DebAPM.Caption = "")
'
'            Me.Chk_DebSoir.Enabled = (Me.Lbl_DebSoir.Caption = "")
'            Me.Chk_DebSoir.Visible = (Me.Lbl_DebSoir.Caption = "")
'            Me.Lbl_DebSoir.Enabled = (Me.Lbl_DebSoir.Caption = "")
'
'            Me.Chk_FinMat.Enabled = (Me.Lbl_FinMat.Caption = "")
'            Me.Chk_FinMat.Visible = (Me.Lbl_FinMat.Caption = "")
'            Me.Lbl_FinMat.Enabled = (Me.Lbl_FinMat.Caption = "")
'
'            Me.ChK_FinAPM.Enabled = (Me.Lbl_FinAPM.Caption = "")
'            Me.ChK_FinAPM.Visible = (Me.Lbl_FinAPM.Caption = "")
'            Me.Lbl_FinAPM.Enabled = (Me.Lbl_FinAPM.Caption = "")
'
'            Me.Chk_FinSoir.Enabled = (Me.Lbl_FinSoir.Caption = "")
'            Me.Chk_FinSoir.Visible = (Me.Lbl_FinSoir.Caption = "")
'            Me.Lbl_FinSoir.Enabled = (Me.Lbl_FinSoir.Caption = "")
        End If
    End With
End Sub

j'ai laissé en commentaire, les blocs de 3 lignes qui sont déjà une simplification de tes blocs "IF" associés aux 6 controls
Bonjour,
Super ! ça fonctionne et c'est plus propre.
Merci beaucoup
Je continue le reste.
 

NONO14

XLDnaute Impliqué
Dans mon UserForm "UfPointage", je souhaite faire la soustraction de chaque période de pointage si le label n'est pas vide et qu'elle s'additionne dans le label Lbl_TotJour.
La formule doit donner ceci :
Lbl_FinMat - LblDebMat (si un des 2 labels n'est pas vide) + Lbl_FinAPM - Lbl_DebAPM (si pas vides) + Lbl_FinSoir - Lbl_DebSoir (si pas vides).
J'ai essayé de reprendre le code "Public Sub CalculerTotaux" dans le formulaire UfGestTemps mais je n'y arrive pas. Il n'y a pas de résultats.
Pouvez-vous m'expliquer la marche à suivre s'il vous plaît ?
Merci par avance
 

vgendron

XLDnaute Barbatruc
Déjà.. la sub "CalculerTotaux" a été définie pour travailler sur le formulaire "UfGestTemps"
==> elle travaille donc avec des controles dudit formulaire

la.. tu veux faire la meme chose à peu près sur un autre formulaire
==> le plus simple est donc de créer une seconde sub
CalculerTotaux2()
et adapater avec les noms de control
supprimer la partie qui gère le jour.. puisque sur ton formulaire de pointage, il n'y a qu'UNE seule journée

Hello @TooFatBoy
 

vgendron

XLDnaute Barbatruc
Nouvelle macro
VB:
Public Sub CalculerTotalJournée()
Dim Total As Date
    If Me.Lbl_DebMat <> "" And Me.Lbl_FinMat <> "" Then
        Total = CDate(Me.Lbl_FinMat) - CDate(Me.Lbl_DebMat)
    End If
    If Me.Lbl_DebAPM <> "" And Me.Lbl_FinAPM <> "" Then
        Total = Total + CDate(Me.Lbl_FinAPM) - CDate(Me.Lbl_DebAPM)
    End If
    If Me.Lbl_DebSoir <> "" And Me.Lbl_FinSoir <> "" Then
        Total = Total + CDate(Me.Lbl_FinSoir) - CDate(Me.Lbl_DebSoir)
    End If
    
    Me.Lbl_TotJour = Format(Total, "hh:mm")
End Sub

mais maintenant.. il faut l'appeler
 

NONO14

XLDnaute Impliqué
Déjà.. la sub "CalculerTotaux" a été définie pour travailler sur le formulaire "UfGestTemps"
==> elle travaille donc avec des controles dudit formulaire

la.. tu veux faire la meme chose à peu près sur un autre formulaire
==> le plus simple est donc de créer une seconde sub
CalculerTotaux2()
et adapater avec les noms de control
supprimer la partie qui gère le jour.. puisque sur ton formulaire de pointage, il n'y a qu'UNE seule journée

Hello @TooFatBoy
D'accord, je vais faire ça.
 

NONO14

XLDnaute Impliqué
Nouvelle macro
VB:
Public Sub CalculerTotalJournée()
Dim Total As Date
    If Me.Lbl_DebMat <> "" And Me.Lbl_FinMat <> "" Then
        Total = CDate(Me.Lbl_FinMat) - CDate(Me.Lbl_DebMat)
    End If
    If Me.Lbl_DebAPM <> "" And Me.Lbl_FinAPM <> "" Then
        Total = Total + CDate(Me.Lbl_FinAPM) - CDate(Me.Lbl_DebAPM)
    End If
    If Me.Lbl_DebSoir <> "" And Me.Lbl_FinSoir <> "" Then
        Total = Total + CDate(Me.Lbl_FinSoir) - CDate(Me.Lbl_DebSoir)
    End If
   
    Me.Lbl_TotJour = Format(Total, "hh:mm")
End Sub

mais maintenant.. il faut l'appeler
Merci beaucoup. Je vais savoir faire pour l'appel de la Sub
 

Discussions similaires

Réponses
9
Affichages
448
Réponses
5
Affichages
416
Réponses
3
Affichages
239

Statistiques des forums

Discussions
314 736
Messages
2 112 319
Membres
111 506
dernier inscrit
Souleymane@