Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何从动态添加的文本框中读取文本?_Excel_Vba - Fatal编程技术网

Excel 如何从动态添加的文本框中读取文本?

Excel 如何从动态添加的文本框中读取文本?,excel,vba,Excel,Vba,我有一个关于如何从动态添加的文本框中读取文本的问题。在我的UserForm中,我有一个文本框,在这个文本框中,我输入了我想要添加多少新文本框。从这一个文本框中,我添加了两个新的动态文本框 Set Ctrl = .Add("Forms.TextBox.1", Window.Name + CStr(i)) 'TextBox for code With Ctrl .Width = 32 .Height = 16 .Top = TopPos .Left

我有一个关于如何从动态添加的文本框中读取文本的问题。在我的UserForm中,我有一个文本框,在这个文本框中,我输入了我想要添加多少新文本框。从这一个文本框中,我添加了两个新的动态文本框

Set Ctrl = .Add("Forms.TextBox.1", Window.Name + CStr(i)) 'TextBox for code
With Ctrl
    .Width = 32
    .Height = 16
    .Top = TopPos
    .Left = 6
    .Value = Chr(64 + i) + CStr(10 + i)
    .MaxLength = 4
    .ZOrder (0)
End With
Set Ctrl = .Add("Forms.TextBox.1", Window.Name + CStr(i)) 'TextBox for comment
With Ctrl
    .Width = 240
    .Height = 16
    .Top = TopPos
    .Left = 44
    .MaxLength = 50
    .ZOrder (0)
End With
文本框的第一列自动填充一个字母和一个数字,第二列是空的,用于我的评论。使用Finish按钮,我想将文本从两个文本框导出到两个单元格中—文本从第一列文本框导出到单元格“a”,文本从第二列文本框导出到新文件中的单元格“B”。 我编写了一个函数,用于在每个新文本框中查找文本:

Function FindName(Iter As Integer, Name As String) As String
   Dim Text As String
   Dim Ctrl As Control

   For Each Ctrl In UserForm1.Controls
   If Ctrl.Name = Name Then
      Text = Ctrl.Text
   End If
   Next Ctrl

FindName = Text

End Function
我使用此函数用文本框中的文本填充新Excel,但问题是,文本仅从第二列导出到新文件:

NewFile.Worksheets(1).Cells(StartValue + i, 1) = FindName(i, "TextBox1" + CStr(i))
NewFile.Worksheets(1).Cells(StartValue + i, 2) = FindName(i, "TextBox1" + CStr(i))
有什么解决方案可以区分第一列文本框和第二列文本框,将文本从第一列文本框导出到一个单元格,从第二列文本框导出到另一个单元格


谢谢您的帮助。

当您按名称检索控件时,需要为它们指定唯一的名称。这是通过
.Add
-命令的第二个参数完成的。在代码中,您为代码和注释提供了相同名称的控件,因此
FindName
-函数只能找到其中一个控件。看看下面的代码-它创建了一些名为
tbCode_1
tbComment_1
的文本框-如果您不喜欢,请根据您的个人喜好进行更改

Set Ctrl = .Add("Forms.TextBox.1", "tbCode_" &  CStr(i)) 'TextBox for code
(...)
Set Ctrl = .Add("Forms.TextBox.1", "tbComment_" &  CStr(i)) 'TextBox for comment
您的
FindName
-函数可能如下所示

Function FindName(Iter As Integer, colName As String) As String
    Dim ctrlName as String
    ctrlName = "tb" & colName & "_" & CStr(i)
    On Error Resume Next
    FindName = Me.Controls(ctrlName).Text
    On Error Goto 0
End Function
你把它叫做

NewFile.Worksheets(1).Cells(StartValue + i, 1) = FindName(i, "Code")
NewFile.Worksheets(1).Cells(StartValue + i, 2) = FindName(i, "Comment")

在两个函数调用中,使用相同的文本框名称。顺便说一句,连接符应该是&而不是+。什么是
Window.Name
?它可以工作,谢谢您的帮助。Window.Name是TextBox的名称,我在其中添加了许多新的动态TextBox,但我忘了用新TextBox的名称替换“Window.Name”。