双击时避免在表单中进行选择

时间:2012-10-27 07:59:53

标签: excel excel-vba double-click vba

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

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

如何避免这种选择?


来自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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

设置取消= True无法解决问题。要复制错误,请使用列表框创建用户表单,并将列表框行源设置为一系列单元格。在工作表的BeforeDoubleClick事件中,插入代码以启动表单(例如frmMyform.Show)。现在双击工作表中心的某个位置,在屏幕上将显示表单的区域中。会发生什么是双击的第二次点击将被解释为尝试在表单上进行选择。

这是另一种复制问题的方法。与上面相同,但在双击HOLD DOWN期间,第二次单击。正如您将看到的,在您再次发出双击的第二次单击之前,您的用户表单就会出现。在按住鼠标的同时,您可以拖动鼠标并看到当您放开第二次单击时,鼠标实际上会选择鼠标指针所在的列表框中的项目。

总而言之,海报的目的是双击单元格将启动表单。结果是它确实启动了表单,但也解释了双击中的第二次单击以及单击该表单。设置取消= True无法解决问题。

答案 2 :(得分:1)

设置取消= 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

它不漂亮,但它有效。

答案 3 :(得分: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 ms的睡眠似乎可以完成工作(由于计时器的分辨率,实际的睡眠可能更多一些)。我没有花更少的时间进行测试。不要以为Cancel=True是必需的,但是它有助于在用户表单被关闭后将光标卡在双击的单元格内。

答案 4 :(得分:0)

我到目前为止找到的最佳解决方案是在表单代码的初始化例程中稍微延迟:

Private Sub UserForm_Initialize()

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

End Sub

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