VBA循环遍历文本框并将每个框插入不同的行

时间:2017-04-01 17:02:54

标签: excel vba excel-vba loops for-loop

我有很多形式

enter image description here

编码到我想要的但我在其中最重要的部分遇到困难。如图所示,具有30个文本框的表单中的框架被设计为在其中输入名称。每个方框都有不同的名称。当我点击"保存数据"按钮我希望文本框中的名称输入工作表上的下一个可用行,也在图像中。

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

1 个答案:

答案 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
    
  • 利用TopLeft控件属性

    如果您的文本框正确垂直对齐(即同一中的所有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