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
bon.. en testant, il faut aussi
1) déclarer une variable public tout en haut du code (hors procédure)
Public EnableEvents As Boolean
2) modifier la macro
Code:
Private Sub Btx_Annul_Click()
Dim Ctrl As Control
EnableEvents = False
    Me.TextCode.Value = ""
    Me.T_bx_Noms.Value = ""
    Me.Lbx_Information.Caption = "Veuillez saisir votre code employé(e)"
   
    For Each Ctrl In Frame2.Controls
        Me.Chk_DebMat.BackColor = RGB(160, 255, 255)
        Me.Chk_DebAPM.BackColor = RGB(160, 255, 255)
        Me.Chk_DebSoir.BackColor = RGB(160, 255, 255)
       
        Select Case TypeName(Ctrl)
            Case "CheckBox"
                Ctrl.Value = False
                Ctrl.Enabled = True
                Ctrl.Visible = True
            Case "TextBox"
                Ctrl.Value = ""
        End Select
    Next Ctrl
EnableEvents = True
End Sub

et
Code:
Private Sub TextCode_Change()
If Not EnableEvents Then Exit Sub
Dim Ctrl As Control
Dim Trouve As Range

    Set Trouve = Range("t_Noms[Code]").Find(Me.TextCode, lookat:=xlWhole)
    If Not Trouve Is Nothing Then Me.T_bx_Noms = Trouve.Offset(0, 1)
   
    With Range("t_Saisie").ListObject

        Set Trouve = .ListColumns("Code agent").Range.Find(Me.TextCode, lookat:=xlWhole)
        If Not Trouve Is Nothing Then
            Me.Tbx_DebMat.Value = Format(Trouve.Offset(0, 3), "hh:mm")
            Me.Tbx_FinMat.Value = Format(Trouve.Offset(0, 4), "hh:mm")
            Me.Tbx_DebAPM.Value = Format(Trouve.Offset(0, 5), "hh:mm")
            Me.Tbx_FinAPM.Value = Format(Trouve.Offset(0, 6), "hh:mm")
            Me.Tbx_DebSoir.Value = Format(Trouve.Offset(0, 7), "hh:mm")
            Me.Tbx_FinSoir.Value = Format(Trouve.Offset(0, 8), "hh:mm")
            Me.T_bx_Commentaire = Trouve.Offset(0, 9)
         
            For Each Ctrl In Me.Frame2.Controls
                If TypeName(Ctrl) = "TextBox" Then
                    If Left(Ctrl.Name, 4) = "Tbx_" Then
                        Nom = Replace(Ctrl.Name, "Tbx_", "")
                        Ctrl.Enabled = (Ctrl.Value = "")
                        Me.Frame2.Controls("Chk_" & Nom).Enabled = (Ctrl.Value = "")
                        Me.Frame2.Controls("Chk_" & Nom).Visible = (Ctrl.Value = "")
                    End If
                End If
            Next Ctrl
         
        End If

    End With
   
    If Me.Tbx_FinMat.Enabled = False Then
        Me.Chk_DebMat.Enabled = False
        Me.Chk_DebMat.BackColor = RGB(255, 0, 0)
    Else
        Me.Chk_DebMat.BackColor = RGB(160, 255, 255)
    End If
   
    If Me.Tbx_FinAPM.Enabled = False Then
        Me.Chk_DebAPM.Enabled = False
        Me.Chk_DebAPM.BackColor = RGB(255, 0, 0)
    Else
        Me.Chk_DebAPM.BackColor = RGB(160, 255, 255)
    End If
   
    If Me.Tbx_FinSoir.Enabled = False Then
        Me.Chk_DebSoir.Enabled = False
        Me.Chk_DebSoir.BackColor = RGB(255, 0, 0)
    Else
        Me.Chk_DebSoir.BackColor = RGB(160, 255, 255)
    End If
         Me.Lbx_Information.Caption = "Vous ne pouvez plus badger"
 
