如何根据需要动态添加Excel VBA用户表单中的列表框和文本框?

时间:2018-05-23 06:23:15

标签: excel vba winforms excel-vba

我不知道这是否适合放在stackoverflow中,尽管与VBA相关 - 特别是在UserForms区域,但是,我无法想象我将如何编写代码。

我的Excel工作表如下所示: Excel Worksheet

我创建的用于输入数据的UserForm如下所示: UserForm

然而,我想要实现的目标类似于QuickBooks如何在Amount Due中自动分配Expense Accounts而不必像第一张图片中所示那样逐一输入它们(My {1}} excel工作表)。此外,当费用帐户多于平时时(例如,10个费用帐户,Quickbooks将自动为此目的添加新行)。示例如下所示: Quickbooks Sample

我的主要问题是,如果我需要,我不知道如何让UserForms动态添加更多行。它可以在填充所有先前行时自动添加行,或者如下图所示:

Ideal Form

n为费用帐户数

因此,必须输入n*2(或在我的情况下输入4个值):

电话/保险费用:40,000

银行现金40,000

水费:40,000

银行现金:40,000

我可以将其简化为n+1输入(或者在我的情况下为3输入):

到期金额:80,000

电话/保险费用:40,000

水费40,000

2 个答案:

答案 0 :(得分:1)

可以找到许多动态添加控件的示例和教程,例如

how-to-create-controls-dynamically-at-runtime
adding-controls-to-a-frame-in-an-excel-userform-with-vba
vba-userform-basics-add-controls-dynamically-at-run-time

但是,根据最大行数,可能是在设计时创建所有控件的更好解决方案,将Visible - 属性设置为false并将其更改为{{1 }} 需要的时候。

答案 1 :(得分:0)

您可以根据UserForm代码中的标签点击添加控件。 你必须保持一个行数,以便利用它来整齐地定位它们并从你的例子中移动这个标签(否则它将隐藏在你添加的文本框后面)。

UserForm的示例代码:

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的高度添加一些内容,以使其随添加的控件一起增长。您还可能需要重新定位TextBox下面的其他控件。

如果您希望在填写完最后一个框时自动添加行,则需要向新添加的控件添加一些事件,但这不是列出的主要问题问题。

编辑:以上显然是基于你的最后一张图片,因为这是“快速获胜”;处理动态添加的TextBoxes事件会增加额外的复杂性。如果您决定采取这种方式,我建议首先考虑并发布新问题。