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
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.
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.
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 WithVoir 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 WithEt 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
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 SubAh 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
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.
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