我正在 Excel 中创建一个用于“平板电脑”的输入表单,供我们的人员在现场填写。由于下拉菜单等输入非常繁琐,我希望使用带有大型“通过/失败”命令按钮的基本输入表单。我没有使用单独的命令框来调用表单,而是选择使用以下代码(在对象/工作表中)在选择某些单元格时调用表单:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Count = 2 Then
If Not Intersect(Target, Me.Range("W16:W46,W74:W143")) Is Nothing Then
PFInputForm.Show
End If
End If
End Sub
输入表单调用与 ActiveCell 相关的信息,使用表单中的以下代码填充项目编号、说明和注释。
Private Sub UserForm_Initialize()
PFInputForm.INPUTCOMMENT.Text = CStr(ActiveCell.Offset(0, 1).Value)
PFInputForm.ITEMNO = "Item " & ActiveCell.Offset(0, -2)
PFInputForm.ITEMDESCR = ActiveCell.Offset(0, -1)
End Sub
目的是让用户输入评论(如果适用),然后单击“通过”、“失败”、“通过并继续”和“失败并继续”四个按钮之一。
如果他们点击“通过”或“失败”,我会在表单中编写代码将注释框中的文本返回到相邻的单元格(使用偏移量),在活动单元格中分别输入“P”或“F”,然后毫无问题地关闭用户表单(在表单中使用以下代码)。
Private Sub PASSButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
End Sub
我遇到的问题是,当我希望用户单击“通过并继续”或“失败并继续”时,上述操作应该发生,但活动单元格随后向下移动一个单元格,并打开一个特定于该行的新表单。
我目前从 FORM 运行的“通过并继续”代码如下。我遇到的问题是,当新 Form 打开时,我可以看到 Sheet 上选择了新的活动单元格,但该表单仍在调用上一个 ActiveCell 中的信息。
Private Sub PCONTButton_Click()
PFInputForm.Hide
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
End Sub
我尝试了几种方法都没有成功,包括隐藏用户表单(在表单代码和表单代码中),但是在花了几个小时搜索这个论坛(和其他论坛)之后,我觉得我现在只是在黑暗中摸索!
答案1
感谢另一位用户,我找到了解决方案。我在调用表单的函数中添加了一个额外的 IF THEN 语句,该语句在单元格 AI14(以 1 开头)中查找标志(1 或 0):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("AI14") Then
If Selection.Count = 2 Then
If Not Intersect(Target, Me.Range("W16:W46,W74:W143")) Is Nothing Then
Range("AI14") = 0
PFInputForm.Show
End If
End If
End If
End Sub
然后,我为 PASS 和 FAIL 按钮添加了一个标志,将其改回 1:
Private Sub PASSButton_Click()
Range("AI14") = 1
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
PFInputForm.Hide
End Sub
我省略了“继续”按钮上的标志更改,以将标志保持在零,因此顶部代码不会继续。然后,我在“继续”按钮代码中添加了一些额外的内容,以便它从新的 ActiveCell 中提取相关信息:
Private Sub PCONTButton_Click()
ActiveCell = "P"
ActiveCell.Offset(0, 1) = PFInputForm.INPUTCOMMENT
ActiveCell.Offset(1, 0).Select
PFInputForm.INPUTCOMMENT.Text = CStr(ActiveCell.Offset(0, 1).Value)
PFInputForm.ITEMNO = "Item " & ActiveCell.Offset(0, -2)
PFInputForm.ITEMDESCR = ActiveCell.Offset(0, -1)
End Sub
此代码使用与初始化表单的代码相同的信息源(参见原始帖子)
我只需要整理“继续”编码的末尾,以便一旦到达列表中的最后一项,标志就会返回为 1。
希望这可以帮助!