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

TooFatBoy

XLDnaute Barbatruc
Enrichi (BBcode):
For Each Ctrl In Me.Frame2.Controls
    If TypeName(Ctrl) = "TextBox" Then
        Nom = Replace(Ctrl.Name, "Tbx_", "")
         If Nom <> "Tbx_DateJour" Then
            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
Juste une remarque qui ne répond pas à ta question, mais à mon avis ton test ne sert à rien.
 
Dernière édition:

NONO14

XLDnaute Occasionnel
Enrichi (BBcode):
For Each Ctrl In Me.Frame2.Controls
    If TypeName(Ctrl) = "TextBox" Then
        Nom = Replace(Ctrl.Name, "Tbx_", "")
         If Nom <> "Tbx_DateJour" Then
            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
Juste une remarque qui ne répond pas à ta question, mais à mon avis ton test ne sert à rien.
Bonsoir TootFatBoy,
Ah bon ? Ce que je cherche à faire, c'est de vérifier si le code et la date du jour existe déjà dans le tableau("t_Saisie"), si oui, on récupére les données existantes dans le formulaire, les Textbox remplies ne sont plus modifiables, par contre on peut compléter le formulaire par un nouveau pointage. Je pensais que mon code faisait ça ?
 

TooFatBoy

XLDnaute Barbatruc
Je n'arrive pas à trouver mon erreur.
Elle est là :
J'ai remplacé tous labels de saisie d'heure par des TextBoxs
Le code, qui avant ne s'appliquait qu'aux TextBox de l'époque, maintenant s'applique aussi aux anciens Label qui sont maintenant des TextBox.
Il faut donc modifier ton code en conséquence.
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Une proposition, à tout hasard... :confused:

VB:
Private Sub TextCode_Change()
'
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

End Sub
 

Pièces jointes

  • PointHeure5.xlsm
    694.7 KB · Affichages: 2
Dernière édition:

NONO14

XLDnaute Occasionnel
Comment ça "ah bon ?" ??? :oops:

Dans la variable Nom, tu enlèves "Tbx_" et en suite tu testes si la variable Nom est égale à une valeur contenant "Tbx_".
Y a pas comme un truc qui te titille et t'interpelle ? ;)
Toutes mes TextBoxs de la Frame2 commencent par "Tbx_". Je vais suivre ton conseil est remplacé mes 6 Textbox de pointage
Désolé, je n'avais pas vu ta proposition de code. Je vais la tester.
Merci pour ton aide, je comprends que cela ne doit pas être aisé face à un bourrin comme moi
 

NONO14

XLDnaute Occasionnel
J'ai corrigé ce petit bout "Me.T_bx_Noms = Trouve.Offset(0, 1)" par "Me.Tbx_Noms" et celui-ci "Me.T_bx_Commentaire = Trouve.Offset(0, 9)" par "Tbx_Commentaires" et ça fonctionne. Je vais me pencher sur ton code afin de mieux le cerner.
Je fais de mon mieux pour régler mes problèmes, mais parfois (souvent), mon cerveau fonctionne au ralenti.
Je m'en excuse sincérement.
 

NONO14

XLDnaute Occasionnel
Une proposition, à tout hasard... :confused:

VB:
Private Sub TextCode_Change()
'
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
                    Nom = Replace(Ctrl.Name, "Tbx_", "")
'                    If Nom <> "Tbx_DateJour" Then
                    If Left(Ctrl.Name, 4) = "tbx_" Then
                        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

End Sub
Ton code rapatrie bien les données, par contre, les TextBox déjà remplies sont modifiables et ça ne doit pas être les cas, et les CheckBoxs devant les TextBoxs remplies doivent être non visibles ou Enabled= False afin de ne pas être réutilisées si des données sont déjà existantes.
Je vais regarder ça.
 

Discussions similaires

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

Membres actuellement en ligne

Statistiques des forums

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