I cannot handle the enter event..Unbelievable or so obvious?

ktab

Well-known Member
Joined
Apr 21, 2005
Messages
1,297
Hello,

This code is at UF initialize event:
Code:
Option Explicit
Dim TextBoxes() As New Class1
Dim ComboBoxes() As New Class1

Private Sub UserForm_Initialize()
Dim TCount As Long, CCount As Long, c As Control
TCount = 0
CCount = 0
'Set TabIndexCollection = New Collection
For Each c In Me.Controls
'    TabIndexCollection.Add c, CStr(c.TabIndex)
    If TypeOf c Is MSForms.TextBox Then
        TCount = TCount + 1
        ReDim Preserve TextBoxes(1 To TCount)
        Set TextBoxes(TCount).TextBoxGroup = c
    End If
    If TypeOf c Is MSForms.ComboBox Then
        CCount = CCount + 1
        ReDim Preserve ComboBoxes(1 To CCount)
        Set ComboBoxes(CCount).ComboBoxGroup = c
    End If
Next c
End Sub

And the following at class1 module:
Code:
Public WithEvents TextBoxGroup As MSForms.TextBox
Public WithEvents ComboBoxGroup As MSForms.ComboBox

Sub ComboBoxGroup_Enter()
MsgBox "Hello from " & ComboBoxGroup.Name
Exit Sub
If ComboBoxGroup.Name Like "TN*" Then
    frmTask.StatusBar1.Panels(1).Text = "NUM"
Else: frmTask.StatusBar1.Panels(1).Text = ""
End If
End Sub

Sub TextBoxGroup_Enter()
MsgBox "Hello from " & TextBoxGroup.Name
Exit Sub
If TextBoxGroup.Name Like "TN*" Then
    frmTask.StatusBar1.Panels(2).Text = "NUM"
Else: frmTask.StatusBar1.Panels(2).Text = ""
End If
End Sub
Sub TextBoxGroup_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim i As Integer
If TextBoxGroup.Name Like "TN*" Then
    nonNumberEntered = False
    If KeyCode < 49 Or KeyCode > 57 Then
        If KeyCode < 96 Or KeyCode > 105 Then
            If KeyCode <> 8 Then
                If KeyCode <> 111 Then
                    If KeyCode <> 191 Then
                        nonNumberEntered = True
                    End If
                End If
            End If
        End If
    End If
End If
end sub
Sub TextBoxGroup_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If nonNumberEntered = True Then KeyAscii = 0
End Sub

The code handles keydown, keypress events with no problem. Also similar change events, and probably more.
I cannot figure out why it does not handle enter event.. What ever i may do. Unbelievable or so obvious that i cannot see?
 
Anyway, this was my recommendation also (not access but a win app), a structured DB to do what ever they want. But no.
About controls now, imagine fields like name,surname phones, addresses, city, mail, for both home and work, fields that are flaged with yes/no like active member, retired e.c.t. e.c.t. Payments to union, total, remaining, and much much more. (please do not ask me to list them all)
 
Upvote 0

Excel Facts

Will the fill handle fill 1, 2, 3?
Yes! Type 1 in a cell. Hold down Ctrl while you drag the fill handle.
Hi Kostas.
The Enter event is not sourced by any individual control to begin with. It is "Inherited" from the Control class. Change your code as follows.

<table width="100%" border="1" bgcolor="White" style="filter:progid:DXImageTransform.Microsoft.Gradient(endColorstr='#C0CFE2', startColorstr='#FFFFFF', gradientType='0');"><tr><TD><font size="2" face=Courier New>  <font color="#0000A0">Dim</font> TextBoxes() <font color="#0000A0">As</font> <font color="#0000A0">New</font> Class1
  <font color="#0000A0">Dim</font> ComboBoxes() <font color="#0000A0">As</font> <font color="#0000A0">New</font> Class1

  <font color="#0000A0">Private</font> <font color="#0000A0">Sub</font> UserForm_Initialize()
       <font color="#0000A0">Dim</font> TCount <font color="#0000A0">As</font> Long, CCount <font color="#0000A0">As</font> Long, c <font color="#0000A0">As</font> Control
       TCount = 0
       CCount = 0
      <font color="#008000"> 'Set TabIndexCollection = New Collection</font>
       <font color="#0000A0">For</font> <font color="#0000A0">Each</font> c <font color="#0000A0">In</font> Me.Controls
      <font color="#008000"> ' TabIndexCollection.Add c, CStr(c.TabIndex)</font>
           <font color="#0000A0">If</font> <font color="#0000A0">TypeOf</font> c <font color="#0000A0">Is</font> MSForms.TextBox <font color="#0000A0">Then</font>
               TCount = TCount + 1
               <font color="#0000A0">ReDim</font> <font color="#0000A0">Preserve</font> TextBoxes(1 <font color="#0000A0">To</font> TCount)

              <font color="#008000"> 'Set TextBoxes(TCount).TextBoxGroup = c</font>
              
               <font color="#0000A0">With</font> TextBoxes(TCount)
                   <font color="#0000A0">Set</font> .TextBoxGroup = c
                   <font color="#0000A0">Set</font> .TextBoxEnterEvent = c
               <font color="#0000A0">End</font> <font color="#0000A0">With</font>
              

           <font color="#0000A0">End</font> <font color="#0000A0">If</font>
           <font color="#0000A0">If</font> <font color="#0000A0">TypeOf</font> c <font color="#0000A0">Is</font> MSForms.ComboBox <font color="#0000A0">Then</font>
               CCount = CCount + 1
               <font color="#0000A0">ReDim</font> <font color="#0000A0">Preserve</font> ComboBoxes(1 <font color="#0000A0">To</font> CCount)
           <font color="#0000A0">End</font> <font color="#0000A0">If</font>
       <font color="#0000A0">Next</font> c
  <font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
