Calculatrice VBA [Résolu]

Messages postés
6
Date d'inscription
mardi 24 janvier 2006
Dernière intervention
13 février 2006
- 24 janv. 2006 à 15:57 - Dernière réponse :
Messages postés
169
Date d'inscription
mardi 15 juillet 2003
Dernière intervention
7 avril 2008
- 25 janv. 2006 à 10:24
voila, je dois réalisée une calculatrice sous vba est je galère. j'ai reussi à faire afficher les chiffres mais pour les opérateurs j'ai quelques soucis. En effet, si je veux faire 7+3 par exemple je clique sur 7 et lke 7 s'affiche dans ma textbox puis je clique sur + le plus s'affiche seul dans la textbox MAIS quand je clique sur 3 le "+" ne pars pas??????

programme pour opérateurs:
Private Sub plus_Click()
Dim nombre_saisi As String
nombre_saisi = "+"
TextBox1.Value = nombre_saisi
End Sub

programme pour nombres:

Private Sub sept_Click()
Dim nombre_saisi As String
nombre_saisi = TextBox1.Value
TextBox1.Value = nombre_saisi & 7
End Sub

merci de votre aide j'en ai vraiment besoin!!
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
1490
Date d'inscription
mercredi 5 février 2003
Dernière intervention
3 décembre 2007
- 24 janv. 2006 à 18:47
3
Merci
Ben c'est normal, tu concatène des chaines de caractères !!!

Note : évite de mettre des "_" dans les noms de tes variables et autres procédures!!! Tout comme il faut éviter les caractères spéciaux tel les accents. Contente-toi juste des lettres majuscules/minuscules et des chiffres.

Mais repronons ton code si tu le veux bien :

Private Sub btnPlus_Click() 'Pense donc à renomer tes boutons
Dim varNombreSaisi As String
varNombreSaisi = "+"
TextBox1.Value = varNombreSaisi 'Ici on efface l'ancien contenu de la TextBox pour le remplacer par "+". Or, à ce moment précis, il y a déjà quelque chose dedans !!!
End Sub

Private Sub btnSept_Click()
Dim varNombreSaisi As String
varNombreSaisi = TextBox1.Value 'Attention, ici tu récupères ce qu'il y a dans ta TextBox !!!
TextBox1.Value = varNombreSaisi & 7 'Et là, tu concatènes un carctère "7" avec l'ancien contenu. Normal donc que ton "+" reste!!!
End Sub

Comprends-tu ? 1er temps : Bouton 7 ; TextBox "" & "7"> "7"

2 ème temps : Bouton + ; TextBox = "+"
3 ème temps : Bouton 7 ; TextBox "+" & "7"> "+7"

Tout le problème est de savoir ce que tu veux à l'arrivée !!! Mais a mon avis, comme ça, t'es mal partie !!!

En plus, là tu n'obtiendra que des caractères et non des chiffres!!!

