为什么我不能从代码生成的文本框中获取textbox.text值

时间:2014-10-14 18:19:08

标签: vba textbox

我有一个项目,我有一个表单“userform1”,它只有一个“GO”按钮和一个“EXIT”按钮开始。我通过输入框请求用户输入数字。我使用代码然后使用该数量的标签和文本框填充表单,并显示表单以允许编辑创建的文本框。到目前为止,一切正常。 然后我想要“GO”按钮用textbox.text值填充数组以供其他地方使用。这就是我遇到问题的地方。

我尝试检索文本,就像我通常那样(类似于; Xstring = UserForm1.Box1.Text),但是没有用。然后我通过表单控件循环; UserForm1.Controls.index(),查找我的Textbox .names以确认它们存在。我找到了它们,所以我单挑了一个,索引(3),。name =“Box1”。见下文:

Dim tText As String
tText = UserForm1.Box1.Text
MsgBox tText

返回ERROR,'找不到'方法或数据成员'

但如果我改成它:

Dim x As Object
Dim tText As String
Set x = UserForm1.Controls.Item(3)
tText = x.Text
MsgBox tText

msgbox返回.text值

所以,问题是,为什么我不能简单地解决它?我不想通过所有额外的步骤来计算索引号与名称来填充我的数组。

供参考,下面是我的sub的部分代码,用于创建标签/文本框:

For i = Data(x, 1) To z
    Lab = "forms.label.1"
    Box = "forms.textbox.1"
    Set newlabel = UserForm1.Controls.Add(Lab)
    Set newtextbox = UserForm1.Controls.Add(Box)
    lbl1 = ("Label" + CStr(i))
    With newlabel
        .Name = lbl1
        .Caption = "No. " + CStr(i)
        .Left = Data(x, 3)
        .top = top
        .Height = 20
        .Width = 30
    End With
    lbl2 = ("Box" + CStr(i))
    With newtextbox
        .Name = lbl2
        .Text = CStr(i)
        .Left = (Data(x, 3) + 35)
        .top = top
        .Height = 20
        .Width = 36
    End With
    top = top + 25
Next i

2 个答案:

答案 0 :(得分:0)

UserForm1在运行时之前没有该名称的方法或数据成员。因此,VBA解释器无法解释其含义。

您仍然可以通过其索引编号或控件名称索引的子控件集合来访问该项目,例如:

Dim myTxtBox As MSForms.TextBox

Me.Controls.Add bstrProgId:="Forms.Textbox.1", Name:="My Runtime Textbox"

Set myTxtBox = Me.Controls("My Runtime Textbox")

myTxtBox.Text = "Hello"

答案 1 :(得分:0)

在阅读Cor_Blimey的评论后,我现在正在使用代码检索我的程序生成的textbox.text数据:

Dim i As Integer, num As Integer, ctr As Integer
Dim oCntl As Object
Dim tText() as String

num = UserForm1.Controls.Count
ReDim tText(num)
For Each Control In UserForm1.Controls 'loops thru each control
    If TypeOf Control Is TextBox Then
        ctr = ctr + 1
        tText(ctr) = Control.Text
    End If
Next Control
ReDim Preserve tText(ctr)

.text正在按顺序写入数组(通过索引#,创建了订单文本框) 在将来,我可能会考虑数组中的2个值,1表示.name,1表示.text,只是为了确定。