Пользовательская форма Excel VBA — использование той же формы для генерации непрерывных данных

#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. Большое вам спасибо! Это именно то, что мне было нужно!