CalculerTotalJournée
End Sub
Bonsoir vgendron,
Merci encore pour ton aide, merci également à TootFatBoy.
Le premier code "Annuler" fonctionne bien. Le deuxième, TextCode_Change, ne fonctionnait pas, alors j'ai supprimé ce bout "If Not EnableEvents Then Exit Sub" et ça fonctionne. Par contre, je viens de m'apercevoir d'une erreur, et là c'est de ma faute, c'est que lorsque l'on tape le code de l'employé(e) il ne prend pas en compte la date du jour. Par exemple, dans mon tableau, si l'on tape FAL221 (Paul AUCHON) il rapatrie les données enregistrées hier dimanche. Je vais donc modifier cette partie en espérant ne pas faire de bêtise.
Je vais me baser sur la recherche du nom, ça doit être le même principe.
 

NONO14

XLDnaute Occasionnel
J'ai écrit ce bout de code dans TextCode_Change que j'interprète comme "Je recherche dans le tableau "t_Saisie" la colonne "Date", si elle correspond à la date du jour inscrite dans le formulaire alors".
Mais apparemment ça ne fonctionne pas. J'ai du me planter quelque part... Je n'ai pas mis le code en entier parce que je pense que c'est uniquement cette partie qui est foireuse.
Voyez-vous mon erreur ?
Merci pour votre éclairage.

VB:
Private Sub TextCode_Change()

Dim Ctrl As Control
Dim Trouve As Range
Dim Trouve2 As Range

    Set Trouve = Range("t_Noms[Code]").Find(Me.TextCode, lookat:=xlWhole)
    If Not Trouve Is Nothing Then Me.T_bx_Noms = Trouve.Offset(0, 1)
    
    Set Trouve2 = Range("t_Saisie[Date]").Find(Me.T_bx_DateJour, lookat:=xlWhole) 'recherche la date dans le tableau
    If Trouve2 = Me.T_bx_DateJour Then 'si la date est égale à la date du jour dans le formulaire alors
 

vgendron

XLDnaute Barbatruc
Hello
il faudrait que tu postes ta dernière version qui inclue toutes les modifs qui ont été apportées depuis le début..
parce que je viens de regarder ton fichier PointHeure6.xlsm
j'ai l'impression qu'il manque des choses
par exemple ta macro sur le combobox_change ==la partie qui sauvegarde n'a aucune chance de fonctionner correctement...
 

NONO14

XLDnaute Occasionnel
Bonjour à toutes et à tous
Cette version est la dernière, il ne faut pas tenir compte du code de sauvegarde car il n'est pas fonctionnel. Je l'ai gardé pour m'en inspirer pour la suite. Je ne suis pas sur mon écran actuellement, je vous réponds de mon téléphone.
Je vais tester vos propositions dès que possible.
 

NONO14

XLDnaute Occasionnel
Bonjour à toutes et à tous
Cette version est la dernière, il ne faut pas tenir compte du code de sauvegarde car il n'est pas fonctionnel. Je l'ai gardé pour m'en inspirer pour la suite. Je ne suis pas sur mon écran actuellement, je vous réponds de mon téléphone.
Je vais tester vos propositions dès que possible.
Bonjour à toutes et à tous
Cette version est la dernière, il ne faut pas tenir compte du code de sauvegarde car il n'est pas fonctionnel. Je l'ai gardé pour m'en inspirer pour la suite. Je ne suis pas sur mon écran actuellement, je vous réponds de mon téléphone.
Je vais tester vos propositions dès que possible.
Je dois de temps en temps m'absenter pour raison médicale.
Toutes mes excuses
 

Discussions similaires

Réponses
9
Affichages
342
Réponses
5
Affichages
369
Réponses
3
Affichages
161

Statistiques des forums

Discussions
313 902
Messages
2 103 391
Membres
108 631
dernier inscrit
tarek.kanaan