VBA循环通过文本框,并插入不同的行上的每个框

我有很多这种forms

在这里输入图像说明

编码到我想要的,但我在最重要的部分有困难。 如图所示,具有30个文本框的窗体中的框架被devise为具有input的名字。 每个盒子都有不同的名字。 当我点击“保存数据”button时,我希望文本框中的名字被input到工作表中的下一个可用行,也在图像中。

所以,如果表单在前三个框中包含Bob,Joe和Jane,我希望工作表中的行A:2-4分别填充每个名称。

除非你使用一个在每个迭代中dynamic构造名称引用的循环。 我在Access中使用了几种技术。

一种技术涉及类似的命名控件:tbxName1,tbxName2等

 For j = 0 To 10 Me.Controls(Choose(i, "A", "B", "C", "D", "J", "M", "P", "R") & j).Visible = Me.optSet Next 

或者,即使文本框名称不一致,也可以通过Controls集合和条件代码testing来循环控制的types。

 For Each ctlName In Me.Controls If ctlName.ControlType = acTextBox Or ctlName.ControlType = acComboBox Then ctlName.BackStyle = 0 Next 

或者在Tag属性中testing一个特定的值。

  For Each ctrl In .ctrRutSpG.Form.Controls If ctrl.Tag = "Unbind" Then ctrl.ControlSource = "" Next 

如果你不能(或不想)依赖文本框的名字,有两种可能的出路:

  • 利用TabIndex

    如果“个人”框架内的文本框与要编写其内容的单元格具有相同的TabIndex顺序,则可以按如下所示进行操作:

     Dim i As Long Dim strng As String With Me.Frame1 '<--| change "Frame1" to your actual "Individuals" frame name For i = 0 To .Controls.Count - 1 strng = strng & GetTextBox(i).Value & " " Next Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(.Controls.Count) = Application.Transpose(Split(Trim(strng), " ")) End With 

    你在哪里利用以下Function

     Function GetTextBox(tabId As Long) As Control Dim ctrl As Control For Each ctrl In Me.Frame1.Controls If ctrl.TabIndex = tabId Then Exit For Next Set GetTextBox = ctrl End Function 

  • 利用TopLeft控件属性

    如果你的文本框是正确的垂直alignment(即在同一中的所有texboxes共享相同的 Top属性),那么你可以去如下:

      Dim dict As Object Dim ctrl As Control Set dict = CreateObject("Scripting.Dictionary") With dict For Each ctrl In Me.Frame1.Controls .Item(Format(ctrl.Top, "000") & "-" & Format(ctrl.Left, "000")) = ctrl Next End With SortDictionary dict Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(Me.Frame1.Controls.Count) = Application.Transpose(dict.items) 

    你在哪里利用以下Function

     Sub SortDictionary(dict As Object) Dim i As Long Dim key As Variant With CreateObject("System.Collections.SortedList") For Each key In dict .Add key, dict(key) Next dict.RemoveAll For i = 0 To .Keys.Count - 1 dict.Add .GetKey(i), .Item(.GetKey(i)) Next End With End Sub