Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
ciao Vladimiro,
mi sovvengono due modi.
il primo.
Sfruttare la proprietà tag del controllo textBox e in un loop sommare il valore dei controlli ed assegnarli alla textBox in cui vuoi visualizzare la somma :
oppure, volendo evitare la proprietà tag assegnare alla textBoxes, oggetto di somma, un nome che possa essere riconosciuto in un loop nella collection controls della forms.
il tag è la x e nel loop solo il valore dei controlli textbox contrassegnati in tal modo vengono sommati :
Option Compare Database
Option Explicit
Private Sub cmdsomma_Click()
Dim ctl As Access.Control
Dim lngTot As Long
For Each ctl In Me.Section(0).Controls
If TypeName(ctl) = "textBox" And ctl.Tag = "x" Then
lngTot = lngTot + Nz(ctl, 0)
End If
Next
Set ctl = Nothing
Me.txtSomma = lngTot
End Sub
il controllo con sfondo rosso non ha il tag x e di conseguenza anche se valorizzata non viene considerato nella somma.
Serve un command button per attivare la somma
L'alternativa è sfruttare l'evento afterupdate e su ogni evento procedere con il calcolo...ma un po' ridondante.
l'atra soluzione è un po' più difficile è volta all'evitare il richiamo di n eventi afterupdate per la somma.
Definisci una classe clsSomma che utilizzerai per popolare una collection contenente l'oggetto myTxt, le tue textBoxes di cui vuoi la somma.
su evento dopo aggiornamento effetui la somma.
clsSomma:
Option Compare Database
Option Explicit
Private WithEvents myTxt As Access.textBox
Private myParent As Form_Maschera2
Private mOldValue As Long
Private mCurValue As Long
'
Public Sub init(ByVal ctl As Access.Control, ByVal clsObj As Form_Maschera2)
Set myTxt = ctl
myTxt.AfterUpdate = "[event procedure]"
myTxt.BeforeUpdate = "[event procedure]"
Set myParent = clsObj
End Sub
Private Sub myTxt_AfterUpdate()
Dim lngValue As Long
lngValue = mCurValue
If IsNull(myTxt) Or Not Me.isNum Then
lngValue = mOldValue * -1
mOldValue = 0
End If
myParent.calcola lngValue:=lngValue
End Sub
Public Property Get textBox() As Access.textBox
Set textBox = myTxt
End Property
Public Function isNum() As Boolean
Dim lngNum As Long
On Error Resume Next
lngNum = myTxt.Value
isNum = (Err.Number = 0)
End Function
Private Sub myTxt_BeforeUpdate(Cancel As Integer)
If Me.isNum Then
mCurValue = myTxt - mOldValue
mOldValue = myTxt
End If
End Sub
Private Sub Class_Terminate()
Set myTxt = Nothing
Set myParent = Nothing
End Sub
instanzi la classe nella form su apertura :
Option Compare Database
Option Explicit
Private cls As clsSomma
Private col As VBA.Collection
Private Sub Form_Open(Cancel As Integer)
Dim ctl As Access.Control
Dim lngTot As Long
Set col = New VBA.Collection
For Each ctl In Me.Section(0).Controls
If TypeName(ctl) = "textBox" And ctl.Tag = "x" Then
Set cls = New clsSomma
cls.init ctl, Me
col.Add cls, ctl.name
End If
Next
Set ctl = Nothing
End Sub
Public Sub calcola(ByVal lngValue As Long)
Me.txtSomma = Nz(Me.txtSomma) + lngValue
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim c As clsSomma
For Each c In col
col.Remove c.textBox.name
Next
Set col = Nothing
Set cls = Nothing
End Sub
nella classe qualora il valore assegnato alla textBox sia non numerico la somma non si valorizza.
Un po' difficile tutto questo mi rendo conto, sicuramente più flessibile rispetto alla somma delle singole txtBoxes nell'origine riga della txtSomma, ma la tua idea iniziale credo sia la migliore... :-)
qui trovi la demo.
Ciao e buona domenica.
Sandro.