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
pour les différents tests if que tu as faits
la question est: tu vérifies quoi? = tu autorises quoi?

ce que je pense:
on ne peut pas pointer un horaire (début ou fin) entre deux pointages déjà faits... correct?
ex:
Début matin pointé
Fin Matin "oublié
Début APM pointé

==> nouveau pointage: ne peut pas être fin matin, mais uniquement tout ce qui est après le dernier pointage (Début APM)

dans ce cas.. il "suffirait" de trouver le dernier pointage effectué puis laisser enable les pointages suivants et désactiver les précédents
Oui c'est tout à fait ça. Cependant dans ma petite tête j'ai essayé d'imaginer tous les scénarios et ça donne ça et c'est très long. Je ne sais pas faire autrement. Je vais relire tout ça pour voir s'il n'y a pas des doublons.
VB:
If Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" Then
            Me.Chk_DebMat.Visible = False
            Me.Chk_FinMat.Visible = False
                Me.Lbx_Information.Caption = "Vous ne pouvez plus badger pour le matin"
          End If
          
          If Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebAPM.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" Then
            Me.Chk_DebMat.Visible = False
            Me.Chk_FinMat.Visible = False
            Me.Chk_DebAPM.Visible = False
                Me.Lbx_Information.Caption = "Vous ne pouvez plus badger pour le matin"
          End If
          
          If Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value = "" Then
            Me.Chk_DebMat.Visible = False
            Me.Chk_FinMat.Visible = False
            Me.Chk_DebAPM.Visible = False
            Me.Chk_FinAPM.Visible = False
                Me.Lbx_Information.Caption = "Vous ne pouvez plus badger pour l'après-midi"
          End If
          
          If Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value = "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value = "" Then
            Me.Chk_DebMat.Visible = False
            Me.Chk_FinMat.Visible = False
            Me.Chk_DebAPM.Visible = False
            Me.Chk_FinAPM.Visible = False
                Me.Lbx_Information.Caption = "Vous ne pouvez badger que pour le soir"
          End If
            
          If Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value <> "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value <> "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value = "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value = "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value = "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value <> "" _
          Or Me.Tbx_DebMat.Value <> "" And Me.Tbx_FinMat.Value = "" And Me.Tbx_DebAPM.Value <> "" And Me.Tbx_FinAPM.Value <> "" And Me.Tbx_DebSoir.Value = "" And Me.Tbx_FinSoir.Value <> "" Then
                Me.Lbx_Information.Caption = "Vous ne pouvez plus badger"
          End If
          
                If Me.Lbx_Information.Caption = "Vous ne pouvez plus badger" Then
                        For Each Ctrl3 In Me.Frame2.Controls
                            If TypeName(Ctrl3) = "CheckBox" Then
                                If Left(Ctrl3.Name, 4) = "Chk_" Then
                                Nom = Replace(Ctrl3.Name, "Chk_", "")
                                Ctrl3.Visible = False
                                End If
                            End If
                        Next Ctrl3
                            Me.Btx_Valide.Enabled = False
                End If
                    
    CalculerTotalJournée
End Sub
 

vgendron

XLDnaute Barbatruc
Ca donnerait ca

une nouvelle fonction à mettre dans le module du formulaire (avec le reste)
VB:
Function LastPointé() As String 'cette fonction retourne le nom du dernier textbox pointé
     With Me
        If .Tbx_FinSoir <> "" Then LastPointé = .Tbx_FinSoir.Name: Exit Function
        If .Tbx_DebSoir <> "" Then LastPointé = .Tbx_DebSoir.Name: Exit Function
        
        If .Tbx_FinAPM <> "" Then LastPointé = .Tbx_FinAPM.Name: Exit Function
        If .Tbx_DebAPM <> "" Then LastPointé = .Tbx_DebAPM.Name: Exit Function
        
        If .Tbx_FinMat <> "" Then LastPointé = .Tbx_FinMat.Name: Exit Function
        If .Tbx_DebMat <> "" Then LastPointé = .Tbx_DebMat.Name: Exit Function
     End With
End Function

