#excel #vba
#excel #vba
Вопрос:
Я довольно новичок в VBA. Я хочу создать пользовательскую форму, которая позволит пользователю использовать одну и ту же форму несколько раз. Каждый раз, когда используется форма, любые данные, введенные пользователем, добавляются в переменную (одну и ту же переменную или несколько разных). Когда пользователь ввел все данные, он может нажать «Отправить», и форма выдаст все данные по порядку.
Пример: Пользовательская форма с текстовым полем и 2 командными кнопками, Next
и Submit
. Вводимые пользователем данные 1
, клики Next
. Вводимые пользователем данные 2
, клики Submit
. Пользовательская форма распечатывается 1, 2
.
Как бы я это сделал? Возможно ли это вообще?
Комментарии:
1. Вполне возможно. Вам решать, как и где вы хотите хранить отправленные данные (в коллекции, словаре, массиве, листе …) Затем вы просто извлекаете и отображаете эти значения.
2. Я очень новичок в VBA и написании кода в целом (у меня нет опыта в этом). Каков наилучший способ сделать это? Я хочу, чтобы пользователь мог решать, сколько раз они вводят данные. Таким образом, некоторым пользователям может потребоваться использовать форму только один раз. Другим может потребоваться 5 экземпляров. Мне не нужно, чтобы вы писали код для меня, но если бы вы могли указать правильное направление, я был бы очень признателен!
3. Может быть сложно начать работу с такого рода материалами. Я был там. Я привел пример в качестве ответа, используя самую простую пользовательскую форму в совершенно новой книге. Здесь я использую массив, вызываемый
Submissions
для хранения значений, отправленных пользователемTextBox1
. Чтобы запустить это после создания пользовательской формы и вставки этого кода, вы можете перейти на своюImmediate
панель (Просмотр>> Немедленное), ввестиuserForm1.Show
и нажать enter.
Ответ №1:
Вот краткий POC. Рассмотрим простую пользовательскую форму с текстовым полем и двумя командными кнопками. Я вообще не менял здесь имена по умолчанию. Только что добавлена пользовательская форма с textbox1, commandbutton1 и commandbutton2:
CommandButton1
отправляет и CommandButton2
завершает работу из пользовательской формы (щелкает, например, когда пользователь завершает отправку).
Код для выполнения этой работы, как вы описали. Это указано на кодовой странице для пользовательской формы.
'declare a string array to hold the submissions from textbox1
Private submissions() As String
'Code to run when the form activates
Private Sub UserForm_Activate()
'When this userform is first initialized set up the array
'as a one dimensional array with a single element
ReDim submissions(0 To 0)
End Sub
'Code to run when the commandbutton1 is clicked
Private Sub CommandButton1_Click()
'call the addSubmission sub
addSubmission
End Sub
'Code to run when the commandButton2 is clicked
Private Sub CommandButton2_Click()
'add submission one more time
addSubmission
'Now Loop through the array and send the values out
'to the worksheet
Dim rowCounter As Long
rowCounter = 1
For Each submission In submissions
Sheet1.Cells(rowCounter, 1).Value = submission
rowCounter = rowCounter 1
Next submission
'Now close the form
Me.Hide
'And activate sheet1 for the user to see their submissions
Sheet1.Activate
End Sub
'addSubmission will add textBox1 value to
' the submissions array declared at the
' top of this userform code.
Sub addSubmission()
'First we have to redim the array to hold the new
' submission.
'But only redim it if this isn't the first submission
If UBound(submissions) > 0 Or submissions(0) <> "" Then ReDim Preserve submissions(0 To UBound(submissions) 1)
submissions(UBound(submissions)) = Me.TextBox1.Value
'Clear the textbox so the user doesn't have to backspace
Me.TextBox1.Value = ""
End Sub
Комментарии:
1. Большое вам спасибо! Это именно то, что мне было нужно!