Inverser un masque de saisi

Bonjour,

Dans le fichier joint, on saisit 4 chiffres dans un textbox d'un userform; la saisie se fait de gauche vers la droite.

Comment modifier le code pour que la saisie se fasse de droite vers la gauche ?

(je n'ai pas réussi)

Et si on ne saisit pas tous les 4 chiffres, des 0 combleraient la différence... en plaçant le/les 0 à gauche.

La référence de ces 4 chiffres sera heures et minutes.

Merci à l'avance du travail de votre matière grise et de l'exercice de vos doigts.

ric

Bonjour,

ben tu fais ce que tu dis

tu mets le dernier caractère devant :

s = "1234"
s = Right(s, 1) & Left(s, Len(s) - 1)

Tu fais tes saisies en faisant le poirier ?

eric

Bonsoir, Salut Eric !

Je ne vois pas trop ce que tu veux faire... Il serait sans doute plus logique de saisir des nombres de la droite vers la gauche : unités - dizaines - centaines - millers... mais bon ! Quoi qu'il en soit de la façon de saisir, tout le monde, dans le monde les a dans le même sens.

S'agissant d'heures, c'est un peu différent, on est dans un système sexagésimal...

Je pense que tu te compliques : si tu as à saisir des heures et minutes, tu verrouilles ta TextBox, tu ajoutes 2 SpinButtons, 1 pour les heures, 1 pour les minutes, tu définis la valeur horaire dans une variable (heures/24+minutes/1440), tu affiches cette valeur en format horaire dans la TextBox, et tu renvoies la valeur de la variable lors de l'affectation.

Cordialement.

Bonjour,

Merci de vos réponses.

Parfois, on part sur le mauvais chemin et, malgré qu'ils mènent tous à Rome, le temps de s'y rendre peut être long.

ric

Bonjour eriiic, le forum,

sauf erreur de ma part, je crois que ric aurait voulu une saisie numérique comme sur les calculatrices.

exemple :

on veut saisir le nombre 123456,78 ➯ affichages successifs de droite à gauche, lors de la saisie

d'un chiffre en position des unités (le souligné représente cette position de saisie) :

0,00

1,00

12,00

123,00

1 234,00

12 345,00

123 456,00

ici, on tape le point décimal, donc pour la suite, c'est à droite de la virgule,

et de gauche à droite :

123 456,00

123 456,70

123 456,78

là où ça se complique, c'est quand, sur certaines calculatrices (pas toutes),

on peut déplacer le curseur à gauche de la position des unités :

on saisit donc un chiffre à cet emplacement, et ce sont uniquement les chiffres à gauche et celui sous le curseur qui sont décalés à gauche (pas ceux à droite) ; faut donc gérer cela, y compris la position du séparateur de milliers (ce qui est plutôt coton !).

je crois pas qu'il existe une propriété d'une TextBox pour gérer tout ça, mais peut-être que ça existe en macro complémentaire ?

dhany

Bonjour à tous,

Voici le résultat que je souhaitais ... taper 1, 2, 3 ou 4 chiffres pour avoir hh:mm ... commençant à droite vers la gauche.

J'ai ajouté ... si les minutes dépassent 60, une heure est ajoutée et les minutes restantes sont inscrites.

ric

Bonjour,

Ah c'est ça que tu voulais ?

L'essentiel du travail peut être fait en une ligne.

Après il n'y a plus qu'à traiter tes minutes > 60 et recoller les morceaux.

Dim noEvents As Boolean

Private Sub TextBox1_Change()
    Dim tmp
    If noEvents Then Exit Sub
    tmp = Split(Format(Replace(Textbox1, ":", "") / 100, "0.0#"), ".")
    tmp(0) = Format(CLng(tmp(0)) + Int(CLng(tmp(1)) / 60), "00")
    tmp(1) = Format(CLng(tmp(1)) Mod 60, "00")
    noEvents = True
    Textbox1 = Join(tmp, ":")
    noEvents = False
End Sub

Private Sub UserForm_Initialize()
    noEvents = True
    Textbox1.Text = "00:00"
    noEvents = False
End Sub

Private Sub Cmd_Fermer_Click()
    MsgBox Textbox1
    Unload Me 'ou me.hide mais pas End
End Sub

A tester plus largement que je ne l'ai fais...

J'ai supprimé ton End, c'est une fin trop brutale :

Lorsqu'elle est exécutée, l'instruction End réinitialise toutes les variables au niveau du module et toutes les variables locales statiques dans tous les modules. Pour conserver la valeur de ces variables, utilisez plutôt l'instruction Stop. Vous pourrez ainsi reprendre l'exécution tout en préservant la valeur des variables.

Note L'instruction End met immédiatement fin à l'exécution du code, sans appeler d'événement Unload, QueryUnload, ou Terminate, ou tout autre code Visual Basic. Le code que vous avez écrit dans les événements Unload, QueryUnload, et Terminate des feuilles et des modules de classe n'est pas exécuté. Les objets créés depuis les modules de classe sont détruits, les fichiers ouverts au moyen de l'instruction Open sont fermés et la mémoire occupée par le programme est vidée. Les références d'objet appartenant à d'autres programmes ne sont plus valides.

eric

Bonjour à tous

@eriiic ... Merci pour l'amélioration du code. Je reprends une formation commencée il y a déjà dix ans et ce n'est pas toujours facile. J'ai tendance à rester dans mes vieilles pantoufles.

ric

Ah ! Il s'agissait seulement de cadrage à droite... mais le premier chiffre tapé reste à gauche.

Ça peut effectivement se compliquer selon les dispositifs décrits par Dhany pour imiter certaines calculettes.

Ambiguïté en parlant de saisie de droite à gauche...

Mais il est vrai que les TextBox ne sont pas spécialement le support rêvé pour la saisie de dates et heures. Je les travaille sur le Forum car c'est ce qu'il y a de plus répandu, mais pour mon usage perso j'utilise en général une variable pour stocker la valeur et des SpinButtons pour la saisie, la TextBox ne servant que d'afficheur, ce qui permet d'éliminer tout contrôle de validité de la saisie, hormis la vérification qu'une saisie a ou non été faite lorsqu'on ne met pas d'heure par défaut considérée valide si elle n'est pas modifiée.

Même chose pour les dates, date par défaut qui est en général celle du jour, et variations possibles au moyen d'une ScrollBar, dans une fourchette prédéfinie...

Cordialement.

Bonjour à tous,

Bonjour,

Ah c'est ça que tu voulais ?

L'essentiel du travail peut être fait en une ligne.

Après il n'y a plus qu'à traiter tes minutes > 60 et recoller les morceaux.

eric

Désolé mais le code fourni boggue dès la saisie du premier chiffre.

L'erreur est sur la ligne :

tmp(0) = Format(CLng(tmp(0)) + Int(CLng(tmp(1)) / 60), "00")

Je joins le fichier avec ton code.

ric

Tu saisis quoi au juste ?

J'ai testé avec 45 puis avec 75 et pas d'erreur dans ces 2 cas.

Et quelle est l'erreur ?

Tu ne serais pas sur Mac des fois ? Il ne connait pas Split...

Dans ce cas il faut découper la chaine sur le ":" avec les fonctions classiques Left(), Mid() et Right()

Edit : non, tu aurais eu l'erreur au-dessus

eric

Bonjour,

Le même fichier que j'ai fourni dernièrement, ne tapant un chiffre, quel qu'il soit, j'ai l'erreur :

Erreur d'exécution '9':

L'indice n'appartient pas à la sélection.

L'erreur est toujours sur la ligne précitée.

Je suis sous Excel 2016.

ric

Rebonjour à tous,

Bon, finalement le code fonctionne bien si je change le . pour la , à la fin de la ligne précédente.

tmp = Split(Format(Replace(Textbox1, ":", "") / 100, "00.0#"), ",")

Je peux gérer cela en faisant détecté la chose.

Merci pour le code plus "moderne".

ric

Ah oui. Mon séparateur décimal est le point.

Tu pourrais mettre Application.International(xlDecimalSeparator).

eric

Bonjour,

C'était presque cela, j'ai mis : Application.DecimalSeparator

Mais je prends ta suggestion et change pour :

Application.International(xlDecimalSeparator)

Je présume que ta suggestion est bonne pour les multiples versions précédentes d'Excel.

ric

Ce n'est pas pareil :

Application.DecimalSeparator : séparateur décimal défini dans les options d'excel. Encore faut-il qu'il soit activé

Application.International(xlDecimalSeparator) :

Retourne TOUJOURS le séparateur décimal utilisé par excel sur les feuilles, en fonction de la valeur de Application.UseSystemSeparators (donc celui des options d'excel si activé, ou celui de Région et langue du panneau de config)

Bonjour,

Merci de la précision

ric

Rechercher des sujets similaires à "inverser masque saisi"