et une nouveau code pour le textcode_change
peut etre plus long en terme de ligne de code, mais plus lisible..?
Code:
Private Sub TextCode_Change()
Dim Ctrl As Control
Dim Ctrl2 As Control
Dim Trouvé As Boolean
  
    Me.TextCode.Text = UCase(Me.TextCode)
  
    If Not EnableEvents Then Exit Sub
    'on cherche le nom associé au code dans la TS "t_Noms"
    With Sheets("Liste agents").ListObjects("t_Noms")
        Set Trouve = .ListColumns(1).Range.Find(Me.TextCode, lookat:=xlWhole)
        If Not Trouve Is Nothing Then
            Me.T_bx_Noms = Trouve.Offset(0, 1)
        Else
            Me.T_bx_Noms = ""
        End If
    End With
        
    'on cherche dans la TS t_Saisie la ligne qui correspond au code ET à la date du jour
    With Sheets("Saisie").ListObjects("t_Saisie")
        Trouvé = False
        For I = 1 To .ListRows.Count
            If .ListColumns("Code agent").DataBodyRange(I) = Me.TextCode And .ListColumns("Date").DataBodyRange(I) = Me.T_bx_DateJour Then
                lig = I
                Trouvé = True
                Exit For
            End If
        Next I
            
        If Not Trouvé Then Exit Sub 'pas de ligne correspondante ==> l'employé n'a jamais rien saisi pour cette journée
            
        'on charge les horaires déjà saisies pour la date du jour
        Me.T_bx_Noms = .DataBodyRange(I, 2)
        Me.Tbx_DebMat.Value = Format(.DataBodyRange(I, 4), "hh:mm")
        Me.Tbx_FinMat.Value = Format(.DataBodyRange(I, 5), "hh:mm")
        Me.Tbx_DebAPM.Value = Format(.DataBodyRange(I, 6), "hh:mm")
        Me.Tbx_FinAPM.Value = Format(.DataBodyRange(I, 7), "hh:mm")
        Me.Tbx_DebSoir.Value = Format(.DataBodyRange(I, 8), "hh:mm")
        Me.Tbx_FinSoir.Value = Format(.DataBodyRange(I, 9), "hh:mm")
        Me.T_bx_Commentaire = .DataBodyRange(I, 11)
            
        'on rend tous les checkbox disable et invisible
        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 = False ' (Ctrl.Value = "")
                    Me.Frame2.Controls("Chk_" & Nom).Enabled = False '(Ctrl.Value = "")
                    Me.Frame2.Controls("Chk_" & Nom).Visible = False '(Ctrl.Value = "")
                End If
            End If
        Next Ctrl
    End With

    Select Case LastPointé
        Case "Tbx_FinSoir"
            'tout est pointé==> on garde tout masqué et disable
        Case "Tbx_DebSoir"
            Me.Tbx_FinSoir.Enabled = True
            
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_FinSoir.Visible = True
        
        Case "Tbx_FinAPM"
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            
        Case "Tbx_DebAPM"
             Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
            
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
    
    
        Case "Tbx_FinMat"
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
            Me.Tbx_DebAPM.Enabled = True
            
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_DebAPM.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
            Me.Chk_DebAPM.Visible = True
        
        Case "Tbx_DebMat"
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
            Me.Tbx_DebAPM.Enabled = True
            Me.Tbx_FinMat.Enabled = True
            
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_DebAPM.Enabled = True
            Me.Chk_FinMat.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
            Me.Chk_DebAPM.Visible = True
            Me.Chk_FinMat.Visible = True
            
        Case Else
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
            Me.Tbx_DebAPM.Enabled = True
            Me.Tbx_FinMat.Enabled = True
            Me.Tbx_DebMat.Enabled = True
            
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_DebAPM.Enabled = True
            Me.Chk_FinMat.Enabled = True
            Me.Chk_DebMat.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
            Me.Chk_DebAPM.Visible = True
            Me.Chk_FinMat.Visible = True
            Me.Chk_DebMat.Visible = True
    End Select
    CalculerTotalJournée
End Sub
 

