Excel VBA之类模块 实例

来源:互联网 发布:java excel报表制作 编辑:程序博客网 时间:2024/05/01 16:57
什么是类:将用户定义类型和过程组织在一起即是类,类是一个模板,对象是由它而创建的。
什么是类模块:含有类定义的模块,包括其属性和方法的定义。
怎么建立类模块:建立类模块的方法和建立模块的方法是一样的,只是选择建立的项目是类模块。
上面就是现在我对类模块的了解,不多,甚至自己也有很多不理解的地方,在类模块的使用方面,记忆里曾经在学VB时编一个贪吃小蛇时,用过类来实现队列(先进先出的一种数据结构),之后就仅仅用类创建一个Application 对象来即时监控Excel,下面就将这个应用的代码列给大家。
还记得在自定义菜单中定义的名为“Excel各页名”的宏吧,当没有可见的工作簿时,如果运行此宏就会出错,因为无法写入内容。上贴我们已给这个宏加入了快捷键的功能,使它更方便的使用,而这一贴我们就要利用类模块,让它更完美。
其实只要在这个宏的代码里加入检验的代码,即可以不会出错,但实际,我们还是运行了这个宏。细心的朋友有没有发现,当Excel无可见工作簿时,一些工具栏和菜单里的项目是不可使用的,那我们今天也来实现这个功能。
首先要建立一个类模块,名为MenuClass,注意,这个名称对应着后面的代码,如果改动的话,后面也需要进行相应的修改,类模块的代码如下:
'定义一个 Application 对象
Public WithEvents xlApp As Excel.Application
'定义一个按钮控件属性,用来对应相应的菜单项
Public XMenu As CommandBarButton
'定义一个字符串,用来保存相应的快捷键
Public XOnkey As String
'定义一个字符串,用来保存相应的宏名称
Public XSubName As String
'当文件新建打开关闭隐藏时都有可能使可见的工作簿数量变动
'但我们只要监控WorkbookActivate(激活任一工作簿)事件与
'WorkbookDeactivate(工作簿由活动转为非活动状态)事件即可。
'下面即是相对应的代码:
Private Sub xlApp_WorkbookActivate(ByVal Wb As Workbook)
If XMenu Is Nothing Then
Exit Sub
End If
If Wb.Windows(1).Visible Then
XMenu.Enabled = True
Application.Onkey XOnkey, XSubName
End If
End Sub
Private Sub xlApp_WorkbookDeactivate(ByVal Wb As Workbook)
Dim XWindow As Window
If XMenu Is Nothing Then
Exit Sub
End If
For Each XWindow In xlApp.Windows
If XWindow.Caption <> Wb.Name And XWindow.Visible Then
XMenu.Enabled = True
Application.Onkey XOnkey, XSubName
Exit Sub
End If
Next
XMenu.Enabled = False
Application.Onkey XOnkey
End Sub
完成类模块的代码后,我们即可以使用这个类。下面是在mian模块中的一些相应的代码:
'定义一个我们自定义的类
Dim EMenu As New MenuClass
Dim AName, MName(2, 1), DelMenu(2) As Boolean
Sub auto_close()
Dim MyMenu As CommandBarPopup
Dim MyBtn As CommandBarButton
Dim i As Byte
Application.Onkey "^%a"
Set EMenu.XMenu = Nothing
Set MyMenu = CommandBars("Worksheet Menu Bar").Controls(AName)
For i = 0 To UBound(MName)
If DelMenu(i) Then
Set MyBtn = MyMenu.CommandBar.Controls(MName(i, 0))
If MyBtn Is Nothing Then
Error = True
Else
MyBtn.Delete
End If
End If
Next
If MyMenu.CommandBar.Controls.Count = 0 Then
MyMenu.Delete
Else
For i = 1 To MyMenu.CommandBar.Controls.Count
Set MyBtn = MyMenu.Controls(i)
MyBtn.FaceId = MyBtn.Index + 79
Next
End If
If Err.Number > 0 Then
MsgBox "文件关闭时卸载菜单发生异常!" & vbCrLf & _
"自动生成的菜单可能已被卸载!" & vbCrLf & _
"或生成的菜单没有完全被卸载!", vbExclamation, "错误"
End If
End Sub
Sub auto_Open()
Dim MyMenu As CommandBarPopup
Dim MyBtn As CommandBarButton
Dim i As Byte
Dim XT As String
On Error Resume Next
AName = "自定义(&Z)" '菜单名称
MName(0, 0) = "百度Excel吧(&A)" '菜单项名称
MName(0, 1) = "BaiDuExcelBa" '指定宏名称
MName(1, 0) = "Excel吧主页(&B)" '菜单项名称
MName(1, 1) = "ExcelBaZy" '指定宏名称
MName(2, 0) = "Excel各页名(&C)" '菜单项名称
MName(2, 1) = "Excel各页名" '指定宏名称
Set MyMenu = CommandBars("Worksheet Menu Bar").Controls(AName)
If MyMenu Is Nothing Then
Set MyMenu = CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
MyMenu.Caption = AName
End If
For i = 0 To UBound(MName)
Set MyBtn = MyMenu.CommandBar.Controls(MName(i, 0))
If MyBtn Is Nothing Then
DelMenu(i) = True
Set MyBtn = MyMenu.CommandBar.Controls.Add(Type:=msoControlButton)
With MyBtn
.Style = msoButtonIconAndCaption
.FaceId = 79 + MyBtn.Index
.Caption = MName(i, 0)
.OnAction = MName(i, 1)
End With
Else
DelMenu(i) = False
XT = XT & vbCrLf & MName(i, 0)
End If
Set MyBtn = Nothing
Next
'初始化相关的属性
Set EMenu.XMenu = MyMenu.CommandBar.Controls(3)
EMenu.XMenu.Enabled = False
For Each XWindow In Application.Windows
If XWindow.Visible Then
EMenu.XMenu.Enabled = True
Exit For
End If
Next
Set EMenu.xlApp = Application
EMenu.XOnkey = "^%a"
EMenu.XSubName = "Excel各页名"
Application.Onkey EMenu.XOnkey, EMenu.XSubName
If Len(XT) > 0 Then
MsgBox "已存在菜单名:" & XT & vbCrLf & "不能再被加载!", vbExclamation, "错误"
End If
End Sub 
原创粉丝点击