Calcul sur valeur/date

bonjour

je reviens vers vous après le gros coup de main de thebenoit

je bloque encore sur la finalisation:

je vous met un exemple

c'est pour gérer de la vente de ticket de cinéma, avec des délais pour pouvoir en reprendre

j'ai rajouté 2 champs: nombre et date d'achat

1er point:

si le nombre est égal à 1, on rajoute 30 à la date d'achat

si le nombre est 2, on rajoute 60 (en gros nombre*30 jours à la date)

par défaut la date d'achat est celle du jour

la nouvelle date (date d'achat +30/60/...) devient la nouvelle date de reprise lors de la mise à jour

2éme point:

comparaison entre la date du jour et la date de reprise, si la date de reprise est supérieure à la date du jour, alors la date de reprise devient celle du jour pour le calcul si dessus

22exemple.xlsm (61.88 Ko)

Si la date de reprise est supérieure à la date du jour.

Ne faut-il pas bloquer l'achat dans ce cas présent ?

Sinon pourquoi indiquer une date minimale de reprise si nous pouvons en acheter avant ?

en fait c'est un dialogue avec le client, on le préviens qu'en théorie il a pas le droit sauf si on repousse sa date

Voir le fichier joint.

21exemple.xlsm (58.19 Ko)

petite question afin que je comprenne

dans le code, le with Me, le Me définit quoi?

Le formulaire actuel.

ok

j'essaie un code comme cela

Private Sub txtNb_Change()

With Me

If IsNumeric(.txtNb.Value) And .txtNb.Value > 0 Then

If .txtNb.Value = 1 Then

.txtDDA.Value = DateAdd("d", 30 * .txtNb.Value, .txtDA.Value)

If .txtNb.Value = 2 Then

.txtDDA.Value = DateAdd("d", 30 * .txtNb.Value, .txtDA.Value)

Else: MsgBox "Les valeurs doivent être de 1 ou 2"

End If

End With

End Sub

pour limiter les valeurs a 1 ou 2 et msgbox autrement mais cela ne fonctionne pas

une idée?

Une solution plus agréable à utiliser : le spinbutton.

17exemple.xlsm (58.83 Ko)

Bonsoir,

Le spinbutton est une bonne idée car faire une textebox n'est pas ta solution (ici tu ne veux pas que l'utilisateur détermine une valeur mais qu'il choisisse entre deux choix, c'est plutôt à toi de lui proposer des choix.

Sinon ta formule fonctionne chez moi, il manque juste un else dans ton code après le premier IF

Par contre je modifierais un peu le code pour mettre un message si tu n’as pas 1 ou 2 et effacer ce que l’utilisateur vient d’entrer, c'est généralement le mieux, tu préviens que ce n'est pas la valeur attendu et donc tu l'effaces

Aussi, si on n'entre pas un 1 ou un 2, remet à 0 la date de reprise minimum car pour le moment cela garder en mémoire la dernière valeur, si tu mets un 1 puis un 5, même avec 5 tu as la date +30jour de visible et l’utilisateur ne comprendra pas en général le message d'erreur si toutes les cases sont remplies

Enfin, il y a deux écoles je dirais pour le bouton de validation/mise à jour dans un userform:

1. Il faut tester quand on clique si toute les conditions sont réunis, par exemple ici il faudrait vérifier que la textbox contient un 1 ou 2, que tu as bien un nom, un prénom etc avant de lancer tes lignes de codes et si c'est pas remplies un msgbox "remplissez toute les cases avant de valider" ou "il manque le numéro de carte" etc

2. Mettre en visible = false de base ton bouton valider/mise à jour et sur chaque textbox et case à remplir une fonction de check: si tout est bien remplies, alors le bouton passe en visible sinon il passe en non visible. Je préfère ce genre d'aspect mais c'est un choix perso ^^

Dans le même cas, pour les textbox concernant les dates n'est pas vraiment l'utilisation optimale, pour afficher des informations c'est plutôt un Label, pas d’intérêt d'avoir une interaction sur les dates non?

Par contre cela donne un effet sympa par rapport à un label, j'en utilise quand même, juste ne pas oublier de passer en Enabled =false pour éviter que l'on puisse changer ce qu'il y a dans la textbox car pour le moment on peut y écrire "toto" dedans et les macros dernière pour calculer les dates ne vont pas apprécier du texte

Du coup cela donnerait:

With Me
    If IsNumeric(.txtNb.Value) Then
        If .txtNb.Value = 1 Then
           .txtDDA.Value = DateAdd("d", 30 * .txtNb.Value, .txtDA.Value)
        Else
            If .txtNb.Value = 2 Then
                .txtDDA.Value = DateAdd("d", 30 * .txtNb.Value, .txtDA.Value)
            Else
                MsgBox "Les valeurs doivent être de 1 ou 2"
                .txtNb.Value = ""
                .txtDDA.Value = ""
            End If
        End If
    Else
        .txtDDA.Value = ""
    End If
End With

Voir même, une msgbox est un peu trop intrusif et trop « embêtant »car il faut cliquer sur le ok et tout, personnellement ça m’énerve plus qu’autre chose

On pourrait voir le code suivant:

With Me
    If IsNumeric(.txtNb.Value) Then
        If .txtNb.Value = 1 Then
           .txtDDA.Value = DateAdd("d", 30 * .txtNb.Value, .txtDA.Value)
        Else
            If .txtNb.Value = 2 Then
                .txtDDA.Value = DateAdd("d", 30 * .txtNb.Value, .txtDA.Value)
            Else
                .txtNb.Value = ""
                .txtDDA.Value = ""
            End If
        End If
    Else
        .txtDDA.Value = ""
    End If

End With

Et je rajouterais un Label explicatif en dessous de la textbox « Vous ne pouvez choisir que 1 ou 2 tickets»

Et vraiment si c’était moi, vu que cela accepte que les valeurs 1 ou 2… une textbox n’a rien à faire ici pour les valeurs sont pré-définis et non pas personnalisable.

Soit tu fais une listbox et tu entres 1 et 2 en valeur (modifiable facilement dans l'avenir) ou juste deux checkbox (1 et 2) avec l’une des deux déjà mise à True de base.

D’une part l’utilisateur voit tout de suite ses choix, il ne rentre pas de valeur lui-même donc pas de message d’erreur ou de try again, tu maitrises les valeurs donc le choix est plus rapide et en mettant déjà une valeur à True… tu as 50% de chance de tomber sur la valeur que la personne veut donc elle valide sans rien faire ce que tu proposes.

Comme thebenoit par contre pour l’histoire de date, cela me semble un peu fausser ton histoire, j’aurais fait l’inverse ou bloquer aussi l’achat

Et si on se reconnecte 31 jours apres ? que la date de reprise est inférieur à celle du jour ? on repars avec la date du jour ? la date de reprise sert complètement à rien en effet, il faut en parler avec les commerciaux lol ce n’est pas un soucis de programmation ^^

ECG

bonjour

merci pour vos réponses

alors je reviens sur le dossier

j'ai imprimé les codes afin de mieux y réflechier et probablement revenir avec mon lot de questions

j'opte pour les cases à cocher, car ainsi cela permet une saisie plus rapide avec lechoix 1 pré-sélectionné réussi à le faire seul comme un grand )

le choix pour les dates de reprise est simple: nous n'avons pas de but commercial, nous sommes une sous commission de CE donc but non lucratif.

Et il faut permettre aussi de pouvoir vendre avant la date limite car celle ci peut être de quelques jours

on avait une base access pour gérer tout cela mais elle est devenue trop lourde/lente et incompatible sur les changements de versions d'access donc je tente un passage sous excel

Le temps que je creuse tout cela, il y a t'il un moyen où par défaut le curseur de saisie se place dans la case cbCarte ? j'ai essayé avec des enabled ou activated mais ne fonctionne pas

Bonjour Benoit.

Bonjour ECG.

La solution par checkbox est plutôt à envisager en optionbutton, comme ça tu es certain qu'un seul choix est appliqué.

Pour ton combobox insère ce code ci :

Private Sub UserForm_Activate()
Me.cbCarte.DropDown
Me.cbCarte.SetFocus
End Sub

Ah puré de bordel ! et moi qui ai fait un formulaire au boulot avec que des checkboks et une fonction tout désactiver tous les autres justement quand on clique sur un alors que des optionbutton c'est automatiquement fait

*PAN*

Merci pour l'info je tacherais de m'en souvenir ^^

Juste pour rappel en plus du DropDown et SetFocus, dans les controles sur un formulaire dans les propriétés il y a le TabIndex, Celui qui a le numéro 0 est le premier actif dans l'userform et si on fait une tabulation au clavier, cela va sur le 2 etc etc.

Cela permet si l'utilisateur n'a pas de souris dans un atelier par exemple de choisir la navigation entre les textbox ou autre, par exemple ici tu peux rajouter en plus du code de thebenoit

ta Cb = TabIndex 0, bouton de validation = TaBIndex 1, du coup avec le vba il arrive sur la combobox ouverte, il choisi son numéro, fait une tabulation et peut faire entrer au clavier direct pour valider le choix .... cela peut servir des fois

ECG

bon alors j'ai essayé de creuser ce que vous m'avez dit et j'ai partiellement réussi

je suis juste passer par une case à cocher en cas d'achat de 2, par défaut c'est 1

par contre je rencontre encore une difficulté et là je trouve pas la solution:

si la date (txtdda) est supérieure à la date du jour, alors cela doit s'incrémenter à la txtdda

si la date txtdda est inférieure, alors on incrémente la date du jour (ou de saisie)

j'ai essayé un bout de code sous la fonction de clic sur mise à jour mais cela ne fonctionne pas

une idée?

d'avance merci

12exemple.xlsm (60.62 Ko)

Bonjour Benoit.

Une fois que nous commençons à manipuler des dates avec comparaison, pour éviter les soucis de format je préfère utiliser le DTPicker.

Je te propose la solution en fichier joint.

Ta logique était bonne mais le soucis vient des TextBox, je ne me suis pas penché sur le problème.

18exemple.xlsm (58.71 Ko)

merci beaucoup à toi et ExcelCoreGame (pour la peine je vais vous citer si cela vous gêne pas NA )

en effet en passant via les DTP cela semble plus logique

je pense qu'il fallait que je fasse de la mise en forme sur mes textebox et bilan cela l'envoyait dans les choux

impec

je vais lui rentrer dedans un peu au fichier mais cela me semble parfaitement fonctionner selon les besoins que j'ai

encore merci à vous

Rechercher des sujets similaires à "calcul valeur date"