0
votes

I am confused by the procedure to call two different userforms at different times from different modules.

I have the following two userforms named: "UserForm1" and "UserForm2", on "UserForm1" I also have a static button with code named: "Private Sub UserForm_Click()"

The subs from the forms contain the following code:

Via name: UserForm1:

[On userform1 I have a button:]

private sub OKButton_Click()
msgbox("OKButton_Click via 1")
End Sub

Public Sub UserForm1_Initialize()
msgbox("UserForm1_Initialize via 1")
'dynamic form initialisation
End Sub

Private Sub UserForm_Click()
msgbox("UserForm_Click via 1")
End Sub

VIA name: UserForm2

Public Sub UserForm_Initialize()
msgbox("UserForm_Initialize via 2")
'dynamic form initialisation
End Sub

And I call the two userforms in:

Module57
Sub Vitamins()
UserForm2.Show 'Initialising Userform2
end sub

Module53
Sub fix_ratios()
UserForm1.Show 'Initialising Userform1
end sub

The problem occurs when I call either one, at first I could not call Userform2 when UserForm1 worked fine, so I altered the name and code of UserForm2 by doubleclicking the object of UserForm2, which then created the new code:

Private Sub UserForm_Initialize()

End Sub

So I pasted my code for initializing UserForm2 in there, it worked fine. But I now realise that it just steals the "UserForm_Initialize()" from the first UserForm.

So I tried altering the subnames to:

Public Sub UserForm1_Initialize()

end sub

and

Public Sub UserForm2_Initialize()

end sub

But then it won't call the UserForms anymore. Would anyone have a suggestion, or be able to tell me what I'm doing wrong?

1
As long as the UserFrom_Initialize sub is contained in the code for that form, it is not responding to the other form. The initialize event runs in response to the the form opening. It does not "call the UserForms" as you've suggested. Are you trying to open both forms at once? If so, then make sure that the ShowModal property for the forms is set to False.tlemaster
Thank you, you were correct, I was inconsistent in the names of the subs. Which resulted in me losing comprehension of the structure and technically correct oversight. I will post the solution in the answer.Maximilian brutus III

1 Answers

1
votes

The solution was like tlemaster suggested:

Having the seperate subs for each form in the form which it belongs in. (This is not a module, but visual in the top view of the editor displaying " -[UserFormx (code)].

On top of that, once you use: userformx.show in a different module, it will first excecute:

Sub Userform_Initialize()

Then once that has been completed it will show the userformx.

If the Sub Userform_Initialize() is named Sub Userform_Initialise() it will not excecute the sub, and it will simply show the uninitialized sub.

If you click "view object" on the userform, and then doubleclick the form template, it will generate/go to the code:

Sub userform(x?)_clicked()

This will also not be executed before displaying the userformx.

On top of that, one can have two identically named subs:

Sub Userform_Initialize()

Sub Userform_Initialize()

As long as they are in different "Forms" /Form codes then Excel will automatically execute the initialisation of the form that is called from any random unrelated module with: "UserformY.Show"

Enjoy.