[AccessD] Re Max of 20 values

William Benson (VBACreations.Com) vbacreations at gmail.com
Mon Jul 25 10:08:37 CDT 2011


The below works much (MUCH) faster by not binding the max-time display
textbox to a function (after looping to find it) and using requery. If you
know the control's name, just put the variable's value there directly.


So

For Each Ctrl In aTxt.Parent.Controls
  If TypeOf Ctrl Is Access.TextBox Then
    If Ctrl.Tag = "Max Time Value" Then
      Ctrl.Requery
      Exit For
    End If
  End If
Next

Becomes


aTxt.Parent.Controls("ShowMaxValueHere") = Glob_Dbl_What_Is_Current_Max


-----Original Message-----
From: William Benson (VBACreations.Com) [mailto:vbacreations at gmail.com] 
Sent: Saturday, July 23, 2011 9:27 PM
To: Access Developers discussion and problem solving
Subject: RE: [AccessD] Re Max of 20 values

Going back to the original inquiry. John's right, class modules are the way
to go. 

Assumptions:  
Tag property on all controls which can contain a time value = "Time Values"
I have an additional textbox on my form with controlsource = "=
HighestValue()"
     -- that is a public function -- see below


'IN THE FORM'S CODE MODULE
Option Compare Database
Option Explicit
Dim colTimeValueControls As New Collection
Dim MyclsSeriesItem As clsTimeSeriesItem

Private Sub Form_Load()
Dim Ctrl As Control

Glob_Dbl_What_Is_Current_Max = 0
Glob_Str_Which_Control_Has_Max = ""

For Each Ctrl In Me.Controls
   If ControlIsTimeValue(Ctrl, TimeValueTag) Then
      Set MyclsSeriesItem = New clsTimeSeriesItem
      Set MyclsSeriesItem.Txt = Ctrl
      MyclsSeriesItem.Txt.AfterUpdate = "[Event Procedure]"
      colTimeValueControls.Add MyclsSeriesItem
    End If
Next
End Sub

'IN A Class Module named clsTimeSeriesItem
Option Compare Database
Option Explicit
Public WithEvents aTxt As Access.TextBox

Private Sub aTxt_AfterUpdate()
Dim bTestAllControls As Boolean
Dim Ctrl As Control
bTestAllControls = False
If IsNumeric(aTxt.Value) Then
  If CDbl(Nz(aTxt.Value, 0)) >= Glob_Dbl_What_Is_Current_Max Then
      Glob_Dbl_What_Is_Current_Max = CDbl(aTxt.Value)
      Glob_Str_Which_Control_Has_Max = aTxt.Name
  ElseIf Glob_Str_Which_Control_Has_Max <> aTxt.Name Then
    'DO NOTHING, some other control has the max value anyway
  Else   'It is numeric, it was the max, and it no longer is as high as the
max was
    bTestAllControls = True
  End If
ElseIf Glob_Str_Which_Control_Has_Max = aTxt.Name Then
  bTestAllControls = True
Else
  'We don't care if it went non-numeric, it didn't hold the max value prior
to now
End If

If bTestAllControls Then
  Glob_Str_Which_Control_Has_Max = ""
  Glob_Dbl_What_Is_Current_Max = 0
  For Each Ctrl In aTxt.Parent.Controls
    If ControlIsTimeValue(Ctrl, TimeValueTag) Then
      If IsNumeric(Nz(Ctrl.Value, "")) Then
        If CDbl(Nz(Ctrl.Value, 0)) > Glob_Dbl_What_Is_Current_Max Then
          Glob_Dbl_What_Is_Current_Max = CDbl(Nz(Ctrl.Value, 0))
          Glob_Str_Which_Control_Has_Max = Ctrl.Name
        End If
      End If
    End If
  Next
End If
For Each Ctrl In aTxt.Parent.Controls
  If TypeOf Ctrl Is Access.TextBox Then
    If Ctrl.Tag = "Max Time Value" Then
      Ctrl.Requery
      Exit For
    End If
  End If
Next
End Sub

Public Property Set Txt(ByVal ControlThatChanged As Control)
  If TypeOf ControlThatChanged Is Access.TextBox Then
    Set aTxt = ControlThatChanged
  End If
End Property

Public Property Get Txt() As Access.TextBox
  If Not aTxt Is Nothing Then
    Set Txt = aTxt
  End If
End Property


'IN A STANDARD MODULE
Public Glob_Str_Which_Control_Has_Max As String
Public Glob_Dbl_What_Is_Current_Max As Double

Public Function TimeValueTag() As String
  TimeValueTag = "Time Values"
End Function
Public Function ControlIsTimeValue(Ctrl As Control, strTagToLookFor As
String) As Boolean
If TypeOf Ctrl Is Access.TextBox Then
   ControlIsTimeValue = (Ctrl.Tag = strTagToLookFor)
End If
End Function

Public Function HighestValue()
HighestValue = Glob_Dbl_What_Is_Current_Max
End Function





More information about the AccessD mailing list