excel_vba_编程教程(完整版)-第80部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
ByVal Arg1 As Long; ByVal Arg2 As Long)
If Arg1 0 And Arg2 0 Then
MsgBox ElementID & 〃; 〃 & Arg1 & 〃; 〃 & Arg2
End If
If ElementID = 4 Then
MsgBox 〃You've selected the chart title。〃
ElseIf ElementID = 24 Then
MsgBox 〃You've selected the chart legend。〃
ElseIf ElementID = 12 Then
MsgBox 〃You've selected the legend key。〃
ElseIf ElementID = 13 Then
MsgBox 〃You've selected the legend entry。〃
End If
End Sub
ElementId返回一个代表所选图表成员的常数。参数Arg1和Arg2用于某些相关的
图表成员上。例如,图表坐 标轴(ElementId=21),可以明确是主坐标轴(Arg1=0)
或者次坐标轴 (Arg1=1),而坐标轴的类型则由 参数Arg2确定,它可以是下述
三种之一:
0 – 分类轴,1 – 数值轴,或者3 – 系列轴
SeriesChange 当用户更改图表数据点时,引发该事件。图表对象应该在类模块
里使用 关键字WithEvents进行声明。
Calculate 当用户选择新数据或者改变图表数据时,引发该事件。
Private Sub Chart_Calculate()
MsgBox 〃The data in your spreadsheet has 〃 & vbCrLf _
& 〃changed。 Your chart has been updated。〃
End Sub
Resize 当用户改变图表大小时,引发该事件。该图表对象应该在类模块
里面使 用WithEvents关键字来声明
DragOver 当用户拖曳数据到该图表时,引发该事件。该图表对象应该在类
模块里 面使用WithEvents关键字来声明
DragPlot 当用户拖曳单元格区域到图表时,引发该事件。该图表对象应
该在类模 块里面使用WithEvents关键字来声明
BeforeDoubleClick 当用户双击图表时,引发该事件
BeforeRightClick 当用户右键单击图表时,引发该事件
Private Sub Chart_BeforeRightClick(Cancel As Boolean)
Cancel = True
End Sub
当你将参数Cancel设置为True后,你就不能访问图表区域快捷菜单了
MouseDown 当光标在图表之上并按下鼠标时,引发该事件
Private Sub Chart_MouseDown(ByVal Button As Long; _
ByVal Shift As Long; ByVal x As Long; ByVal y As _
Long)
If Button = 1 Then
MsgBox 〃You pressed the left mouse button。 〃
ElseIf Button = 2 Then
283
… 页面 300…
MsgBox 〃You pressed the right mouse button。 〃
Else
MsgBox 〃You pressed the middle mouse button。 〃
End If
End Sub
按键参数决定哪个鼠标键被按下(MouseDown事件),或者释放(MouseUp事件)了:
1 – 鼠标左键,2 – 鼠标右键,4 – 鼠标中键
Shift参数明确Shift键,Ctrl键和Alt键的状态:
1… 选择了Shift键,2 – 选择
了Ctrl键,以及4 – 选择了Alt
键 参数x; y 分别明确鼠标指
针坐标
ouseMove 当鼠标指针坐标在图表之上变化时,引发该事件
MouseUp 当鼠标按键在图表之上释放时,引发该事件
7。内嵌图表事件
想要捕捉工作表内嵌图表的事件的话,那么你首先要在类模块里使用关键字WithEvents创建一个
新的对象。我们按照下述步骤 来看看如何实现它:
1。 激活VB编辑器窗口
2。 在工程浏览器里,选择VBAProject(ChartEvents。xls)
3。 选择插入|类模块
4。 在类模块文件夹里,你将看到一个名叫Class1的模块
5。 在属性窗口,将Class1重命名为clsChart
6。 在类模块的代码窗口里,声明一个对象变量,它将代表产生事件的图表对象
Public WithEvents xlChart As Excel。Chart 关键字Public将使对象变量xlChart可用于当
前VBA工程里的所有模块。使用WithEvents关键字声明一个对象变量,将暴露 该被定义对象
类型的所有事件。输入上述声明之后,对象变量xlChart就会添加到代码窗口左上角地对象
下拉列表中去,而 与该对象变量相对应的事件就会出现在代码窗口右上角的过程下拉列表
里面。
7。 打开对象下拉列表框并选择变量xlChart名称,现在代码窗口将出现xlChart_Activate过程的
构架:
Private Sub xlChart_Activate()
End Sub
8。 在该事件过程里添加你的代码。在本练习中,我们将添加一条语句,显示一个信息框。添
加完语句后,VBA过程应该像这 样:
Private Sub xlChart_Activate()
MsgBox 〃You’ve activated a chart embedded in 〃 & _
ActiveSheet。Name
End Sub
输入完事件过程后,你仍然需要通知VB,你计划使用它。
9。 在工程浏览器窗口,双击ThisWorkbook对象,并且输入下述语句来创建名为clsChart的新示例:
Dim myChart As New clsChart 上面显示的指令声明一个名为myChart的对象变量,该变量将
指向位于类模块clsChart里的对象xlChart。关键字New告诉VB 去创建特定对象的新示例。
10。 在ThisWorkbook代码窗口输入下述过程,以初始化对象变量myChart:
Sub InitializeChart()
' connect the class module and its objects with the Chart object
Set myChart。xlChart = _
Worksheets(1)。ChartObjects(1)。Chart
End Sub
11。 运行InitializeChart过程。运行该过程之后,输入在类模块里的事件过程就会被相应的事件
引发
12。 激活Excel窗口,并且点击内嵌图表。这次,你在第七步输入的xlChart_Activate事件将会
被引发
13。 现在,你可以在类模块里给内嵌图表输入其它的事件过程了。
284
… 页面 301…
8。可为应用软件对象识别的事件
如果你想要你的事件过程无论在哪个当前活动的Excel工作簿上都能执行的话,那么你需要创建
应用软件对象的事件过程。应用 软件对象的事件过程具有全局性。这意味着只要Excel应用软件
是开启的,那么该过程代码就会响应某个事件被执行。 Application对象的事件列在接下来的表
格中。和内嵌图表类似,Application对象的事件过程要求你在类模块里使用关键字 WithEvents
创建一个新的对象。表格中示范的事件事例程序应该在类模块里面输入。如何操作呢?在VB编辑
器窗口选择插入|类 模块,在属性窗口重命名类模块为clsApplication。在clsApplication代码
窗口声明一个对象变量来代表Application对象,如下所 示:
Public WithEvents App As Application 在声明语句下面,输入下述事件过程,如表格所示:
App_NewWorkbook,App_WorkbookOpen,App_WorkbookBeforeSave, App_WorkbookBeforeClose,
App_Sheet… SelectionChange和 App_WindowActivate事件过程。你输入完这些过程在类模块里
之后,插入一个标准模块到当前VBA工程里(选择插入|模块)。在标准模块里,创建一个类
clsApplication的新示例,并且将位 于类模块clsApplication里的对象和代表Application对象
的对象变量App连接起来,如下所示:
Dim DoThis As New clsApplication
Public Sub InitializeAppEvents ()
Set DoThis。App = Application
End Sub 现在将鼠标光标置于过程InitializeAppEvents里并且按下F5键运行它。运行过程
InitializeAppEvents的结果是类
模块的对象App 将会指向Excel应用软件。从现在开始,当某个具体事件发生时,你已经输入在
类模块里的事件过程就会被执行。如果你不想相 应Application对象产生的事件的话,你可以通
过在一个标准模块里输入下述过程(并运行它):
Public Sub CancelAppEvents()
Set DoThis。App = Nothing
End Sub
当你设置对象变量为Nothing的时候,你实际上释放了内存,并且断开了对象变量和该变量指向的
对象之间的连接。当你运行过 程CancelAppEvents后,写在类模块里面的事件过程在某个事件发
生就不会自动执行。 注意:所有在本表格里示范的事件过程,都需要你在类模块里使用关键字
WithEvents声明个对象变量。
事件名称 描述
NewWorkbook 当用户创建一个新工作簿时引发该事件
Private Sub App_NewWorkbook(ByVal _
Wb As Workbook)
Application。DisplayAlerts = False
If Wb。Sheetsunt = 3 Then
Sheets(Array(2; 3))。Delete
End If
Application。DisplayAlerts = True
End Sub
WorkbookOpen 该事件发生于用户打开一个工作簿
Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
If Wb。FileFormat = xlCSV Then
If MsgBox(〃Do you want to save 〃 & vbCrLf _
& 〃 this file as an Excel workbook?〃; vbYesNo; _
〃Original file format: 〃 _
& 〃ma delimited file〃) = vbYes Then
Wb。SaveAs FileFormat:=xlWorkbookNormal
En