我不知道这是否适合放在stackoverflow中,尽管与VBA相关 - 特别是在UserForms区域,但是,我无法想象我将如何编写代码。
然而,我想要实现的目标类似于QuickBooks如何在Amount Due
中自动分配Expense Accounts
而不必像第一张图片中所示那样逐一输入它们(My {1}} excel工作表)。此外,当费用帐户多于平时时(例如,10个费用帐户,Quickbooks将自动为此目的添加新行)。示例如下所示:
我的主要问题是,如果我需要,我不知道如何让UserForms动态添加更多行。它可以在填充所有先前行时自动添加行,或者如下图所示:
让n
为费用帐户数
因此,必须输入n*2
(或在我的情况下输入4个值):
电话/保险费用:40,000
银行现金40,000
水费:40,000
银行现金:40,000
我可以将其简化为n+1
输入(或者在我的情况下为3输入):
到期金额:80,000
电话/保险费用:40,000
水费40,000
答案 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事件会增加额外的复杂性。如果您决定采取这种方式,我建议首先考虑并发布新问题。