</FONT></td></tr></table><button onclick='document.all("4292007104725203").value=document.all("4292007104725203").value.replace(/<br \/>\s\s/g,"");document.all("4292007104725203").value=document.all("4292007104725203").value.replace(/<br \/>/g,"");window.clipboardData.setData("Text",document.all("4292007104725203").value);'>Copy to Clipboard</BUTTON><textarea style="position:absolute;visibility:hidden" name="4292007104725203" wrap="virtual">
Dim TextBoxes() As New Class1
Dim ComboBoxes() As New Class1

Private Sub UserForm_Initialize()
Dim TCount As Long, CCount As Long, c As Control
TCount = 0
CCount = 0
'Set TabIndexCollection = New Collection
For Each c In Me.Controls
' TabIndexCollection.Add c, CStr(c.TabIndex)
If TypeOf c Is MSForms.TextBox Then
TCount = TCount + 1
ReDim Preserve TextBoxes(1 To TCount)

'Set TextBoxes(TCount).TextBoxGroup = c

With TextBoxes(TCount)
Set .TextBoxGroup = c
Set .TextBoxEnterEvent = c
End With

End If
If TypeOf c Is MSForms.ComboBox Then
CCount = CCount + 1
ReDim Preserve ComboBoxes(1 To CCount)
End If
Next c
End Sub</textarea>

<table width="100%" border="1" bgcolor="White" style="filter:progid:DXImageTransform.Microsoft.Gradient(endColorstr='#C0CFE2', startColorstr='#FFFFFF', gradientType='0');"><tr><TD><font size="2" face=Courier New>  <font color="#0000A0">Option</font> <font color="#0000A0">Explicit</font>

  <font color="#0000A0">Public</font> <font color="#0000A0">WithEvents</font> TextBoxGroup <font color="#0000A0">As</font> MSForms.TextBox
  <font color="#0000A0">Public</font> <font color="#0000A0">WithEvents</font> ComboBoxGroup <font color="#0000A0">As</font> MSForms.ComboBox
  Public <font color="#0000A0">WithEvents</font> TextBoxEnterEvent <font color="#0000A0">As</font> MSForms.Control

  <font color="#0000A0">Sub</font> ComboBoxGroup_Enter()
       MsgBox "Hello from " & ComboBoxGroup.Name
       <font color="#0000A0">Exit</font> <font color="#0000A0">Sub</font>
       <font color="#0000A0">If</font> ComboBoxGroup.Name <font color="#0000A0">Like</font> "TN*" <font color="#0000A0">Then</font>
           frmTask.StatusBar1.Panels(1).Text = "NUM"
       Else: frmTask.StatusBar1.Panels(1).Text = ""
       <font color="#0000A0">End</font> <font color="#0000A0">If</font>
  <font color="#0000A0">End</font> <font color="#0000A0">Sub</font>

  <font color="#008000">'Changes >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>></font>
  <font color="#008000">'Sub TextBoxGroup_Enter()</font>
  <font color="#008000">' MsgBox "Hello from " & TextBoxGroup.Name</font>
  <font color="#008000">' Exit Sub</font>
  <font color="#008000">' If TextBoxGroup.Name Like "TN*" Then</font>
  <font color="#008000">' frmTask.StatusBar1.Panels(2).Text = "NUM"</font>
  <font color="#008000">' Else: frmTask.StatusBar1.Panels(2).Text = ""</font>
  <font color="#008000">' End If</font>
  <font color="#008000">'End Sub</font>
  
  <font color="#0000A0">Private</font> <font color="#0000A0">Sub</font> TextBoxEnterEvent_Enter()
       MsgBox "Hello from " & TextBoxGroup.Name
       <font color="#0000A0">Exit</font> <font color="#0000A0">Sub</font>
       <font color="#0000A0">If</font> TextBoxGroup.Name <font color="#0000A0">Like</font> "TN*" <font color="#0000A0">Then</font>
           frmTask.StatusBar1.Panels(2).Text = "NUM"
       Else: frmTask.StatusBar1.Panels(2).Text = ""
       <font color="#0000A0">End</font> <font color="#0000A0">If</font>
  <font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
  

  <font color="#0000A0">Sub</font> TextBoxGroup_KeyDown(ByVal KeyCode <font color="#0000A0">As</font> MSForms.ReturnInteger, <font color="#0000A0">ByVal</font> Shift <font color="#0000A0">As</font> Integer)
       <font color="#0000A0">Dim</font> i <font color="#0000A0">As</font> <font color="#0000A0">Integer</font>
       <font color="#0000A0">If</font> TextBoxGroup.Name <font color="#0000A0">Like</font> "TN*" <font color="#0000A0">Then</font>
           nonNumberEntered = <font color="#0000A0">False</font>
           <font color="#0000A0">If</font> KeyCode < 49 <font color="#0000A0">Or</font> KeyCode > 57 <font color="#0000A0">Then</font>
               <font color="#0000A0">If</font> KeyCode < 96 <font color="#0000A0">Or</font> KeyCode > 105 <font color="#0000A0">Then</font>
                   <font color="#0000A0">If</font> KeyCode <> 8 <font color="#0000A0">Then</font>
                       <font color="#0000A0">If</font> KeyCode <> 111 <font color="#0000A0">Then</font>
                           <font color="#0000A0">If</font> KeyCode <> 191 <font color="#0000A0">Then</font>
                               nonNumberEntered = <font color="#0000A0">True</font>
                           <font color="#0000A0">End</font> <font color="#0000A0">If</font>
                       <font color="#0000A0">End</font> <font color="#0000A0">If</font>
                   <font color="#0000A0">End</font> <font color="#0000A0">If</font>
               <font color="#0000A0">End</font> <font color="#0000A0">If</font>
           <font color="#0000A0">End</font> <font color="#0000A0">If</font>
       <font color="#0000A0">End</font> <font color="#0000A0">If</font>
  <font color="#0000A0">End</font> <font color="#0000A0">Sub</font>

  <font color="#0000A0">Sub</font> TextBoxGroup_KeyPress(ByVal KeyAscii <font color="#0000A0">As</font> MSForms.ReturnInteger)
       <font color="#0000A0">If</font> <font color="#0000A0">Not</font> IsNumeric(Chr(KeyAscii)) <font color="#0000A0">Then</font> KeyAscii = 0
  <font color="#0000A0">End</font> <font color="#0000A0">Sub</font>
