Как динамически обращаться к пользовательским формам - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь избежать жесткого кодирования имени пользовательской формы в подпрограммы, которые заполняют, а затем извлекают данные из указанной пользовательской формы. Подраздел, который я включил здесь, - это тот, который должен поместить значения из пользовательской формы в ячейки на листе.

(я все еще довольно новичок в этом)

I 'Мы пробовали несколько подходов от других решений к подобным проблемам на стеке потока, но безрезультатно. Самым близким, к которому я пришел, был Screen.ActiveForm, но, к сожалению, это для Access, а не Excel.

Я также пытался создать переменную публичного объекта, но также не смог заставить ее работать.

Единственное, что сработало, это жесткое кодирование Userform1 в подпрограммы, но это кажется неэффективнымспособ пойти об этом. Я не понимаю, почему кто-то должен был бы писать новый модуль каждый раз, когда он настраивает другую пользовательскую форму.

''''''''''''''''' Userform '''''''''''''''''''

Private Sub CommandButton1_Click() ' Ok

' Set CurrentForm = Me.Caption
Interactive_Userforms.EditAdd

End Sub


''''''''''''''''' Module '''''''''''''''''''


Public StartRow, StartColumn, n_TextBoxes As Integer
Public sheet As String
' public CurrentForm as object

Sub EditAdd()

Dim i, j, k  As Integer

i = StartRow
j = StartColumn
k = 1

Do While screen.activeform.Controls("TextBox" & k).Value <> ""

    Worksheets(sheet).Cells(i, j).Value = screen.activeform.Controls("TextBox" & k).Value

    Debug.Print (Worksheets(sheet).Cells(i + StartRow, j + StartColumn).Value)

    i = i + 1
    k = k + 1

Loop

End Sub

То, что я ожидал бы сделать, это в конечном итоге позволить любой пользовательской форме вызывать этоsub, чтобы получить значения из своих элементов управления textbox и поместить их в рабочий лист.

Ответы [ 2 ]

3 голосов
/ 24 октября 2019

Если вы просто хотите, чтобы EditAdd Sub вызывался пользовательскими формами, вы можете изменить свою подпись EditAdd на Sub EditAdd(Form as Object) или Sub EditAdd(Form as Userform), тогда вы можете передать сам экземпляр пользовательской формы как "Me" при вызове EditAdd

Private Sub CommandButton1_Click() ' Ok

' Set CurrentForm = Me.Caption
Interactive_Userforms.EditAdd(Me)

End Sub
1 голос
/ 24 октября 2019

Мне кажется, что этот ответ слишком прост, учитывая ваш код, но кажется, что вы должны иметь возможность просто включить параметр для макроса для захвата формы, вызывающей его.

Что-то вроде ...

Private Sub CommandButton1_Click() ' Ok

Call Interactive_Userforms, Me

End Sub

и тогда ваш публичный модуль будет иметь ...

Sub EditAdd(myUserForm As UserForm)
'... etc....
        Worksheets(Sheet).Cells(i, j).Value = myUserForm("TextBox" & k).Value
'... etc.

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...