如果这是在其他地方发布我很抱歉,但是我在理解调用用户表单的子服务和用户表单控件之间的关系时遇到了问题。我有一个子将数据填充到另一个工作表的工作表中。需要填写的一个单元格是对项目数量变化的解释。我生成了一个带有选项按钮的用户表单,用户可以选择相应的"原因"从。单击确定按钮后,它会将所选原因放在工作表的单元格中。
在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
提前感谢您的协助。
答案 0 :(得分: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