在excel-2007中我有一个宏,当双击一个单元格时,表单将会打开。
当相关单元位于表单出现的范围内时,在表单中执行不希望的选择。
如何避免这种选择?
来自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
答案 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))。