【发布时间】:2019-05-25 18:08:40
【问题描述】:
我正在使用 VBA 在 Excel 2016 中开发用户表单。
我在用户窗体上有 2 个 RefEdit 控件。一旦用户在任一 RefEdit 控件中进行选择,然后进入另一个 RefEdit 控件以进行下一个选择,我希望电子表格“捕捉”到另一个 RefEdit 中指定的选择的顶部(这使得选择长时间的可用性大的差异)。
注意:我不希望在吸附到顶部时更改工作表中的活动单元格。
下面是我尝试过的一些方法的操作代码(除了一个被注释掉了)。 Application.Goto 方法似乎正是我正在寻找的,但是目前无法正常工作。
Private Sub RefEdit1_Enter()
If Len(Trim(RefEdit1.value)) = 0 And Len(Trim(RefEdit2.value)) > 0 Then
Application.Goto Reference:=Range(RefEdit2).Offset(0, 1), Scroll:=True
'Range(RefEdit2).Offset(0, 1).Select
'Range(RefEdit2).Cells(1, 1).Select
'SendKeys "{ESC}"
'Application.CutCopyMode = False
End If
End Sub
Private Sub RefEdit2_Enter()
If Len(Trim(RefEdit2.value)) = 0 And Len(Trim(RefEdit1.value)) > 0 Then
Application.Goto Reference:=Range(RefEdit1).Offset(0, 1), Scroll:=True
'Range(RefEdit1).Offset(0, 1).Select
'Range(RefEdit1).Cells(1, 1).Select
'SendKeys "{ESC}"
'Application.CutCopyMode = False
End If
End Sub
此代码不会产生任何错误消息,只是无法按预期执行。可能是因为没有与 Range(RefEditi) 规范关联的工作表属性?如果是这样,捕获与 RefEdit 选择关联的活动工作表的好方法是什么?
================================================
我确实尝试使用此代码捕获活动的工作簿/工作表,但它使用户窗体消失了:
Private Sub RefEdit1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set WBData = Application.ActiveWorkbook
Set WSData = Application.ActiveWorksheet
End Sub
Private Sub RefEdit2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set WBData = Application.ActiveWorkbook
Set WSData = Application.ActiveWorksheet
End Sub
用户表单消失的问题是否与允许后台活动问题有关?
【问题讨论】:
-
您需要完全限定范围,例如wb/ws/cell,以便使用它。这类似于在用户窗体中为控件指定“我”。旁注,如果您希望电子表格在表单启动时开始“捕捉”,则用户表单将需要允许后台活动。
-
感谢您的回复。一些后续问题:1)有关完全限定范围的问题,请参阅上面的问题编辑。 2)如何让用户表单允许后台活动?
-
userform.show vbmodeless 应该允许您处理电子表格
-
关于资格,在 userform.show 宏内部,将工作簿/工作表保存为公共变量,以便您可以在其他模块中使用它
-
嗨西里尔,让我为你做点事:我读过人们过去使用无模式用户表单时遇到的重大问题。一个可行的选择可能是快速隐藏用户表单,让 excel 捕捉到选择的顶部,然后再次显示用户表单而不是使用户表单无模式?