我有很多形式
编码到我想要的但我在其中最重要的部分遇到困难。如图所示,具有30个文本框的表单中的框架被设计为在其中输入名称。每个方框都有不同的名称。当我点击"保存数据"按钮我希望文本框中的名称输入工作表上的下一个可用行,也在图像中。
因此,如果表单在前三个框中包含Bob,Joe和Jane,我希望工作表中的行A:2-4分别用每个名称填充。
答案 0 :(得分:0)
如果您不能(或不想)依赖文本框名称,有两种可能的方法:
利用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
控件属性
如果您的文本框正确垂直对齐(即同一行中的所有texbox共享非常相同的 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