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
-
利用
Top
和Left
控件属性如果你的文本框是正确的垂直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