将用户表单复选框选择保存到数组(以在用户表单上复制)

Save userform checkbox selections to array (to replicate on userform)

如何识别用户表单框架中的所有 selected 复选框并将它们分配给数组,以便我可以 either/both:复制 selected 复选框在一个或多个其他框架中并使用数组填写电子表格单元格?

有点像一个由两部分组成的问题,但我认为它们是齐头并进的(我不确定)。我有一个带有多个框架的用户窗体,每个框架内都有很多复选框(SS)——我对所有这些框架都有一个标准的命名约定(底部解释)。

我需要确定哪些复选框是 selected(以及组合框中的 selection),这样我就可以将所有这些都放入电子表格中。如果 s/he想要。我有一个 "Copy" 按钮,可以将一个简短的用户表单初始化为 select 要从哪个框架复制以及要复制到哪个框架。 (例如:能够将 "Alpha Antennas" 帧中的所有 select 离子复制到 "Beta Antennas" 帧、"Gamma Antennas" 帧、"Delta Antennas" 帧中的一个或多个。 ) 真的坚持在我得到它后在主窗体中做什么?我认为一个数组将为我提供我需要的两个功能(将一帧复制到另一帧并填写电子表格)——但我不知道下一步。有帮助吗?

一些code/naming/SS:

加载主窗体的命令按钮:

Sub CreateADS()
Dim oneForm As Object 
'==========================================================
'On Error GoTo ErrHandler 'Trying to catch errors - will input more down there, later

    ADSinputform.Show
    For Each oneForm In UserForms
        Unload oneForm
        'Unload ADSinputform
    Next oneForm
End Sub

主用户表单开始代码:

    Dim myCheckBoxes() As clsUFCheckBox

    Private Sub UserForm_Activate()
        '======================================================
        'couple pre-initialization things here
        '======================================================
    End Sub

    Private Sub UserForm_Initialize()
    Dim chBox As Control
    Dim comboBox As Control
    Dim arrFreq() As String
    Dim i As Long
    Dim siteName As String
    Dim ctrl As Object, pointer As Long

    ReDim myCheckBoxes(1 To Me.Controls.Count)
        For Each ctrl In Me.Controls
            If TypeName(ctrl) = "CheckBox" Then
                pointer = pointer + 1
                Set myCheckBoxes(pointer) = New clsUFCheckBox
                Set myCheckBoxes(pointer).aCheckBox = ctrl
            End If
        Next ctrl

    ReDim Preserve myCheckBoxes(1 To pointer)

        'Use the Split function to create two zero based one dimensional arrays.
        arrFreq = Split("Unused|GSM,850|GSM,1900|UMTS,850|UMTS,1900|CDMA,850|LTE,700|LTE,850|LTE,1900|LTE,2100|LTE,2300", "|")
        For Each comboBox In ADSinputform.Controls
            If TypeOf comboBox Is MSForms.comboBox Then
                For i = 0 To UBound(arrFreq)
                    'Use .List property to write array data to all the comboBoxes
                    comboBox.List = arrFreq
                Next i
            End If
        Next

        MsgBox "This pops up at the end of initialization"
    End Sub

Private Sub cmdCopy_Click()
Dim chkBox As Control
Dim cmbBox As Control
Dim frmSource As MSForms.Frame
'Dim frmSource As String
Dim valSectCopy1 As String 'to validate that a sector is filled in
Dim valSectCopy2 As String 'to validate that an antenna is filled in
Dim valPortCopy As String 'to validate that a port is filled in

Set frmSource = SectorsFrame
valSectCopy1 = ""
valSectCopy2 = ""
valPortCopy = ""


    For Each chkBox In frmSource.Controls 'Sector-level frame
        If TypeName(chkBox) = "CheckBox" And chkBox.Value = True Then
            valSectCopy1 = chkBox.Tag
            valSectCopy2 = valSectCopy1
            Set frmSource = Controls(valSectCopy1)
            Exit For
        End If
    Next chkBox
    If valSectCopy1 <> "" Then
        For Each chkBox In frmSource.Controls 'Antenna-level frame
            If TypeName(chkBox) = "CheckBox" And chkBox.Value = True Then
                valSectCopy2 = chkBox.Tag
                valPortCopy = valSectCopy2
                Set frmSource = Controls(valSectCopy2)
                Exit For
            End If
        Next chkBox
    Else
        GoTo NoSource
    End If
    If valSectCopy2 <> valSectCopy1 Then
        For Each cmbBox In frmSource.Controls 'Port-level frame
            If TypeName(cmbBox) = "ComboBox" And cmbBox.Value <> "Frequency" Then
                valPortCopy = cmbBox.Value
                Exit For
            End If
        Next cmbBox
    Else
        GoTo NoSource
    End If
    If valSectCopy2 = valPortCopy Then
        GoTo NoSource
    End If



    CopySector.Show
        If CopySector.destSectCopy <> "" And CopySector.srcSectCopy <> "" Then
            MsgBox "Copying the " & CopySector.srcSectCopy & _
                " sector to " & CopySector.destSectCopy & " sector(s)."
            Unload CopySector
            Exit Sub
        Else
            Exit Sub
        End If

NoSource:
    MsgBox "You have not filled in a sector to copy." & vbCrLf & _
        "Please fill out sector info for at least one sector and try again."
    Exit Sub


    End Sub

问卷用户表单代码:

Public srcSectCopy As String
Public destSectCopy As String


Private Sub cmdCopy_Click()
Dim optBtn As Control
Dim chkBox As Control

