2 pièce(s) jointe(s)
Total avec opérateurs "+" et "-" de plusieurs textBox dans une autre textBox
Bonsoir,
Il y a deux mois j'ignorais l'expression VBA ; j'ai donc un long chemin à parcourir.
Requête
Je souhaite créer une textBox qui serait le résultat (avec opérateurs "+" & "-"),
en valeur positive ou négative, de plusieurs textBox (renseignées ou non).
L'idée est de visionner sur le formulaire, dans une textBox, en temps réel, l'éventuel écart de ventilation, au fur et à mesure de la saisie des autres tetxBox.
Précisions :
Saisie textBox Recette ou saisie textBox Dépense en valeur positive
Saisies aléatoires dans les TextBox Ventilation (certaines pouvant ne pas être renseignées) en valeur positive (recette) ou valeur négative (dépense).
Merci
total avec opérateurs"+" et "-" de plusieurs textbox dans une autre textbox
bonjour Christine et Marcel,
désolé de ne pouvoir apporter de solution au problème posé. mes connaissances VBA sont très limitées.
je crois qu'on ne peut effectivement pas joindre de fichiers xlsm, sans doute pour éviter le transport de virus. Il faut le joindre au format compressé ZIP ou RAR.
Sinon, j'ai lu avec intérêt le document (partie 1) de P. Fauconnier que tu as proposé.
Comment peut-on trouver les autres parties de ce document sur ce site ?
Merci.
Cordialement.
Module de classe pour gestion de l'affichage et du Textbox résultat
Bonsoir Christine, Bonsoir le Forum,
1 - Définir des noms de cellules correspondants aux noms de Textbox qui alimentent la classe d'Objet. Ces Textbox sont intégrés à un formulaire Usf_Journal.
Chaque cellule nommée j_xxxx sera informée par le texte du contrôle Txt_xxxx
A l'initialisation du formulaire Usf_Journal, ces contrôles alimentent une classe d'objets personnelle appelée Class_Txt_Journal. Class_Txt_Journal est le nom du module de classe
Ici la nouvelle classe est appelée par la variable tableau "Postes."
Code formulaire
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| Option Explicit
Option Base 1
'Module de classe
'On définit une série de contrôles comme faisant partie _
d'une classe d'objets personnelle appelée Class_Txt_Journal _
Class_Txt_Journal est le nom du module de classe
Dim Postes() As New Class_Txt_Journal
Private Sub UserForm_Initialize()
Dim wsj As Worksheet
Dim dernl As Integer
Dim n As Byte
Dim Liste_Postes As Variant, Liste_col As Variant
Dim post
'Variable wsj affectée à la feuille "Journal"
Set wsj = ThisWorkbook.Worksheets("Journal")
'Recherche de la première ligne vide à informer
With wsj
dernl = .Cells(.Rows.Count, 4).End(xlUp).Offset(1, 0).Row
End With
'Tableau des contrôles alimentant la classe d'objets personnelle, sauf le dernier
Liste_Postes = Array("Recette", "Dépense", "Chorale", "Informatique", "Photo", "Théatre", "CpteACpte", "Contrôle")
'Tableau des colonnes auxquelles appartiennent les cellules nommées
Liste_col = Array(6, 8, 10, 11, 12, 13, 14, 15)
'Compteur
n = 0
For Each post In Liste_Postes
n = n + 1
ThisWorkbook.Names.Add Name:="j_" & post, RefersTo:=wsj.Cells(dernl, Liste_col(n))
'Tous les conrôles du tableau alimentant la classe d'objets personnelle, sauf le dernier
If n < UBound(Liste_Postes) Then
ReDim Preserve Postes(1 To n)
Set Postes(n).Cl_Txt = Controls("Txt_" & post)
End If
Next post
'Variable libérée
Set wsj = Nothing
End Sub
Private Sub Btn_Valider_Click()
Me.Hide
Unload Me
End Sub |
2 - Le module de classe va gérer en direct les Textbox ainsi que les cellules nommées de la feuille de calcul
En saisissant les valeurs Textbox, on peut voir l'alimentation simultanée des cellules et du Textbox Contrôle.
Déclaration évènementielle de la variable affectée au contrrôle.
Sauf erreur, la déclaration sert à obtenir les méthodes et propriétés en automatique (Lorsque l'on saisit un "." après la variable) (Penser à gérer l'option correspondante du VBE, si nécessaire).
Code à intégrer au module de classe nommé "Class_Txt_Journal" :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| Option Explicit
Const monformat = "### ### ##0.00"
'La classe d'ojets sert à intercepter les évènements
Public WithEvents Cl_Txt As MSForms.TextBox
Private Sub Cl_Txt_Change()
Dim occurs As String
Dim leformat As String
With Cl_Txt
'Gestion du format 0.00 au fur et à mesure de la saisie du contrôle
leformat = Right(monformat, Len(.Value) + 3)
.Value = Format(.Value, leformat)
If Len(.Value) > 4 Then
If InStr(.Value, ".") = 0 Then
.SelStart = Len(.Value) - 3
Else
If Mid(.Value, Len(.Value) - 3, 1) = "." Then
If Right(.Value, 2) + 0 = 0 Then
.Value = Left(.Value, InStr(.Value, ".") - 1)
.SelStart = .SelStart + 1
Else
.SelStart = Len(.Value) - 1
End If
End If
End If
End If
If Right(.Value, 2) + 0 > 0 Then .SelStart = Len(.Value) - 1
'Pour le fun !
If Right(.Value, 1) + 0 > 0 Then .SelStart = Len(.Value)
'Extraction du nom pur afin d'alimenter la cellule nommée correspondante
occurs = Right(.Name, Len(.Name) - 4)
End With
With Worksheets("Journal")
'La cellule nommée correspondante à la Textbox est alimentée - en direct - par le contenu de celui-ci
.Range("j_" & occurs).Value = Cl_Txt.Text + 0
'Le contrôle test Txt_Contrôle est informée par la résultante des cellules de la feulle de calcul
Usf_Journal.Txt_Contrôle.Text = Format(.Range("j_contrôle"), "# ### ##0.00")
End With
End Sub |
Merci aux amis Patrick TOULON et mercatog. Pour la gestion de l'affichage, je me suis inspiré de leurs propositions sur une discussion que j'avais lancée Mise en forme Textbox
La difficulté provient pour ce nouveau cas ici de la saisie du séparateur décimal.
Bonne soirée à tous