Il faut raisonner en étapes utilisateur dans le cas des calculatrices (note quand même que ce type de sources est récurrent sur VBFrance et que si tu te donnes la peinne de chercher un peu tu devrais trouver ton bonheur! Et ce, quitte à utiliser Google avec le mot-clef "vbfrance" !!!

1 ère étape : L'utilisateur rentre des chiffres dans le TextBox, soit via les boutons, soit directement dedans via le clavier.
2 ème étape : L'utilisateur choisit une opération. On doit donc conserver l'acienne valeur et réinitialiser l'affichage pour qu'il entre la seconde valeur. Sauf dans le cas de l'opération "=".
3 ème étape : idem que la première
4 ème étape : Là, soit l'utilisateur entre l'opération "=", soit il entre une nouvelle opération (en plus donc). Dans les deux cas, il faut exécuter le calcul demandé.

Déjà, pour la saisie directe dans le TextBox il faut utiliser la procédure événementielle _KeyUp et/ou _KeyPress afin de déterminer si l'utilisateur à bien saisi un caractère valide (0123456789+-*/=) et sinon, annuler la frappe. Sinon, tu peux toujours bloquer ton TextBox à la saisie! C'est plus simple pour les débutants.

Pour la saisie via les boutons 0 à 9, il n'y a pas de mystères en effet : la concaténation de caractères !

Private Sub btnSept_Click()
TextBox1.Value = TextBox1.Value & "7"
End Sub

Private Sub btnSix_Click()

TextBox1.Value = TextBox1.Value & "6"

End Sub

...



Donc, tout l'astuce de la calculatrice réside dans la gestion du résultat qu'il faut prévoir imédiatement dès le début!

En effet, il faut, dès la première étape, avoir une variable "résultat" mise à 0.
Tu dois déclarer cette variable comme globale afin de pouvoir l'utiliser dans toutes tes procédures événementielles (btnX_Click, ...). Pour se faire, il te suffit de la déclarer tout en haut de ton code ou alors, dans un "module de code" à ajouter à tes "modules de feuille" (click droit dans la liste, ajouter, ...).

Tout le reste se jouera dans les procédures des opérations :

'A mettre tout en haut donc
Public varResultat As Double 'Double par pure sécurité! Sinon, tu ne mets pas "As Double" comme ça le type de ta variable sera "Variant"!


Private Sub btnPlus_Click()
varResultat = varResultat + Val(TextBox1.Value)
TextBox1.Value = "0"
End Sub

Note que la fonction Val te permet de convertir automatiquement une chaine de caractère en nombre. Si la chaine n'est pas valide, elle renverra 0 je crois. Note que ici on a "+" car c'est le bouton "btnPlus" !!! Il suffit donc de changer le signe... tu auras compris!
Donc, ici, on ajoute au résultat l'ancien résultat additionné de la valeur contenu dans le textBox. Tu auras donc compris que ce type de syntaxe rend la prog fantastique! De plus, tu auras aussi remarqué que les deux systèmes (chiffres et opérations) sont nettement séparés! Il s'agit bien de deux systèmes qui ont bien deux buts différents! Le premier étant de concaténer du texte et le second étant de faire des calculs arithmétique !

Mais il reste encore 3 cas particulier... Le bouton "=" et les deux boutons "Annuler la frappe" et "Annuler le calcul" [C et CE sur nos calculettes pour Clear{all} et Clear Enter.

ClearAll annulant tout, il suffit d'effacer le TextBox et de réinitialisé la variable Résultat à 0. ClearEnter doit juste effacer le textBox (à "0", pas à "" attention !!!). La touche entrée elle, doit faire l'opération précédente :


Résultat 0 ; Entrée "12" ; Entrée = "+" ; Résultat = 0 + 12 = 12Résultat 12 ; Entrée "13" ; Entrée = "-" ; Résultat = 12 - 13 = -1 !!!

Comme tu dois t'en rendre compte, notre raisonnement est faux !!! Et donc, notre code précédent également! Ben wai, ce serait trop simple !

Bon, je vais m'arrêter là parce que ce n'est pas mon job de te donner la solution. Mais je vais quand même te mettre sur la piste...

Il faut mémoriser l'opération entrée lors de chaque opération et faire le calcul non pas de l'opération en cours mais de la précédente !!! hé hé

Allez, tu vas y arriver va, c'est pas si compliqué que ça!

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )

Merci ScSami 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Meilleure réponse
Messages postés
169
Date d'inscription
mardi 15 juillet 2003
Dernière intervention
7 avril 2008
- 25 janv. 2006 à 10:24
3
Merci
Salut,

pour t'aider dans la gestion des boutons de la caltos, tu peux utiliser des classes d'objet.

le principe est de créer une classe d'objet pour les boutons des chiffres (0 à 9) et une pour les opérateurs (+-*/= )

ces classes gerrons les évènements click des deux types de boutons. Tu n'a ainsi qu'à programmer que deux évènements click au lieu de 15.

A l'initialisation de la form, tu charges les boutons dans deux tableaux différents (1 pour chaque classe).

Voici un exemple pour une classe de bouton :

Module de classe : (appelons le BtnNumClass )

Public WithEvents ButtonNum As CommandButton ' gestion de l'évenement click pour l'objet ButtonNum de la classe BtnNumClass
'ButtonNum est l'objet commandButton de ta form sur lequel tu click

Private Sub ButtonNum_Click() 'Procédure de l'évènement click
Dim Msg As String

Msg = "Vous avez clické sur le boutton" & ButtonNum.Caption
MsgBox Msg, vbInformation, ButtonNum.Name
End Sub

Fin de la classe

Dans ta form :
Dim ButtonsNum() As New BtnNumClass

Private Sub UserForm_Initialize()
Dim ButtonCount As Integer 'compteur pour la dimension du tableau ButtonsNum()
Dim ctl As Control

' Création des objets BtnNum
ButtonCount = 0
For Each ctl In UserForm1.Controls 'pour chaque control de la form
If TypeName(ctl) = "CommandButton" Then 'si c'est un commandbutton
If ctl.Caption like (#) then 'si c'est un bouton de numero
ButtonCount = ButtonCount + 1 'on incrément le compteur
ReDim Preserve ButtonsNum(1 To ButtonCount)'on redimmensionne le tableau
Set ButtonsNum(ButtonCount).ButtonNum = ctl 'on défini le bouton comme membre de la classe
End If
End If
Next ctl
End Sub

Voilà, ça peut parraître un peu compliqué comme ça mais en fait, ça simplifie boucoup la gstiondes action des commandbuttons.

je t'ai juste mis le code pour gérer les évènements click sur un ensemble de commandbuttons.

Pour compléter ton projet, il faut comme le disait ScSami utiliser une variable publique pour gerer le résultat, créer la deuxième classe de bouton et gerer l'ajout des boutons d'opérateurs. Pour ça, inutile de tout réecrire, déclare un deuxime tableau et un deuxième compteur, dans la boucle if de userform_initialize, rajoute un test sur caption like"/*-+=""pour définir les boutons comme mebre de la deuxième classse.
Ensuite du code les évènements click des classes en faisant par exemple un select case sur ButtonNum.caption.

Bon, je crois que j'en ai fini pour cette petite contribution. Si quelqu'un veut en savoir plus sur ce type de code, n'hésitez pas. Moi j'ai boucoup galéré avec les classes au début et encore plus avec les évènements. Maintenant, je suis un adepte des classes d'objets, et ça me simplifie la vie.
J'en profite pour vous demander si quelqu'un à déjà réussi à utiliser New_Enum dans une classe collection en VBA Parceque là dessus je calle. Peut être pas possible en vba ??? Snif
+++
K@lobit

Merci kalobit 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Messages postés
1788
Date d'inscription
mardi 7 novembre 2000
Dernière intervention
11 mars 2006
- 24 janv. 2006 à 18:39
0
Merci
Bonsoir,

Suite à ton post, j'en ai réalisé une dans un classeur, si tu as une
adresse e_mail, je peux te l'envoyer comme pièce jointe, celà te
permettra d'étudier le code.Tu peux me communiquer ton e_mail par MP.



jpleroisse
Messages postés
6
Date d'inscription
mardi 24 janvier 2006
Dernière intervention
13 février 2006
- 24 janv. 2006 à 19:05
0
Merci
merci pour ton aide je crois je vais regarder tous sa a tête reposée!!! Ce forum étais ma dernière solution car comme tu dis sur le net ya tous se kil fo faut il encore comprendre tous se kil y raconte, et la programmation n'est pas ma vocation loin de là!! g u à peine 6h de cours sur sa et g rien compris. Ce n'est pas par manque de travail que je n'y arrive pas c parce ke je n'arrive pas à traduire en language VBA se que je ve faire. Je ne comprend pas se ke signifie les termes comme intenger range etc...
merci
Messages postés
1490
Date d'inscription
mercredi 5 février 2003
Dernière intervention
3 décembre 2007
- 24 janv. 2006 à 21:52
0
Merci
C'est pas compliqué en réalité !

Tu peux avoir soit des variables (case mémoire simple), soit des tableaux (comme les tableaux mais de 1 dimension à plusieurs...). Or, ces cases mémoires, pour être réservées en mémoire justement, il faut connaître leur taille (en Octet). Et oui, car si le Bit (0 ou 1) est l'unité primitive, l'unité réel est l'Octet (qui fait 8 bits soit, en décimale, un nombre compris entre 0 et 255 soit 256 nombres! Prends une calculette scientifique et convertit "1111 1111" du binaire au décimal et tu obtiendras le nombre décimal 255.).

Donc, si tu as besoin d'une variable ne stockant qu'un nombre entier compris entre 0 et 255, tu n'as besoin que d'un octet en mémoire. Mais si tu as besoin de plus...
Alors ce qu'il faut savoir en informatique c'est qu'on compte avec les multiples binaires.
Si on prendre 2 octets, on n'obtient pas 2 * 256 (soit 512) mais 256 * 256 (256 puissance 2) soit 65'536. Autrement dit, un nombre compris entre 0 et 65'535. Pourquoi ?
Parce qu'en fait, c'est comme si, au lieu de compter en base 10 (décimal) on comptait en base 256. Autrement dit, c'est comme si, au lieux de n'avoir que 10 chiffres (0-9) on en avait 256!!!
En décimale 9|9 donne 0-100
En base 256 : 255|255 donne 0-65'535

D'ailleurs, pour représenter ces 256 octets de base, au lieu de les afficher toujours sous la forme de 8 bits (1010'1010) - ce qui serait impossible à gérer pour l'être humain - on a créer, selon les pays, un table de caractères dite ASCII. Donc, chaque octet possède son propre caractère ASCII de représentation!

Pour en revenir à nos variables et notre mémoire. On a créer des types
de variable
prédéfinits en fonction des besoins. Par exemple, il y a les chiffres, le texte et les formats autres comme la date. Dans chacune de ces cathégories il y a plusieurs types. Mais les cathégories n'existent pas réellement.
Pour le texte, c'est simple, c'est le type String qui veut dire en anglais "Chaine" pour Chaine de caractère. Pense aux strings culottes qui sont des ficelles... des ficelles de mots passant entre les fesses des jolies filles ;-)

