Comment formater et calculer des textbox créées dynamiquement?
Bonjour la communauté,
J’ai un petit (GROS !!!) souci de formatage et de calcul de textbox dans un UserForm.
Je vous explique…
Je crée dynamiquement des textbox par appui sur un bouton CommandButton qui me génère une ligne de textbox dans l’ordre : Nom de la société, Monant HT, Code TVA (qui est un combobox), TVA et Montant TTC.
J’utilise pour créer ces rubriques dynamiques, un module de classe qui pour le coût fonctionne très bien…
Je souhaite pouvoir, après chaque saisie d’un textbox (en l’occurrence Montant HT) pouvoir formater - certaines de mes textbox, avec ce format : "### ### ##0.00 €".
De même, je souhaiterai effectuer – toujours après saisie (du combobox Code TVA cette fois), un calcul simple (du type Montant TTC = Montant HT +TVA – avec un taux de TVA donné par le combobox Code TVA ).
J'ai bien pensé à utiliser un module de classe utilisant des "Property Get et Set", mais je ne vois pas comment déclencher ce module de classe.
Mon souci principal est le déclenchement de l’action après saisie (AfterUpdate) puisque cette commande n’est pas disponible dans les modules de classe.
Question… COMMENT FAIRE ???
Si parmi cette formidable communauté quelqu’un a une idée… je suis preneur.
Merci par avance pour vos réponses.
Jppouma.
Implémentation des événements Enter, Exit, BeforeUpdate et AfterUpdate
Bonjour,
Je t'ai bricolé un exemple d'implémentation de ces événements.
- ouvre un nouveau classeur
- Insère un UserForm (UserForm1)
- pose sur cet Userform (vers le haut) un bouton de commande (CommandButton1)
- Insère un module de classe (Classe1)
Ensuite...
Le code de l'UserForm :
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
| Option Explicit
Dim Cl(4) As New Classe1
Private Sub CommandButton1_Click()
Dim i&, Ctrl As Control
For i = 1 To 5
Set Ctrl = Me.Controls.Add("forms.TextBox.1", "TextBox" & i, True)
Cl(i - 1).Add Ctrl
With CommandButton1
Ctrl.Move .Left, .Top + .Height + i * 20, 100, 20
End With
Next
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim i&
For i = 0 To 4
Cl(i).Clear
Set Cl(i) = Nothing
Next i
End Sub |
Le code de la Classe :
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| Option Explicit
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
#If VBA7 And Win64 Then
Private Declare PtrSafe Function ConnectToConnectionPoint Lib "shlwapi" Alias "#168" _
(ByVal punk As stdole.IUnknown, _
ByRef riidEvent As GUID, _
ByVal fConnect As Long, _
ByVal punkTarget As stdole.IUnknown, _
ByRef pdwCookie As Long, _
Optional ByVal ppcpOut As LongPtr) As Long
#Else
Private Declare Function ConnectToConnectionPoint Lib "shlwapi" Alias "#168" _
(ByVal punk As stdole.IUnknown, _
ByRef riidEvent As GUID, _
ByVal fConnect As Long, _
ByVal punkTarget As stdole.IUnknown, _
ByRef pdwCookie As Long, _
Optional ByVal ppcpOut As Long) As Long
#End If
Private cCook As Long
Private cObj As Object
Private WithEvents cTBx As MSForms.TextBox
Private cColorInit As Long
Private Sub ConnectEvent(ByVal Connect As Boolean)
Dim cGuid As GUID
With cGuid
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With
ConnectToConnectionPoint Me, cGuid, Connect, cObj, cCook, 0&
End Sub
Public Sub Add(NewCtrl As Object)
Set cObj = NewCtrl
Set cTBx = NewCtrl
cColorInit = NewCtrl.BackColor
Call ConnectEvent(True)
End Sub
Public Sub Clear()
If (cCook <> 0) Then Call ConnectEvent(False)
Set cObj = Nothing
End Sub
Public Sub cTBx_Entree()
'Attribute cTBx_Entree.VB_UserMemId = -2147384830
cTBx.BackColor = vbBlue
End Sub
Public Sub cTBx_Sortie(ByVal Cancel As MSForms.ReturnBoolean)
'Attribute cTBx_Sortie.VB_UserMemId = -2147384829
cTBx.BackColor = cColorInit
End Sub
Public Sub cTBx_AvantMiseAjour(ByVal Cancel As MSForms.ReturnBoolean)
'Attribute cTBx_AvantMiseAjour.VB_UserMemId = -2147384831
MsgBox "Before_Update"
End Sub
Public Sub cTBx_ApresMiseAjour()
'Attribute cTBx_ApresMiseAjour.VB_UserMemId = -2147384832
cTBx.Value = Format(Replace(cTBx.Value, ".", ","), "### ### ##0.00 ")
End Sub |
La manipulation :
- Clic droit sur le module de classe / Supprimer
- Cliquer sur Exporter
- Ouvrir le fichier Classe1.cls avec ton éditeur de texte (bloc notes ou autre)
- enlever les apostrophes pour dé-commenter les lignes Attribute cTBx_XXXXXX.VB_UserMemId = -XXXXXXXXXXX (dans chaque événement)
- Enregistrer le fichier, le fermer
- importer le fichier Classe1.cls dans le classeur (Fichier/importer un fichier sous VBE)
- tester
EDIT : Attention si les TextBox sont encapsulés dans différents conteneurs (Frame, MultiPage, Pages)
EDIT 2 : ce code est également fonctionnel avec des ComboBox (mauvaise lecture de la demande).