在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被视为一个数字。
当您在您的代码行中创buildTextBox
: Set ctextbox = Controls.Add("forms.textbox.1", test1)
您的文本框的名称是1,2,3等
为了读取您的TextBox
es(在运行时创build),我循环遍历User_Form
所有控件,检查它是否为TextBox
types,并检查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]