事件给Excel VBA编程带来了很多的奇妙,让Excel真正实现与用户的实时互动。在前面的系列文件中,通过讲解Workbook对象的几个事件,我们可以体会到事件编程给我们带来的新奇的感觉。接下来的文章中,我们通过一些示例,学习工作簿事件,并进一步体会到事件编程的妙处。
示例:在单元格快捷菜单中添加自定义列表
有时候,我们可以创建自定义列表,方便在单元格中输入一系列数据。例如,在自定义序列中,我们定义了一个序列:洪七公、小龙女、穆念慈、江小鱼、花无缺,如图1所示。
图1
此时,我们可以在任意工作表单元格中输入“洪七公”,然后拖动该单元格右下角的填充句柄向下拖动到其他单元格,Excel会根据自定义的序列在下面的单元格中自动输入“小龙女、穆念慈、…”。也就是说,我们只需输入序列中的第一个数据,余下的就不用管了!
然而,自定义序列多了或者时间长了,可能不记得序列第一个数据。我们可以将自定义的序列放置在单元格右键菜单中并显示序列第一个数据(如图2所示),这样只需单击右键,在快捷菜单中选择要输入的序列,然后向下拖动即可。
图2
下面是实现代码。
主演:雷佳音 / 佟丽娅 / 徐峥
首先,在标准模块中输入代码:
Sub AddFirstList()
Dim strList As String
strList = Application.CommandBars.ActionControl.Caption
If Not strList Like '*...*' Then Exit Sub
ActiveCell = Left(strList, InStr(1, strList, '.',vbTextCompare) - 1)
End Sub
在ThisWorkbook代码模块中,Workbook_ SheetBeforeRightClick事件的代码:
Private Sub Workbook_SheetBeforeRightClick(ByValSh As Object, ByVal Target As Range, Cancel As Boolean)
Dim cmbBtn As CommandBarButton
Dim lngListCount As Long
Dim lngCount As Long
Dim strList As String
Dim MyList
On Error Resume Next
With Application
lngListCount = .CustomListCount
For lngCount = 1 To lngListCount
MyList =.GetCustomListContents(lngCount)
strList =.CommandBars('Cell').Controls(MyList(1) & _
'...' & MyList(UBound(MyList))).Caption
.CommandBars('Cell').Controls(strList).Delete
Set cmbBtn =.CommandBars('Cell').Controls.Add(Temporary:=True)
With cmbBtn
.Caption = MyList(1) &'...' & MyList(UBound(MyList))
.Style = msoButtonCaption
.OnAction ='AddFirstList'
End With
Next lngCount
End With
On Error GoTo 0
End Sub
代码输入完成后,回到工作表中,结果演示如图3所示。
图3
代码运用了SheetBeforeRightClick事件,其语法为:
Workbook_SheetBeforeRightClick(ByValSh As Object, ByVal Target As Range, Cancel As Boolean)
说明:
当在工作簿的任意工作表中单击右键时发生此事件,并且事件发生在默认的右击操作之前。
参数Sh,代表工作表对象。
参数Target,代表单元格对象,即最接近右击时光标所在位置的单元格。
参数Cancel,当事件发生时为False。如果将该参数设置为True,则不会执行默认的右击操作。
下面的代码禁止默认的右键单击操作:
Private Sub Workbook_SheetBeforeRightClick(ByValSh As Object, _
ByVal Target As Range, ByVal Cancel AsBoolean)
Cancel= True
End Sub
联系客服