NONO14

XLDnaute Occasionnel
Ca donnerait ca

une nouvelle fonction à mettre dans le module du formulaire (avec le reste)
VB:
Function LastPointé() As String 'cette fonction retourne le nom du dernier textbox pointé
     With Me
        If .Tbx_FinSoir <> "" Then LastPointé = .Tbx_FinSoir.Name: Exit Function
        If .Tbx_DebSoir <> "" Then LastPointé = .Tbx_DebSoir.Name: Exit Function
       
        If .Tbx_FinAPM <> "" Then LastPointé = .Tbx_FinAPM.Name: Exit Function
        If .Tbx_DebAPM <> "" Then LastPointé = .Tbx_DebAPM.Name: Exit Function
       
        If .Tbx_FinMat <> "" Then LastPointé = .Tbx_FinMat.Name: Exit Function
        If .Tbx_DebMat <> "" Then LastPointé = .Tbx_DebMat.Name: Exit Function
     End With
End Function

et une nouveau code pour le textcode_change
peut etre plus long en terme de ligne de code, mais plus lisible..?
Code:
Private Sub TextCode_Change()
Dim Ctrl As Control
Dim Ctrl2 As Control
Dim Trouvé As Boolean
 
    Me.TextCode.Text = UCase(Me.TextCode)
 
    If Not EnableEvents Then Exit Sub
    'on cherche le nom associé au code dans la TS "t_Noms"
    With Sheets("Liste agents").ListObjects("t_Noms")
        Set Trouve = .ListColumns(1).Range.Find(Me.TextCode, lookat:=xlWhole)
        If Not Trouve Is Nothing Then
            Me.T_bx_Noms = Trouve.Offset(0, 1)
        Else
            Me.T_bx_Noms = ""
        End If
    End With
       
    'on cherche dans la TS t_Saisie la ligne qui correspond au code ET à la date du jour
    With Sheets("Saisie").ListObjects("t_Saisie")
        Trouvé = False
        For I = 1 To .ListRows.Count
            If .ListColumns("Code agent").DataBodyRange(I) = Me.TextCode And .ListColumns("Date").DataBodyRange(I) = Me.T_bx_DateJour Then
                lig = I
                Trouvé = True
                Exit For
            End If
        Next I
           
        If Not Trouvé Then Exit Sub 'pas de ligne correspondante ==> l'employé n'a jamais rien saisi pour cette journée
           
        'on charge les horaires déjà saisies pour la date du jour
        Me.T_bx_Noms = .DataBodyRange(I, 2)
        Me.Tbx_DebMat.Value = Format(.DataBodyRange(I, 4), "hh:mm")
        Me.Tbx_FinMat.Value = Format(.DataBodyRange(I, 5), "hh:mm")
        Me.Tbx_DebAPM.Value = Format(.DataBodyRange(I, 6), "hh:mm")
        Me.Tbx_FinAPM.Value = Format(.DataBodyRange(I, 7), "hh:mm")
        Me.Tbx_DebSoir.Value = Format(.DataBodyRange(I, 8), "hh:mm")
        Me.Tbx_FinSoir.Value = Format(.DataBodyRange(I, 9), "hh:mm")
        Me.T_bx_Commentaire = .DataBodyRange(I, 11)
           
        'on rend tous les checkbox disable et invisible
        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 = False ' (Ctrl.Value = "")
                    Me.Frame2.Controls("Chk_" & Nom).Enabled = False '(Ctrl.Value = "")
                    Me.Frame2.Controls("Chk_" & Nom).Visible = False '(Ctrl.Value = "")
                End If
            End If
        Next Ctrl
    End With

    Select Case LastPointé
        Case "Tbx_FinSoir"
            'tout est pointé==> on garde tout masqué et disable
        Case "Tbx_DebSoir"
            Me.Tbx_FinSoir.Enabled = True
           
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_FinSoir.Visible = True
       
        Case "Tbx_FinAPM"
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
           
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
           
        Case "Tbx_DebAPM"
             Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
           
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
   
   
        Case "Tbx_FinMat"
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
            Me.Tbx_DebAPM.Enabled = True
           
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_DebAPM.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
            Me.Chk_DebAPM.Visible = True
       
        Case "Tbx_DebMat"
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
            Me.Tbx_DebAPM.Enabled = True
            Me.Tbx_FinMat.Enabled = True
           
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_DebAPM.Enabled = True
            Me.Chk_FinMat.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
            Me.Chk_DebAPM.Visible = True
            Me.Chk_FinMat.Visible = True
           
        Case Else
            Me.Tbx_FinSoir.Enabled = True
            Me.Tbx_DebSoir.Enabled = True
            Me.Tbx_FinAPM.Enabled = True
            Me.Tbx_DebAPM.Enabled = True
            Me.Tbx_FinMat.Enabled = True
            Me.Tbx_DebMat.Enabled = True
           
            Me.Chk_FinSoir.Enabled = True
            Me.Chk_DebSoir.Enabled = True
            Me.ChK_FinAPM.Enabled = True
            Me.Chk_DebAPM.Enabled = True
            Me.Chk_FinMat.Enabled = True
            Me.Chk_DebMat.Enabled = True
            Me.Chk_FinSoir.Visible = True
            Me.Chk_DebSoir.Visible = True
            Me.ChK_FinAPM.Visible = True
            Me.Chk_DebAPM.Visible = True
            Me.Chk_FinMat.Visible = True
            Me.Chk_DebMat.Visible = True
    End Select
    CalculerTotalJournée
