在vba excel中的userform中dynamic读取dynamic命名的文本框的语法?

我dynamic地创build一个名为UserForm1的用户表单。 其中,我生成的文本框,将由用户手动填充。 之后我想阅读他们的价值,但我不知道如何调用(的价值)的文本框。

以下代码用于创build和命名文本框:

With UserForm1 'scaling userform .Height = max_width .Width = 600 End With For test1 = 1 To nr_of_zeros + 1 'create textboxes Set ctextbox = Controls.Add("forms.textbox.1", test1) 'creating textbox With ctextbox 'scaling textbox .Height = 20 .Width = 40 .Top = 40 + 25 * test1 .Left = 400 End With 

所以文本框会有test1的数字(整数或长度?)的名字。

我尝试了下面的句子来尝试将文本框的值读入: absorb_text但是迄今为止还没有成功。 有没有人知道正确的完整的方式来调用上面创build的文本框?

  'ctextbox.name = Controls.Add("forms.textbox.1", test1) 'creating textbox 'absorb_text = forms("textbox").Controls(test1).Value 'absorb_text = forms.("UserForm1").textbox.(test1).value forms.textbox.1.(test1) strname = TextBox1(test1).Text 

(模拟,一个不调用单元格“A2”)

 .range("A2") 

但是

 Thisworkbook.worksheets("sheetname").range("A2").text Thisworkbook.worksheets("sheetname").range("A2").value Thisworkbook.worksheets("sheetname").cells(2,1).text Thisworkbook.worksheets("sheetname").cells(2,1).value 

非常感谢你! 我仍然想知道为什么/在"forms.textbox.1"做了什么,我复制它,因为它的工作,但它的function混淆。

另外根据你的讨论如下:我相信,从技术上说,代码不会查找一个控制名称,它等于/数字1而是一个string字符恰好等于字符1.因此它不等于数字,但一个字符。

*反对这个论点是,它仍然适用:`如果ctrl.Name = 1然后'在这种情况下,我会认为1被视为一个数字。

当您在您的代码行中创buildTextBoxSet ctextbox = Controls.Add("forms.textbox.1", test1)您的文本框的名称是1,2,3等

为了读取您的TextBox es(在运行时创build),我循环遍历User_Form所有控件,检查它是否为TextBoxtypes,并检查Control的Name属性。

 Option Explicit Private Sub ReadRunTimeTextBox() Dim ctrl As Control Dim absorb_text As String ' loop through all control in user form For Each ctrl In Me.Controls ' check if control is type TextBox If TypeName(ctrl) = "TextBox" Then ' if control name is 1 (first created TextBox in your array) If ctrl.Name = "1" Then absorb_text = ctrl.Text ' the message box is for debug only MsgBox absorb_text End If End If Next ctrl End Sub 

这里有两个更多的方法来引用dynamic添加的控件

 Const nr_of_zeros = 4 For test1 = 1 To nr_of_zeros + 1 'create textboxes Debug.Print Controls(test1) Next Debug.Print Me![1] Debug.Print Me![2] Debug.Print Me![3] Debug.Print Me![4]