Pour les nombre, c'est plus nuancé. En effet, il y a deux types de nombre : les entier et les réels (niveau CM2 ça!). Les entiers n'ont pas de virgules alors que les réels en ont (les décimales).
Le premier type, le plus court, c'est : Byte. Oui, parce que Byte c'est le nom anglais de Octet (d'où d'ailleurs les Kilo Bytes [KB] qui ne sont pas des Kilos Bits !!!). Pour info d'ailleurs, BIT est issu de Binary dIgiT (les digites étant, dans notre langue également, les symboles numériques... autrement dit, les chiffres, mais ici, les chiffres des ordinateurs {électro-magnétiques et cie}).
Donc, tu peux mettre des nombres compris entre 0 et 255 dans une variable déclarée en type Byte.

Après il y a le type Integer codé sur 2 octets (0-65'536). Integer voulant dire Entier !
Ensuite il y a le type Long... En fait, Long Integer soit Entiers Longs codés, si je ne m'abuse, sur 3 Bytes soit un nombre de 0 à 16'777'215.

Viennent ensuite les réels. Les types sont Singles et Double.

Pour les dates et cie je te laisse te référer à la MSDN qui est l'aide du VB!

Dim varAge As Byte '0-255 ans c'est bien suffisant! Pi y'a pas de virgules à un âge!
Dim varNom As String 'Taille indéterminée mais 1 byte par caractère, normal!

Mais si tu mets une valeur fausse (dépassant le type ou étant d'un type différent [du texte dans une variable de type Single par exemple ou alors 256 dans une variable de type byte, ...] un erreur sera générée!

Mais si tu ne précise pas le type de ta variable ou de ton tableau, il/elle sera de type Variant et pourra être utilisé sans plus de complications (d'où tout l'avantage du VB/VBA face aux autres langages!!!). Fait également attention car tu ne peux pas, sauf avec le type Variant ou avec des fonctions bien spècifiques, passer une variable d'un type à un autre !!!

Voilà, c'était juste pou la petite explication
Mais si tu veux en savoir plus, je suis à ta disposition !

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.