0

I am working on a userform which contains numerous (an unknown number) of textbox controls. The number of textboxes on the form is based on certain parameters being met elsewhere within the project.

The number of textboxes on the form could get up to 100 or so and my users are expected to fill in each of them. However, in many cases the value for one textbox will be the same as the textbox positioned directly above it.

I therefore wish to implement functionality to allow the user to enter a "." followed by tabbing out of the field in order to copy the value from the textbox above it.

There are a couple of ways I could go about this initial requirement:

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    If TextBox2.Value = "." Then
        TextBox2.Value = TextBox1.Value
    End If

End Sub

This works absolutely fine.. however given that there is no indication here that the textbox2 is below textbox1 (Other than me knowing where I put it) we could do something like:

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    If TextBox2.Left = TextBox1.Left And TextBox2.Value = "." Then
        TextBox2.Value = TextBox1.Value
    End If

End Sub

And again this works absolutely fine.

My problem is this, with up to 100 textbox controls I do not particularly want to write and maintain an Exit event for each possible textbox control.

I will probably phrase this incorrectly, but is there a way to trigger the exit event dynamically by passing the name of the textbox the user has tabbed out of?

Or am I lumbered within dozens of identical subs handling the exit of each textbox specifically?

EDIT:

Reading the post linked from Word Nerd, I have the following included with the userform initialize event

Dim tbCollection As Collection

Private Sub UserForm_Initialize()
 
    Dim Ctrl As MSForms.Control
    Dim obj As clsTextBox
    
    Set tbCollection = New Collection
    
        For Each Ctrl In usfEnterTime.Controls
                If TypeOf Ctrl Is MSForms.TextBox Then
                    Set obj = New clsTextBox
                    Set obj.Control = Ctrl
                    tbCollection.Add obj
                End If
        Next Ctrl
        
        Set obj = Nothing

Then we have the class module clsTextBox

Private WithEvents MyTextBox As MSForms.TextBox

Public Property Set Control(tb As MSForms.TextBox)
    Set MyTextBox = tb
End Property
Private Sub MyTextBox_Change()

    If MyTextBox.Value = ". " Then
        If MyTextBox.Top = 24 Then
            MsgBox "Nothing to copy from"
            MyTextBox.Value = ""
            Exit Sub
            
        Else
        
            For Each Ctrl In usfEnterTime.Controls
                If Ctrl.Left = MyTextBox.Left And Ctrl.Top = MyTextBox.Top - 18 Then
                    MyTextBox.Value = Ctrl.Value
                    Application.SendKeys "{TAB}"
                    Exit Sub
                End If
            Next Ctrl
        End If
    Else
        Exit Sub
    End If


End Sub

My initial requirement was to use the EXIT event to implement a "." + TAB out of textbox to copy from above, however it appears the TextBox control does not have the EXIT event available. So I am using the change event, application.sendkeys and expecting my users to use ". " (Note blank space) to mimic the same functionality and tab to the next textbox in the tab order index using the spacebar instead. As you can see I am simply looping through all controls and checking the relative TOP and LEFT positions to determine which textbox to copy from. 24 is the position of the top most textbox control and so I am capturing this and displaying a msgbox to advise the user there will be nothing to copy from. -18 represents the gap between the tops of two textbox controls.

Working perfectly, thanks to Word Nerd for linking through to the other post.

Tom
  • 16
  • 2
  • Hi Tom, can you tell me if anything in this link gets you close? I had the same problem you're having but I decided to go with 1 line calls for each of my text boxes for purposes of simplicity. https://stackoverflow.com/questions/5940596/excel-vba-userform-execute-sub-when-something-changes – Word Nerd Jul 23 '21 at 00:50
  • Sure, Have been researching thoroughly and one approach is to create the Textboxes AND Events at Runtime, this involves additional logic to correctly create and position the controls followed by attaching an event from a class module to the control. I haven't got there yet because the reason for this requirement is to achieve the "." + Tab functionality to copy from above and I am finding it very difficult to assign the correct tab order index at runtime. Will update with code once I get there... – Tom Jul 23 '21 at 10:24
  • @WordNerd I have a solution, updating my question now – Tom Jul 23 '21 at 12:12

0 Answers0