srcSectCopy = ""
destSectCopy = ""

    For Each optBtn In Me.Controls
        If TypeName(optBtn) = "OptionButton" Then
            If optBtn.Value = True Then
                srcSectCopy = optBtn.Tag
            End If
        End If
    Next optBtn

    If srcSectCopy = "" Then
        MsgBox "You have not selected a sector to copy." & vbCrLf & _
            "Please select a sector to copy from and try again."
        Exit Sub
    End If

    For Each chkBox In Me.Controls
        If TypeName(chkBox) = "CheckBox" Then
            If chkBox.Value = True Then
                If destSectCopy = "" Then
                    destSectCopy = chkBox.Tag
                Else
                    destSectCopy = destSectCopy & ", " & chkBox.Tag
                End If
            End If
        End If
    Next chkBox

    If destSectCopy = "" Then
        MsgBox "You have not selected any sectors to copy to." & vbCrLf & _
            "Please select one or more sectors to be duplicated and try again."
        Exit Sub
    End If

    Msg = "this will copy the " & srcSectCopy & _
        " sector to " & destSectCopy & " sector(s)." & vbCrLf & _
        "Do you want to continue with the operation?"
        Ans = MsgBox(Msg, vbQuestion + vbYesNo)
        Select Case Ans
            Case vbYes
                Me.Hide
            Case vbNo
                Exit Sub
          End Select


End Sub

Private Sub UserForm_Initialize()

End Sub



Private Sub AlphaSect_OptBtn_Change()

    Select Case (AlphaSect_OptBtn.Value)
        Case True:  AlphaSect_CheckBox.Enabled = False
        AlphaSect_CheckBox.Value = False
        Case False: AlphaSect_CheckBox.Enabled = True
    End Select

End Sub

Private Sub BetaSect_OptBtn_Change()

    Select Case (BetaSect_OptBtn.Value)
        Case True:  BetaSect_CheckBox.Enabled = False
        BetaSect_CheckBox.Value = False
        Case False: BetaSect_CheckBox.Enabled = True
    End Select

End Sub

Private Sub GammaSect_OptBtn_Change()

    Select Case (GammaSect_OptBtn.Value)
        Case True:  GammaSect_CheckBox.Enabled = False
        GammaSect_CheckBox.Value = False
        Case False: GammaSect_CheckBox.Enabled = True
    End Select

End Sub

Private Sub DeltaSect_OptBtn_Change()

    Select Case (DeltaSect_OptBtn.Value)
        Case True:  DeltaSect_CheckBox.Enabled = False
        DeltaSect_CheckBox.Value = False
        Case False: DeltaSect_CheckBox.Enabled = True
    End Select

End Sub


Private Sub cmdCancel_Click()

  Msg = "Are you sure you want to cancel and exit without copying?"
        Ans = MsgBox(Msg, vbQuestion + vbYesNo)
        Select Case Ans
            Case vbYes
                Me.Hide
                Unload Me
            Case vbNo
                Exit Sub
          End Select

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If CloseMode = vbFormControlMenu Then
    ' user clicked the X button
    ' cancel unloading the form, use close button procedure instead
    Cancel = True
    cmdCancel_Click
  End If
End Sub

以下class:

Option Explicit
Public WithEvents aCheckBox As MSForms.CheckBox
Private Sub aCheckBox_Click()
Dim chBox As Control
Dim chBoxTag As String

chBoxTag = aCheckBox.Tag

If Right(aCheckBox.Parent.Name, 10) = "Port_Frame" Then
    If aCheckBox.Value = True Then ADSinputform.Controls(chBoxTag).Enabled = True
    If aCheckBox.Value = False Then
        ADSinputform.Controls(chBoxTag).Enabled = False
    End If
Else
    If aCheckBox.Value = True Then ADSinputform.Controls(chBoxTag).Visible = True
    If aCheckBox.Value = False Then
        ADSinputform.Controls(chBoxTag).Visible = False
        For Each chBox In ADSinputform.Controls(chBoxTag).Controls
            If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False
        Next
    End If
End If
End Sub

我不确定这是否可以完成,我什至不确定从哪里开始。我知道我可以循环遍历所有控件并读取状态或组合框 selection,但之后要做什么?

命名: 帧数:"AlphaSect_Frame"、"BetaSect_Frame"、"GammaSect_Frame"

一级复选框:"A1Checkbox"、"A2Checkbox"、"A3Checkbox"..."B1Checkbox"、"B2Checkbox"..."C1Checkbox"、 "C2Checkbox"

二级复选框:"A1P1Checkbox"、"A1P2Checkbox"、"A2P1Checkbox"、"A2P2Checkbox"..."B1P1Checkbox"、"B1P2Checkbox"、"B2P1Checkbox", "B2P2Checkbox"... "C1P1Checkbox", "C1P2Checkbox", "C2P1Checkbox", "C2P2Checkbox"

用户表单截图:

这是一个包含两个框架的表单的简单示例,每个框架都有两个复选框:

Dim f1 As Frame, f2 As Frame, c As Control

Set f1 = Me.Frame1 'has checkboxes "f1cb1", "f1cb2"
Set f2 = Me.Frame2 'has checkboxes "f2cb1", "f2cb2"

'loop over all controls in Frame 1
For Each c In f1.Controls
    If TypeName(c) = "CheckBox" Then
        'set the value of the corresponding control in the other fame
        Me.Controls(Replace(c.Name, "f1", "f2")).Value = c.Value
    End If
Next c