【问题标题】:How to "Snap" To the Top of a RefEdit Selection如何“捕捉”到 RefEdit 选择的顶部
【发布时间】: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 捕捉到选择的顶部,然后再次显示用户表单而不是使用户表单无模式?

标签: excel vba events userform


【解决方案1】:

资格示例,包括对用户表单的无模式调用:

public ws as worksheet

sub launch_userform()
    set ws = activesheet
    userform1.show vbmodeless
end sub

重要的是要注意这是在用户表单之前调用的,因为当用户表单是焦点时没有“活动”工作表。


edit1:将给出一个更强有力的例子......

在名为“moo”的模块内:

Option Explicit

Public ws As Worksheet

Sub fdsa()
    Set ws = ActiveSheet
    Application.Run ("cat.mouse")
End Sub

在“猫”模块内:

Option Explicit

Private Sub mouse()
    ws.Cells(1, 1).Value = 2
End Sub

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2016-09-13
    • 1970-01-01
    • 2017-10-29
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多