Calcul de dates dans un USF
#1
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 12-04-2012 16h57
Bonjour à tous,
J'aimerais effectuer des calculs sur des dates en passant par un USF.
Tout est expliqué dans le fichier-joint et l'USF est déjà crée.

Merci de bien vouloir commenter les différents codes car je pourrais les adapter pour d'autres calculs.
Merci d'avance et bonne journée à toutes et à tous.

PS :  Merci Didier pour toutes tes contributions qui nous facilitent la vie tous les jours.



Pièce jointe:
xls Calcul dates via USF.xls   [ Taille: 25.50 Ko - Téléchargements: 500 ]
Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#2
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 13-04-2012 19h02
Bonjour criscris11, le Forum,

Tu trouveras en pièce jointe une tentative de réponse à ta demande.
J'ai essayé de commenter le code VBA au mieux...

Pour info, j'ai d'abord dû apporter quelques légères modifications à ton Userform :
  • En premier lieu, j'ai renommer tous les contrôles utiles pour qu'ils soient facilement repérable dans le code (c'est la première chose à faire si tu veux pouvoir analyser correctement un code VBA, le comprendre, voire le maintenir).
  • Ensuite, j'ai supprimé les Frames que tu avais insérés et les ai remplacés par de simples labels transparents avec bordure en arrière plan : le visuel est quasi similaire. Pourquoi ? Parce que les Frames entrainent un bug VBA au niveau des évènements "Exit" des contrôles Textbox et j'en avais besoin ici
  • Puis, j'ai aussi supprimé les Textbox que tu avais utilisés pour afficher la Durée et la date calculée DRDS pour les échanger là encore par des contrôles Label. J'applique un principe de base : les Textbox sont faits pour permettre à l'utilisateur de saisir quelque chose. En l'occurence, il s'agit là de 2 éléments exclusivement calculés et l'utilisateur n'a pas à intervenir sur ces champs. Des contrôles Labels semblent donc plus indiqués pour ce faire. On peut même leur donner le look de Textbox si on le souhaite, mais je pense qu'il est préférable d'orienter l'utilisateur et lui indiquer visuellement là, où il peut saisir et là, où il ne peut pas.
  • Au final, j'ai attribué les propriétés suivantes aux 3 TextBox restantes (pour les Dates) :
    • Maxlength = 8
    • AutoTab = True

J'ai utilisé le code VBA suivant dans le module de code du Userform :

Option Explicit
'-----------------------------------------------------------------------
' Auteur    : myDearFriend! - www.mdf-xlpages.com
' Date      : 13/04/2012
'-----------------------------------------------------------------------

' ======================================================
' CONTROLE DE LA SAISIE UTILISATEUR
' ======================================================
Private Sub txtDu_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Sub txtAu_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Sub txtReeng_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Function KeyNumOnly(ByVal K As Integer) As Integer
    'Autorise uniquement les touches numériques de 0 à 9 (renvoyées par Keypress)
    If K < 48 Or K > 57 Then K = 0
    KeyNumOnly = K
End Function


' ======================================================
' FORMAT et CALCUL A LA SORTIE DE CHAQUE TEXTBOX
' ======================================================
Private Sub txtDu_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(txtDu.Text)
    If T <> "" Then
        txtDu.Text = T
        CalculValid     'calcul et autorisation de validation
    Else
        Cancel = True   'le focus reste sur le textbox pour correction
    End If
End Sub

Private Sub txtAu_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(txtAu.Text)
    If T <> "" Then
        txtAu.Text = T
        CalculValid     'calcul et autorisation de validation
    Else
        Cancel = True   'le focus reste sur le textbox pour correction
    End If
End Sub

Private Sub txtReeng_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(txtReeng.Text)
    If T <> "" Then
        txtReeng.Text = T
        CalculValid     'calcul et autorisation de validation
    Else
        Cancel = True   'le focus reste sur le textbox pour correction
    End If
End Sub

Private Function FormatDate(D As String) As String
    'insèrer les /
    If Len(D) = 8 Then
        D = Left(D, 2) & "/" & Mid(D, 3, 2) & "/" & Mid(D, 5)
        If IsDate(D) Then FormatDate = D
    ElseIf Len(D) = 10 And IsDate(D) Then
        FormatDate = D
    End If
End Function

Private Sub CalculValid()
Dim D1 As Date, D2 As Date, D3 As Date, D_Drds As Date
Dim cptMtot As Integer, cptA As Integer, cptM As Integer, cptJ As Integer
   
    'Les 3 dates sont-elles présentes et valables ?
    On Error Resume Next
    D1 = CDate(txtDu.Text)
    D2 = CDate(txtAu.Text)
    D3 = CDate(txtReeng.Text)
    On Error GoTo 0
   
    'Calcul durée
    If D1 <> 0 And D2 <> 0 Then
        cptMtot = DateDiff("m", D1, D2 + 1)     'Combien de mois entre les 2 dates ?
        cptA = cptMtot \ 12                         'déduction de l'écart en année
        cptM = cptMtot - cptA * 12                  'déduction de l'écart restant en mois
        cptJ = D2 + 1 - DateAdd("m", cptMtot, D1)   'déduction de l'écart restant en jours
        lblDuree.Caption = cptA & " An" & IIf(cptA > 1, "s, ", ", ") & cptM & " Mois et " & cptJ & " Jour" & IIf(cptJ > 1, "s", "")
        ' Calcul date réengagement
        If D3 <> 0 Then
            D_Drds = DateAdd("yyyy", -cptA, D3)  '- années
            D_Drds = DateAdd("m", -cptM, D_Drds) '- mois
            D_Drds = DateAdd("y", -cptJ, D_Drds) '- jours
            lblDRDS.Caption = D_Drds
        End If
    End If
   
    ' Rendre bouton Valider accessible ?
    btnValider.Enabled = D1 <> 0 And D2 <> 0 And D3 <> 0
End Sub


' ======================================================
' BOUTONS DE COMMANDE
' ======================================================
Private Sub btnAnnuler_Click()
    Unload Me
End Sub

Private Sub btnValider_Click()
    'Mettre à jour la feuille de calcul
    'DateValue() est indispensable pour de "vraies" dates dans les cellules
    Range("F3").Value = DateValue(txtDu.Value)
    Range("H3").Value = DateValue(txtAu.Value)
    Range("E8").Value = DateValue(txtReeng.Value)
    Range("F5").Value = lblDuree.Caption
    Range("H8").Value = DateValue(lblDRDS.Caption)
    Unload Me
End Sub

J'ai essayé de répondre au plus près de ta demande et des contraintes exposées : la saisie est limitées et la cohérence des dates est vérifiée (format). Je n'ai toutefois pas fait de contrôle pour m'assurer que la date "DU" est bien inférieure à la date "AU".

Cela dit, si tu préfères éviter toute cette usine pour permettre une saisie "simplifiée" et en vérifier la cohérence (format des dates, dates reconnues ou non, etc...), je ne puis que t'inviter à voir du côté du mDF XLcalendar (1) qui joue très bien son rôle pour les TextBox de Userform, permettant d'une part, une saisie conviviale pour l'utilisateur et d'autre part, un code VBA nettement plus light (il n'y a plus lieu de vérifier le format des dates insérées). Cela nécessite toutefois que ce complément mDF XLcalendar soit effectivement installé sur chaque machine devant faire tourner ton classeur...
(voir cette FAQ. Pour info, un tutoriel complet est en cours d'écriture pour faire suite à la nouvelle version de cet utilitaire).

En espérant t'avoir aidé.

Cordialement,

(1) Oui, un peu de Pub ! Faut bien que quelqu'un la fasse, hein !?

Pièce jointe:
zip mDF_CalculDatesUSF.zip   [ Taille: 17.35 Ko - Téléchargements: 535 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#3
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 15-04-2012 12h14
Merci Didier pour ta contribution ainsi que tes explications.
Pour tout te dire, j'utilise sur mon poste de travail XLcalendar 3.0 mais il alors il va falloir que tu m'expliques comment allier la .xla avec les TextBox des USF en attendant le tutoriel complet.

Sinon, peut-être une autre piste mais je te laisse le soin de regarder (fichier de developpez.com).

Bon dimanche et merci encore.

PS : peux-tu me dire comment via le bouton "Validez" saisir uniquement la DRDS trouvée dans la cellule active qui aura été sélectionnée de lancer l'USF ? Merci.
Pièce jointe:
zip DVP DemoDateBox.zip   [ Taille: 44.33 Ko - Téléchargements: 522 ]
Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#4
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 15-04-2012 15h46
Bonjour criscris11, le Forum,

En attendant un tutoriel complet pour utiliser toutes les fonctionnalités du mDF XLcalendar version 3 dans les TextBox, il existe la FAQ suivante : « [mDF] Peut-on utiliser le mDF XLcalendar pour saisir des dates dans un TextBox ? ». Elle te donne tout ce qu'il faut savoir pour mettre en pratique l'utilitaire pour date dans ton Userform (ensuite, si tu veux pouvoir jouer sur les spécificités de la version 3 que sont les thèmes couleurs et la transparence, je te donnerai les arguments correspondants).

Par ailleurs et concernant ton PS, je n'ai pas compris ta demande. S'il sagit uniquement de récupérer la date DRDS calculée du USF, un simple coup d'oeil sur la procédure btnValider_Click() me semble suffisant pour comprendre :
Private Sub btnValider_Click()
    'Mettre à jour la feuille de calcul
    'DateValue() est indispensable pour de "vraies" dates dans les cellules
    Range("F3").Value = DateValue(txtDu.Value)
    Range("H3").Value = DateValue(txtAu.Value)
    Range("E8").Value = DateValue(txtReeng.Value)
    Range("F5").Value = lblDuree.Caption
    Range("H8").Value = DateValue(lblDRDS.Caption)
    Unload Me
End Sub

Cordialement,

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#5
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 15-04-2012 16h54
Re,
Merci pour le lien en attendant et au besoin je reviendrai poster.
Concernant mon PS, j'ai modifié ton code ainsi :

Private Sub btnValider_Click()
    'Mettre à jour la feuille de calcul
    'DateValue() est indispensable pour de "vraies" dates dans les cellules
    ActiveCell.Value = DateValue(lblDRDS.Caption)
    Unload Me
End Sub

afin de ne remplir uniquement que la DRDS (valeur trouvée via l'USF) dans la cellule active de la feuille car dans mon fichier tout le monde n'est pas forcément concerné par une DRDS et que les dates servant au calcul ne figurent pas dans le fichier.
Est-ce que le fichier envoyé est exploitable pour ma demande (cf. format du 4. Résultat) ?

Encore merci pour ta patience et la transmission de ton savoir.

Cordialement.
Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#6
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 15-04-2012 17h45
Re criscris11 ,

Citation :
criscris11 a écrit :
Est-ce que le fichier envoyé est exploitable pour ma demande (cf. format du 4. Résultat) ?

Dans ton post précédent, tu m'as laissé le soin de prendre connaissance de ton fichier joint, mais sauf erreur, je n'ai pas eu l'impression qu'il y avait une demande à la clé...

Par ailleurs, si je t'ai proposé l'utilisation du mDF XLcalendar ce n'est pas par pur hasard, ni pour la seule envie d'en faire la pub... A vrai dire, je sentais bien venir une suite à ta question d'origine fort simple
Dès ma première réponse, je parlais d'éviter toute usine VBA pour une saisie "simplifiée" et en vérifier la cohérence... Si le fichier démo que tu joins est visiblement complet et de très bonne facture (bravo à Tirex28 de chez DVP !), il n'en demeure pas moins qu'il est un très bel exemple de ce dont je parle ci-dessus. Aussi, si tu veux en tirer parti, je te laisse volontiers la main ou voir avec son auteur...

Cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#7
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 15-04-2012 18h07
Didier,
Merci pour ta franchise et non pas pour te faire de la pub et vu que j'utilise déjà XLcalendar, je vais me contenter de ta version pour l'utilisation dans mon fichier.

Alors dis-moi si je me trompe si j'utilise ce code dans les TextBox où les dates sont à saisir par l'utilisateur :

au lieu de :

Private Sub txtDu_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(txtDu.Text)
    If T <> "" Then
        txtDu.Text = T
        CalculValid     'calcul et autorisation de validation
    Else
        Cancel = True   'le focus reste sur le textbox pour correction
    End If
End Sub
je dois modifier comme tel :

Private Sub txtDu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = True
    mDFXLcalShow CalCtrl:=
txtDu
    CalculValid
End Sub

Merci de bien vouloir me corriger le cas échéant et bonne soirée.
Cordialement.



Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#8
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 15-04-2012 20h32
Re,

Oui, je pense que tu as bien compris le principe.

Les 2 conditions sont :
  1. Le mDF XLcalendar doit être installé sur la machine utilisateur.
  2. Une référence à ce complément doit être faite dans le projet VBA.

Ci-joint le fichier de départ modifié pour utiliser le mDF XLcalendar (si ce complément est bien présent sur la machine) :

J'ai remplacé les lignes de code suivantes :
Private Sub txtDu_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Sub txtAu_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Sub txtReeng_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = KeyNumOnly(KeyAscii)
End Sub

Private Function KeyNumOnly(ByVal K As Integer) As Integer
    'Autorise uniquement les touches numériques de 0 à 9 (renvoyées par Keypress)
    If K < 48 Or K > 57 Then K = 0
    KeyNumOnly = K
End Function

Private Sub txtDu_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(txtDu.Text)
    If T <> "" Then
        txtDu.Text = T
        CalculValid     'calcul et autorisation de validation
    Else
        Cancel = True   'le focus reste sur le textbox pour correction
    End If
End Sub

Private Sub txtAu_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(txtAu.Text)
    If T <> "" Then
        txtAu.Text = T
        CalculValid     'calcul et autorisation de validation
    Else
        Cancel = True   'le focus reste sur le textbox pour correction
    End If
End Sub

Private Sub txtReeng_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim T As String
    T = FormatDate(txtReeng.Text)
    If T <> "" Then
        txtReeng.Text = T
        CalculValid     'calcul et autorisation de validation
    Else
        Cancel = True   'le focus reste sur le textbox pour correction
    End If
End Sub

Private Function FormatDate(D As String) As String
    'insèrer les /
    If Len(D) = 8 Then
        D = Left(D, 2) & "/" & Mid(D, 3, 2) & "/" & Mid(D, 5)
        If IsDate(D) Then FormatDate = D
    ElseIf Len(D) = 10 And IsDate(D) Then
        FormatDate = D
    End If
End Function

... par celles-ci :
Private Sub txtAu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = True
    mDFXLcalShow CalCtrl:=txtAu
    CalculValid
End Sub

Private Sub txtDu_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = True
    mDFXLcalShow CalCtrl:=txtDu
    CalculValid
End Sub

Private Sub txtReeng_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = True
    mDFXLcalShow CalCtrl:=txtReeng
    CalculValid
End Sub
Et pour sécuriser l'ensemble, j'ai appliqué la propriété Locked = True aux TextBox pour empêcher une saisie manuelle des dates (qui, du coup, ne serait plus contrôlée).

Si tu penses avoir reçu la réponse qui te convient, merci de mettre en pratique ce qui est inscrit au bas de ma signature.

Cordialement,

Pièce jointe:
zip mDF_CalculDatesUSF 2.zip   [ Taille: 17.67 Ko - Téléchargements: 492 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Calcul de dates dans un USF
#9
Aspirant XLPages

Inscription: 12/07/2008
De RENNES

Messages: 30

Système d'exploitation:
PC
Version Excel utilisée:
2003 FR
Posté le : 15-04-2012 20h48
Re,
Encore merci pour tout.
Je pense que ma demande est résolue donc c'est avec grand plaisir que j'ajoute la balise qui va bien.
Bonne soirée.
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes