【问题标题】:How to set text dynamically to texbox in vba?如何在vba中将文本动态设置为文本框?
【发布时间】:2019-07-23 09:27:19
【问题描述】:

尊敬的 StackOverFlow 成员,

我尝试在用户窗体中动态创建 texboxes 并根据选项卡中的值设置默认文本。

首先用户填写图片中的文本框

当他单击上面的按钮时,它会调用在同一用户窗体中创建文本框的函数。与文本框的值的总和一样多,此外,对于值“0”,它计为要添加的 1 个文本框。

我想要的是当它遇到0 值时,我希望创建的新 texbox 将默认文本设置为“null”。像这样:

我的代码:

For i = 0 To UBound(tabValTextBox)
            valTemp = tabValTextBox(i)
            If valTemp = 0 Then
                iTextBoxMasqueA = iTextBoxMasqueA + 1
                Set textBoxCableA = UserForm1.Controls.Add("Forms.TextBox.1")
                colTextBoxCableA.Add textBoxCableA
                With textBoxCableA
                    .Name = "cable" & iTextBoxCableA
                    .Top = iTextBoxCableA * textBoxCableA.Height + 50
                    .Left = 150
                    .Text = "Nul"
                End With
            Else
                For j = 0 To valTemp - 1
                    iTextBoxCableA = iTextBoxCableA + 1
                    Set textBoxCableA = UserForm1.Controls.Add("Forms.TextBox.1")
                    colTextBoxCableA.Add textBoxCableA
                    With textBoxCableA
                        .Name = "cable" & iTextBoxCableA
                        .Top = iTextBoxCableA * textBoxCableA.Height + 50
                        .Left = 150
                    End With
                Next j

            End If
        Next i


tabValTextbox() 是一个包含左侧文本框值的选项卡。
然而,我得到的结果如下所示:

我没有得到预期的那么多文本框。

我不明白我在哪里遗漏了一些东西。我想从中吸取教训,所以如果可能的话,请解释一下我在这里做错了什么,或者我的方法是否缺乏洞察力。

【问题讨论】:

  • 我怀疑这是因为您设置 textBoxCableA.Top 仅使用 iTextBoxCableA - 您没有在计算中考虑 iTextBoxMasqueA 所以如果存在零框,那么虽然所有的盒子都在被创建(和绘制)——有些是在其他的之上。您可以通过将 .Left 设置为零框来证明这一点,例如 140,这样您就可以看到两个重叠的时间。
  • @CLR 你说得对。我将 .Left 更改为 0 个框,它们都出现了。但是我看不到将它们显示在列中。
  • 所以不是iTextBoxCableA iTextBoxMasqueA,而是创建一个在both情况下递增的新索引,并使用该索引在这两种情况下相乘案例。 - 或者按照我在下面的回答删除一个。
  • @CLR 是的,你说得对,我的错。我没有看到我拼错了索引。我想我可以看几个小时而看不到那个。谢谢老兄

标签: excel vba textbox userform


【解决方案1】:

试试这个:

For i = 0 To UBound(tabValTextBox)
    valTemp = tabValTextBox(i)
    iTextBoxCableA = iTextBoxCableA + 1
    If valTemp = 0 Then
        Set textBoxCableA = UserForm1.Controls.Add("Forms.TextBox.1")
        colTextBoxCableA.Add textBoxCableA
        With textBoxCableA
            .Name = "cable" & iTextBoxCableA
            .Top = iTextBoxCableA * textBoxCableA.Height + 50
            .Left = 150
            .Text = "Nul"
        End With
    Else
        For j = 0 To valTemp - 1
            Set textBoxCableA = UserForm1.Controls.Add("Forms.TextBox.1")
            colTextBoxCableA.Add textBoxCableA
            With textBoxCableA
                .Name = "cable" & iTextBoxCableA
                .Top = iTextBoxCableA * textBoxCableA.Height + 50
                .Left = 150
            End With
        Next j
    End If
Next i

我已将 iTextBoxCableA 增量移到零条件之外,并完全删除了 iTextBoxMasqueA 增量,因为您没有使用它。

我自己无法测试,但我认为它可以解决重叠问题。

【讨论】:

  • 是的,这正是我所做的。我只是让我意识到我定义了iTextBoxMasqueA,然后使用了iTextBoxCableA。即使在您的第一条评论中,我也没有意识到这一点。我想我需要一个新人来看看它
猜你喜欢
  • 2017-02-09
  • 2014-12-09
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多