Переберите различные элементы управления в пользовательской форме и прочитайте / запишите значение VBA - PullRequest
0 голосов
/ 07 октября 2018

Я хотел бы каким-то образом получить значение из различных элементов управления в пользовательской форме, а затем записать их на листе после этого, если пользовательская форма закрывается и открывается снова, если имя выбрано в выпадающем списке, затем загружать все данные.в форме обратно готовы изменить значения.У меня есть 13 строк, которые пользователь может использовать в пользовательской форме.

Order id

user form

Sheet data

В моем коде запись данных на лист запишет все выбранные элементы, которые я хочу, но это занимает слишком много времени, потому что все циклы и ifs.Есть ли лучший способ добиться того, чего я хочу?

    Private Sub FillingInForm()

    Dim i As Long
    Dim WS As Worksheet

    Dim ctl As MSForms.Control
    Dim lbl As MSForms.Label
    Dim cmb As MSForms.ComboBox
    Dim txtbox As MSForms.TextBox
    Dim optbtn As MSForms.OptionButton

    Set WS = ActiveSheet

With WS

    For i = 1 To ItemsListFrame.Controls.Count
        For Each ctl In ItemsListFrame.Controls
            If TypeName(ctl) = "Label" Then
                If ctl.Tag = "GroupItem" & i Then
                    Set lbl = ctl
                    If Controls("Item" & i).Value <> vbNullString Then
                        .Range("A" & i + 6).Offset(0, 0).Value = Me.OrderNo.Value
                        .Range("A" & i + 6).Offset(0, 1).Value = Me.NextCollectionDate.Text
                        .Range("A" & i + 6).Offset(0, 1).Value = Format(.Range("A" & i + 6).Offset(0, 1).Value, "dd/mm/yyyy")
                        .Range("A" & i + 6).Offset(0, 8).Value = Me.DateReturnBy.Value
                        .Range("A" & i + 6).Offset(0, 8).Value = Format(.Range("A" & i + 6).Offset(0, 8).Value, "dd/mm/yyyy")
                        Controls("OrderLbl" & i).Enabled = True
                    End If
                End If

            ElseIf TypeName(ctl) = "ComboBox" Then
                If ctl.Tag = "GroupItem" & i Then
                    Set cmb = ctl
                    If Controls("Item" & i).Value <> vbNullString Then
                        Controls("Item" & i).Enabled = True
                    End If
                    If Controls("Item" & i).Value <> vbNullString Then
                        .Range("A" & i + 6).Offset(0, 2).Value = Controls("Item" & i).Text
                    End If
                End If

            ElseIf TypeName(ctl) = "TextBox" Then
                If ctl.Tag = "GroupItem" & i Then
                    Set txtbox = ctl
                    If Controls("Item" & i).Value <> vbNullString Then
                        .Range("A" & i + 6).Offset(0, 3).Value = Controls("Qty" & i).Value
                        .Range("A" & i + 6).Offset(0, 4).Value = Controls("UnitPrice" & i).Value
                        .Range("A" & i + 6).Offset(0, 5).Value = Controls("SubTotal" & i).Value
                        .Range("A" & i + 6).Offset(0, 7).Value = Controls("Comments" & i).Value
                        Controls("Qty" & i).Enabled = True
                        Controls("UnitPrice" & i).Enabled = True
                        Controls("SubTotal" & i).Enabled = True
                        Controls("Comments" & i).Enabled = True
                    End If
                End If
            ElseIf TypeName(ctl) = "OptionButton" Then
                If ctl.Tag = "GroupItem" & i Or ctl.Tag = "InOut" & i Then
                    Set optbtn = ctl
                    If Controls("Item" & i).Value <> vbNullString Then
                        .Range("A" & i + 6).Offset(0, 6).Value = Controls("OptionOut" & i).Value
                        Controls("OptionIn" & i).Enabled = True
                        Controls("OptionOut" & i).Enabled = True
                    End If
                End If
            End If
        Next ctl
      Next i
End With

End Sub
...