作者:iamlaosong
VBA编程时为了界面美观,我们经常用到窗体Form(比如欢迎窗口),那么,如何做到让VBA窗体在EXCEL启动时自动运行呢?
方法有二:
第一,双击ThisWorkbook,输入以下代码(Open事件):
Private Sub Workbook_Open()
Application.Visible = False ' 关闭应用对象,只保留窗体。
Welcome.Show
End Sub
第二,也可以插入一个模块,输入下面自启动代码:
Sub Auto_Open()
UserForm1.Show
End Sub
两种方法都可以启动VBA窗体(关闭窗体:Unload UserForm1或者UserForm1.Hide)。
上面两个过程其实就是一个自启动过程,除了启动窗体,还可以干很多其他的事情,比如增加菜单,总之,一些需要在Excel启动后就完成的功能都可以放在这些过程中。下面是一个增加菜单的程序:
Open事件:
Private Sub Workbook_Open()
AddNewMenu
End Sub
模块中AddNewMenu过程,本过程也可以直接放在Open方法中,这样写是为了可读性。
'添加菜单项
'与添加新菜单一样,在添加菜单项及子菜单时,使用Add方法,且指定合适的控件类型,其代码清单如下:
Sub AddNewMenu()
Dim HelpMenu As CommandBarControl
Dim NewMenu As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim SubMenuItem As CommandBarButton
On Error Resume Next
'如果菜单已存在,则删除该菜单
CommandBars(1).Controls("循环取货(&X)").Delete
'利用ID属性查找帮助菜单
Set HelpMenu = CommandBars(1).FindControl(ID:=30010)
If HelpMenu Is Nothing Then
'如果该菜单不存在,则将新菜单添加到末尾
'设置新菜单为临时的
Set NewMenu = CommandBars(1).Controls.Add(Type:=msoControlPopup, Temporary:=True)
Else
'将新菜单添加到帮助菜单之前
Set NewMenu = CommandBars(1).Controls.Add(Type:=msoControlPopup, Before:=HelpMenu.Index, Temporary:=True)
End If
'添加菜单标题并指定热键
NewMenu.Caption = "循环取货(&X)"
'添加第一个菜单项
Set MenuItem = NewMenu.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "导入看板(&K)..."
'添加快捷键
.ShortcutText = "Ctrl+Shift+K"
.FaceId = 590 ' 不同的数值代表不同的图标
.OnAction = "ImpKanban"
End With
'添加第二个菜单项
Set MenuItem = NewMenu.Controls.Add(Type:=msoControlButton)
With MenuItem
.Caption = "导入清单(&Q)..."
'添加快捷键
.ShortcutText = "Ctrl+Shift+Q"
.FaceId = 162
.OnAction = "ImpQingdan"
End With
'添加第三个菜单项
'本菜单有子菜单项,因此其类型为msoControlPopup
Set MenuItem = NewMenu.Controls.Add(Type:=msoControlPopup)
With MenuItem
.Caption = "数据报表(&R)..."
'添加分隔线
.BeginGroup = True
End With
'添加子菜单
'添加第一个子菜单
Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubMenuItem
.Caption = "月汇总(&M)"
.FaceId = 110
.OnAction = "MonthRpt"
End With
'添加第二个子菜单
Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
With SubMenuItem
.Caption = "季度汇总(&Q)"
.FaceId = 222
.OnAction = "SeasonRpt"
End With
End Sub