【问题标题】:VBA values from dynamically added combobox来自动态添加的组合框的 VBA 值
【发布时间】:2018-04-25 08:39:04
【问题描述】:

第一次发帖。自学 VBA,所以我总是知道代码可能并不完美。总之……

创建用户表单问卷。我不知道会有多少问题,我希望任何人都可以轻松地向表单添加新问题。想法是将问题列在工作表上,以便在添加新问题时,用户框将相应调整大小并添加所有问题。

这样做没问题:

Public Sub UserForm_Activate()
    QuestionsCount = Application.WorksheetFunction.CountA(Sheets("QuestionData").Range("A:A")) - 1
    ResultsCount = Application.WorksheetFunction.CountA(Sheets("QuestionData").Range("B:B")) - 1
    DepartmentCount = Application.WorksheetFunction.CountA(Sheets("QuestionData").Range("C:C")) - 1
    QuestionForm1.ScrollHeight = (QuestionsCount) * 70
    QuestionForm1.Width = 258
    CommandButton1.Top = (QuestionsCount - 1) * 70
    CommandButton1.Left = 42
    CommandButton2.Top = (QuestionsCount - 1) * 70
    CommandButton2.Left = 132

    Dim i As Integer
    Dim QQ(1 To 100) As MSForms.Control
    Dim QA(1 To 100) As MSForms.Control
    For i = 5 To QuestionsCount
        Set QQ(i) = QuestionForm1.Controls.Add("Forms.Label.1")
        Set QA(i) = QuestionForm1.Controls.Add("Forms.ComboBox.1")
        With QQ(i)
            .Caption = Sheets("QuestionData").Range("A" & (i + 1))
            .Width = 84
            .Top = i * 58
            .Left = 24
            .Name = "Label" & i
        End With
        With QA(i)
            .RowSource = "QuestionData!B2:B" & ResultsCount + 1
            .Width = 96
            .Top = i * 58
            .Left = 138
            .Name = "Combo" & i
            .Value = ""
        End With
    Next i
End Sub

创建了用户表单,我想要的所有问题都在那里(命令按钮的位置不太好,我知道,很快就会解决这个问题)

唯一的问题是取值。答案在 ComboBox 中,用户将选择他们想要的答案并单击提交按钮。这个想法是然后从每个comboBox 中获取值并将它们放入另一张表中。 我遇到的问题是全局变量似乎在子结束时消失了。因此,当用户插入答案并单击提交时,宏会尝试获取不存在的值。

添加的组合框的名称是什么?它们的值存储在哪里?有没有办法不结束 Sub 以使值保持为全局变量?还有其他的想法吗?

任何帮助将不胜感激...希望我已经很好地解释了自己!

提前致谢!!

【问题讨论】:

  • 不确定我是否理解您的问题,但是否要在隐藏表单后获取 ComboBoxes 的值?然后,即使表单不可见,您仍然可以访问ComboBoxes。您可以在模块中声明一个公共变量(即Public oMyForm as New <your form name here>)。然后,您可以通过简单地访问此对象来访问 UDF 中的任何表单对象或表单属性(即oMyForm.myCombobox.Value.. 其中myCombobox 将是您的组合框的实际名称)

标签: vba excel


【解决方案1】:

您已使用 .Name = "Combo" & i 命名组合框。

因此,您可以创建一个在按下 SUBMIT 按钮或类似按钮时运行的例程,该例程通过以下方式读取值:

QuestionForm1.Controls("Combo5").Value

您也可以将其设置为一个循环来构建一个数组:

Private Sub CommandButton1_Click()

    ResultsCount = Application.WorksheetFunction.CountA(Sheets("QuestionData").Range("B:B")) - 1
    Dim chosenvalue(100)

    For i = 5 To ResultsCount
        chosenvalue(i) = QuestionForm1.Controls("Combo" & i).Value
        Debug.Print "Button " & i & " set to " & chosenvalue(i)
    Next

End Sub

【讨论】:

  • 这就是我最初的想法。但是在 Locals 窗口中查看,就好像它不存在一样。我添加的新组合框都没有出现。如果我在 Sub 结束之前中断,我可以看到它们,但在 Sub 结束并且表单仍在屏幕上之后就看不到了。
  • 在尝试读取值之前,您是 Unloading 还是关闭表单?
  • 没有。所以表单正在加载,控件正在添加,然后 sub 正在结束。此时,表单会停留在屏幕上,而用户可以更改他们选择的答案——这一切都很好。然后我有一个提交按钮,我想获取答案并将它们粘贴到附件的表格中。但是找不到答案,因为当子结束时,它们就消失了。
  • 我刚刚在这里模拟了这个,并注意到由于某种原因你的循环从 5.. 开始,所以我改变了我的例子以适应。 PS。这在我的模型上运行良好。
  • 这就是我原来的样子。如果我尝试它,我得到运行时错误:'-2147024809 (80070057) 找不到指定的对象。然后调试器突出显示 QuestionForm1.Controls("Combo" & i).Value 恰到好处,然后我检查了我的 Locals 列表,它在哪里看不到。 PS。从 i =5 开始,因为我自己有 4 个组合框
猜你喜欢
  • 2015-08-03
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2014-08-27
  • 2023-03-09
相关资源
最近更新 更多