【问题标题】:Using Option Buttons on a UserForm to place text in a range from the sub calling the UserForm使用用户窗体上的选项按钮将文本放置在调用用户窗体的子范围内
【发布时间】:2017-01-20 20:48:02
【问题描述】:

如果这是在其他地方发布的,我深表歉意,但我在理解 sub 调用用户表单和用户表单控件之间的关系时遇到了问题。我有一个子程序,可以将数据从另一个工作表填充到工作表中。需要填写的单元格之一是对项目数量变化的解释。我生成了一个带有选项按钮的用户表单,用户可以从中选择适当的“原因”。单击确定按钮后,它将把选定的原因放在工作表的单元格中。

在 sub 中,我使用范围内的 For Each 单元格来为高于特定条件的每个值填充行中的数据,并且它应该显示满足条件的每个单元格的表单。我可以将我用作行引用的单元格传递到用户表单中,以便它可以使用该单元格作为偏移量来输入所选的“原因”然后卸载表单吗?

Private Sub okbutton1_Click(bc As Range)  'bc should be the range from the sub calling this form

Select Case True
Case OptionButton1
    If bc.Offset(0, 3).Value = "A" Then
        Set bc.Offset(0, 6).Value = "Actual amount required is more than plan quantity."
    Else
        Set bc.Offset(0, 6).Value = "Actual amount required is less than plan quantity."
    End If
Case OptionButton2
        Set bc.Offset(0, 6).Value = "This items was not constructed/used/required."
Case OptionButton3
        Set bc.Offset(0, 6).Value = "Only a portion of the contingency was required for items not in original plan."
Case OptionButton4
        Set bc.Offset(0, 6).Value = "Deficiency levied against Contractor per IDOT Section 105.03."
Case OptionButton5
        Set bc.Offset(0, 6).Value = "Damages levied against Contractor per IDOT Section 108.09."
Case OptionButton6
        Set bc.Offset(0, 6).Value = InputBox("Please enter your reasoning below.", "Other")
End Select
Unload AuthReason2

End Sub

那么这是我用来填充工作表的子组件的一部分。

Line5:  'Populates the BLR13210A from the data entered on the BLR13210

Application.ScreenUpdating = False
Dim bws As Worksheet
    Set bws = Worksheets("BLR 13210A")
Dim Arange As Range
    Set Arange = aws.Range("AZ34:AZ198")
Dim Bcell As Range  ' First cell in AttachA form
    Set Bcell = bws.Range("B11")

For Each ACell In Arange
    If ACell.Value > 1999.99 Then
        Bcell.Value = ACell.Offset(0, -47).Value
        Bcell.Offset(0, 1).Value = ACell.Value
        Bcell.Offset(0, 2).Value = ACell.Offset(0, -37).Value
        Bcell.Offset(0, 3).Value = ACell.Offset(0, -22).Value
        AuthReason2(Bcell).Show
    End If
    Bcell = Bcell.Offset(1, 0)

Application.ScreenUpdating = True

提前感谢您的帮助。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    应使用用户表单来检索用户输入并将其传递给处理子程序,该子程序将相应地处理数据

    所以你最好反其道而行之,即:

    • 你的主子

      应该“启动”用户表单并从中检索数据,处理这些数据以作用于其他数据,然后关闭用户表单

      可能是这样的:

      Option Explicit
      
      Sub main()
      
          Dim bws As Worksheet
              Set bws = Worksheets("BLR 13210A")
          Dim Bcell As Range  ' First cell in AttachA form
              Set Bcell = bws.Range("B11")
      
          With UserForm1 '<--| change "UserForm1" to your actual userform name
              .Tag = Bcell.Offset(0, 3).Value '<--| store the value you want to share with Userform in its 'Tag' property
              .Show '<-- show the userform and have it process user inputs
              Bcell.Offset(0, 6).Value = .Tag '<--| retrieve the value that userform has left in its 'Tag' property accordingly to user inputs
          End With
          Unload UserForm1 '<--| change "UserForm1" to your actual userform name
      
      End Sub
      

      当然,您可以将Bcell.Offset(0, 3).Value 更改为适合您需要的任何范围值

    • 你的用户表单

      将处理用户输入并将其传递回子

      有很多方法可以做到,但以下可以满足您的需求

      在其代码窗格中放入如下内容:

      Option Explicit
      
      Private Sub okbutton1_Click()  
          Dim txt As String
      
          With Me '<--| reference the userform
              Select Case True
                  Case .OptionButton1 '<--| with the dot (.) access the referenced object members (in this case its controls)
                      If .Tag = "A" Then '<--| query the value that the calling sub has left in the useform 'Tag' property
                          txt = "Actual amount required is more than plan quantity."
                      Else
                          txt = "Actual amount required is less than plan quantity."
                      End If
                  Case .OptionButton2
                      txt = "This items was not constructed/used/required."
                  Case .OptionButton3
                      txt = "Only a portion of the contingency was required for items not in original plan."
                  Case .OptionButton4
                      txt = "Deficiency levied against Contractor per IDOT Section 105.03."
                  Case .OptionButton5
                      txt = "Damages levied against Contractor per IDOT Section 108.09."
                  Case .OptionButton6
                      txt = InputBox("Please enter your reasoning below.", "Other")
                  Case Else '<--| you may want to handle the case when the user dosen't select any option
                      txt = "some text" '<--| change it to your needs
              End Select
              .Tag = txt '<--| use 'Tag' property to store the value you want to pass back to the calling sub
      
              .Hide '<--| hide the userform
          End With
      End Sub
      

    【讨论】:

    • 谢谢。这对我想要做的很完美。
    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多