1

中,我有一个宏,当双击一个单元格时,会打开一个表单。

当相关单元格位于表单将出现的范围内时,会在表单中执行不希望的选择。

我怎样才能避免这种选择?


来自 hammejdp 对 barrowc 的回答的建议编辑:

我已经使用了这个(即 BeforeDoubleClick 事件)但没有解决问题

Private Sub Workbook_SheetBeforeDoubleClick(ByVal sh As Object, ByVal target As Range, cancel As Boolean)

Call s_Click_DoubleClick(sh, target, cancel)

End Sub

Private Sub Workbook_SheetBeforeRightClick(ByVal sh As Object, ByVal target As Range, cancel As Boolean)

Call s_Click_DoubleClick(sh, target, cancel)

End Sub

Private Sub s_Click_DoubleClick(sh, target, cancel)

Application.ScreenUpdating = False

If sh.Name <> "Legende" Then
    cancel = True
    ' Maak gebruik van een range
    vRowCount = target.Rows.Count
    vColumnCount = target.Columns.Count
    f_Input.TextBox1.Value = vColumnCount
4

5 回答 5

1

设置 Cancel = True 将不起作用。这是一些可以解决问题的代码。它不漂亮,但它有效。首先,在用户窗体初始化时禁用 ListBox:

Private Sub UserForm_Initialize()
    Me.listMyList.Enabled = False
End Sub

这将防止来自 BeforeDoubleClick 事件的第二次单击被解释为用户表单上列表框中的选择(或者更确切地说,它将阻止第二次单击被解释为这样的能力,因为控件未启用)。接下来,在用户窗体的 MouseDown 事件上启用 ListBox:

Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Me.listMyList.Enabled = True
End Sub

它不漂亮,但它有效。

于 2013-10-03T19:40:12.143 回答
1

如果您正在使用该BeforeDoubleClick事件,请尝试Cancel在事件处理程序中设置为 True

于 2012-10-28T02:13:38.450 回答
1

设置 Cancel = True 并不能解决问题。要复制错误,请创建一个带有列表框的用户表单,并将列表框行源设置为一系列单元格。在工作表的 BeforeDoubleClick 事件中,插入代码以启动表单(例如 frmMyform.Show)。现在双击工作表中心的某处,在屏幕上将出现表单的区域中。将发生的情况是,双击的第二次单击将被解释为试图在表单上进行选择。

这是复制问题的另一种方法。执行与上述相同的操作,但在双击期间按住第二次单击。正如您将看到的,您的用户表单甚至在您释放双击的第二次单击之前就出现了。在按住鼠标的同时,可以左右拖动鼠标,看到当你松开第二次点击时,鼠标实际上选择了鼠标指针所在的列表框中的项目。

总而言之,海报的意图是双击单元格将启动一个表单。效果是它确实启动了表单,但也将双击中的第二次单击解释为对该表单的单击。设置 Cancel = True 并不能解决问题。

于 2013-10-03T19:19:03.890 回答
1

最初提出的问题来自 2012 年,但我今天在使用 Microsoft 365(Win 10 Home 64 位、64 位 Office)时遇到了同样的问题。在这里尝试了所有建议,但没有一个可靠地工作。(多次双击后)这似乎对我使用模态用户表单。我使用 Sleep() 因为 1 秒似乎有点长。

在带有 BeforeDoubleClick 事件的工作表上:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Application.OnTime (Now + TimeValue("00:00:00")), "mdlInventory.Load_UserForm"
    Call mdlInventory.Inventory_DblClick ' Some extra code unrelated to the userform.
    Cancel = True

End Sub

在 mdlInventory(标准模块)上:睡眠声明(我不太熟悉这些声明,可能会遗漏一些东西)

#If VBA7 Then ' Excel 2010 or later
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
#Else ' Excel 2007 or earlier
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
#End If

以及加载用户表单的子:

Private Sub Load_UserForm()

    Sleep (50)
    DoEvents
    Load frm_Inventory
    frm_Inventory.Show

End Sub

50 毫秒的睡眠似乎正在完成这项工作(由于计时器分辨率,实际睡眠可能会多一点)。我没有费心测试更少。不要认为Cancel=True是必需的,但它有助于在关闭用户窗体后光标卡在双击的单元格内。

于 2020-12-16T18:26:41.613 回答
0

到目前为止,我发现的最佳解决方案是在表单代码的初始化例程中稍加延迟,如下所示:

私有子 UserForm_Initialize()

Application.Wait(现在 + #12:00:01 AM#)

结束子

时间的最小增量似乎是 1 秒。如果有人有更清洁的解决方案或能够将延迟减少到不到 1 秒,请分享。请注意,此处的“睡眠”功能在阻止表单单击时不起作用(Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long))。

于 2016-05-02T19:52:41.853 回答