</FONT></td></tr></table><button onclick='document.all("429200710489859").value=document.all("429200710489859").value.replace(/<br \/>\s\s/g,"");document.all("429200710489859").value=document.all("429200710489859").value.replace(/<br \/>/g,"");window.clipboardData.setData("Text",document.all("429200710489859").value);'>Copy to Clipboard</BUTTON><textarea style="position:absolute;visibility:hidden" name="429200710489859" wrap="virtual">
Option Explicit

Public WithEvents TextBoxGroup As MSForms.TextBox
Public WithEvents ComboBoxGroup As MSForms.ComboBox
Public WithEvents TextBoxEnterEvent As MSForms.Control

Sub ComboBoxGroup_Enter()
MsgBox "Hello from " & ComboBoxGroup.Name
Exit Sub
If ComboBoxGroup.Name Like "TN*" Then
frmTask.StatusBar1.Panels(1).Text = "NUM"
Else: frmTask.StatusBar1.Panels(1).Text = ""
End If
End Sub

'Changes >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'Sub TextBoxGroup_Enter()
' MsgBox "Hello from " & TextBoxGroup.Name
' Exit Sub
' If TextBoxGroup.Name Like "TN*" Then
' frmTask.StatusBar1.Panels(2).Text = "NUM"
' Else: frmTask.StatusBar1.Panels(2).Text = ""
' End If
'End Sub

Private Sub TextBoxEnterEvent_Enter()
MsgBox "Hello from " & TextBoxGroup.Name
Exit Sub
If TextBoxGroup.Name Like "TN*" Then
frmTask.StatusBar1.Panels(2).Text = "NUM"
Else: frmTask.StatusBar1.Panels(2).Text = ""
End If
End Sub

Sub TextBoxGroup_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim i As Integer
If TextBoxGroup.Name Like "TN*" Then
nonNumberEntered = False
If KeyCode < 49 Or KeyCode > 57 Then
If KeyCode < 96 Or KeyCode > 105 Then
If KeyCode <> 8 Then
If KeyCode <> 111 Then
If KeyCode <> 191 Then
nonNumberEntered = True
End If
End If
End If
End If
End If
End If
End Sub

Sub TextBoxGroup_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0
End Sub</textarea>
 
Upvote 0
Hello Tom,

While initializing UF, i get a message: Object or class does not support the set of events.
 
Upvote 0
Thank you Tom Urtis. I will study alot the topic and i'll post back solution or more questions (i prefer to post back case 1 :)
 
Upvote 0
In addition to Tom's solution... NOT :)

Sorry Kostas. I should have tested before I posted. I searched through my posts most assured that I have used these events, but I suppose not.
 
Upvote 0
It's OK Tom, Jaafar uses a nice techique at link suggested by Tom (Urtis) to, as i understood, delay (or reach out) the caption of the event from the UF and pass it to the "class" (ordinary module sub procedure). Very nice.
 
Upvote 0
The other alternative is to create or modify these controls at runtime using VBE automation.
 
Upvote 0

Forum statistics

Threads
1,215,148
Messages
6,123,307
Members
449,095
Latest member
Chestertim

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top