Как добавить списки и текстовые поля в Excel VBA Пользовательские формы динамически при необходимости? - PullRequest
0 голосов
/ 23 мая 2018

Я не знаю, подходит ли это для размещения в stackoverflow, несмотря на то, что оно связано с VBA - особенно в области UserForms, однако я вообще не могу представить, как я собираюсь это кодировать.

MyРабочий лист Excel показан ниже: Excel Worksheet

Пользовательская форма, которую я создал для ввода данных, показана ниже: UserForm

ОднакоТо, чего я хочу добиться, аналогично тому, как это делает QuickBooks, когда Amount Due автоматически распределяется между Expense Accounts без необходимости вводить их 1 на 1, как показано на первом изображении (моя таблица Excel).Кроме того, когда учетных записей больше, чем обычно (например, 10 учетных записей, Quickbooks автоматически добавит новые строки для этой цели).Пример показан ниже: Quickbooks Sample

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

Ideal Form

Пусть n будет числомрасходные счета

То есть от необходимости вводить n*2 (или в моем случае 4 значения):

Расходы на телефон / страхование: 40 000

Наличные в банке 40 000

Расход воды: 40000

Наличные в банке: 40000

Я могу упростить его до n+1 входов (или в моем случае 3 входа):

СуммаСрок оплаты: 80 000

Расходы на телефон / страхование: 40 000

Расходы на воду 40 000

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

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

Пример кодадля пользовательской формы:

Private rowCount As Integer 'To keep track of rows.
Private Sub UserForm_Initialize()
    rowCount = 1
End Sub

Private Sub LabelAddRow_Click() 'Event handler: Add row on click of label.
    Dim tb As Control
    rowCount = rowCount + 1
    Set tb = Me.Controls.Add("Forms.TextBox.1", "textBox" & rowCount & "left", True) 'Add left TextBox.
    With tb 'Position and size it:
        .Top = 25 + (rowCount * 25) + 10
        .Left = 25
        .Height = 25
        .Width = 100
    End With
    Set tb = Me.Controls.Add("Forms.TextBox.1", "textBox" & rowCount & "right", True) 'Same for the right one:
    With tb
        .Top = 25 + (rowCount * 25) + 10
        .Left = 150
        .Height = 25
        .Width = 100
    End With
    LabelAddRow.Top = LabelAddRow.Top + 25 'Move the label down.
End Sub

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

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

Редактировать : Вышеприведенное, очевидно, основано на вашем последнем изображении, поскольку это «быстрая победа»;Работа с событиями динамически добавляемых TextBoxes добавит дополнительную сложность.Если вы решите пойти по этому пути, я советую сначала попробовать и опубликовать новые вопросы по мере их поступления.

0 голосов
/ 23 мая 2018

Можно найти множество примеров и руководств по динамическому добавлению элементов управления, например,

как создавать элементы управления динамически во время выполнения
добавление элементов управления в кадр-в-формате-Excel-userform-with-vba
vba-userform-основы-добавления-управления-динамически во время выполнения

Однако, в зависимости от максимального количества строк, может быть, это лучшее решение для создания всех элементов управления во время разработки, установите свойство Visible для false и измените его на trueпри необходимости.

...