End Sub
Merci beaucoup, ça fait ce que je souhaitais.
Je n'aurai jamais réussi à faire ça sans ton aide.
 

NONO14

XLDnaute Occasionnel
dans le code du bouton valider, il faut aussi remettre la date du jour
Ok, sur le même principe que le bouton "Annuler" ?
Sinon, dans le code TextCode_Change, serait-il possible de rendre inactif le bouton"Valider" si il n'y a plus de possibilités de pointage et mettre un message dans le Label "Plus de pointages possibles".
Si c'est trop compliqué, ce n'est pas grave.
Encore mille mercis
 

vgendron

XLDnaute Barbatruc
Ok, sur le même principe que le bouton "Annuler" ?
Sinon, dans le code TextCode_Change, serait-il possible de rendre inactif le bouton"Valider" si il n'y a plus de possibilités de pointage et mettre un message dans le Label "Plus de pointages possibles".
Si c'est trop compliqué, ce n'est pas grave.
Encore mille mercis
tu peux mettre ca dans le premier case, quand tout est pointé
 

vgendron

XLDnaute Barbatruc
regarde la PJ
j'ai amélioré le code en le raccourcissant

1) je déclare en public un array "ListTbx"
2) je charge cet array avec la liste des 6 Tbx de pointage: DebMat, FinMat....
3) j'ai modifié la fonction LastPointage: avec juste une boucle
4) j'ai modifie le code du textCode_change
au lieu du très long select case, il n'y a plus qu'une boucle

et j'ai ajouté la gestion du bouton "Valider" et du message si plus de pointage à faire
 

Pièces jointes

  • PointHeure9.xlsm
    657.4 KB · Affichages: 1

NONO14

XLDnaute Occasionnel
regarde la PJ
j'ai amélioré le code en le raccourcissant

1) je déclare en public un array "ListTbx"
2) je charge cet array avec la liste des 6 Tbx de pointage: DebMat, FinMat....
3) j'ai modifié la fonction LastPointage: avec juste une boucle
4) j'ai modifie le code du textCode_change
au lieu du très long select case, il n'y a plus qu'une boucle

et j'ai ajouté la gestion du bouton "Valider" et du message si plus de pointage à faire
Waouh ! C'est super cool.
Je suis scotché de voir comment tu as pu réduire le code, chapeau bas Monsieur...👏
 

Discussions similaires

Réponses
9
Affichages
344
Réponses
5
Affichages
370
Réponses
3
Affichages
161

Statistiques des forums

Discussions
313 918
Messages
2 103 569
Membres
108 721
dernier inscrit
YoannG