VB 程序设计

10个成员

利用VBA自定义Office的快捷方式

发表于 2016-12-27 3889 次查看
你可能已经使用VBA为你的电子表格应用程序创建自定义的菜单了。不过,你可能还没有意识到还可以自定义当你右击一个对象时出现的快捷方式菜单。这项有用的技术允许你不用右击便可启动频繁使用的命令。

  在本文中,我们将讨论如何向快捷方式菜单添加和删除命令。以Excel 97为重点,我们将创建一个允许你隐藏和再现多个工作簿(只需通过右击一个制表键即可)的应用程序。这就必须创建一个表单,该表单显示了活动工作簿中任何隐藏表格的名字。你还可以选择多个将要再现的表格,通常需要对鼠标的多次单击做一些改进。

  我们还将示范如何向快捷方式菜单添加子菜单。在这种情形中,我们将向Excel快捷方式菜单添加命令,该命令允许你在工作表格单元格中按下J 之后,选择指针应该移动的方向。

A CommandBar Named "Ply"

  你可能对图1所示的菜单已经很熟悉了;无论你什么时候右击表格的制表键时,它都出现。让我们首先向这个快捷方式菜单的底部添加两个选项(Hide和 Unhide)。

  在开始之前,你应该确定在哪里存储这个过程。理想情况下,应该把它们添加到你的Excel个人宏工作簿,例如Personal.xls(如果你不熟悉这个文件,请参看第10页的“个人宏工作簿”)。

  为了开始,请通过选中Tools | Macro | Visual Basic Editor,或通过按A!_. Next之后右击Project Explorer窗口中的VBA Project (PERSONAL.XLS),然后选择nsert Module,来激活Visual Basic Editor。

现在添加AddToPlyMenu,如图2所示。正如你所看到的,该过程中的每条语句都可以处理CommandBar集合;特别是名为"Ply."的集合中的单个CommandBar。

CommandBars到底是什么呢?哪一个的名字是“Ply”呢?CommandBars是CommandBar对象的一个集合。CommandBar对象有三种类型:Normal, MenuBar,和 Popup(见图3)。CommandBar对象对Office 97来说是个新对象。这是一个复杂的话题,对它的完整讨论已超出了本文的范围。我们只对自定义已经提供给Office 97的弹出式菜单感兴趣。这就足够了——光Excel 97中就有45个!如下的VBA代码将在Immediate窗口中全部列出它们。

For Each CBar In CommandBars

 If CBar.Type = msoBarTypePopup Then

  Debug.Print CBar.Name

 End If

Next

Adding Menu Items

  返回到AddToPlyMenu过程(再次见图2),我们现在知道了第一条语句是指向当右击Excel 97中表格制表键时所出现的快捷方式菜单的,而With...End块里面的所有语句将应用到那个菜单。

With Application.CommandBars("Ply")

  在这条语句中,CommandBars是作为Application对象的属性出现的,例如本例中的Excel 97。既然Application是CommandBars属性的默认对象,那么该语句可以简化为:

With CommandBars("Ply")

  下一步,在向菜单添加新菜单项之前,调用Reset方法以确保菜单已复位到默认的外观。这可以防止我们重复添加相同的菜单项。

  如下两条语句可以向“Ply”弹出式菜单添加菜单项:

.Controls.Add(Type:=msoControlButton).Caption = _

 "Hide Sheet(s)"

.Controls.Add(Type:=msoControlButton).Caption = _

 "Unhide Sheet(s)..."

  每个CommandBar对象都有一个包含了所有关联控件的Controls集合。有许多类型的控件可以提供,但是为了完成我们的任务,我们只对标准的菜单项控件感兴趣,这些标准的菜单项控件是通过使用msoControlType常量msoControlButton指定的。关于所有类型的完整描述,请在Microsoft Office Visual Basic帮助文件中搜索"Type property"。

  Add方法用于将每个新控件添加到CommandBars.Controls集合。Add方法需要控件类型(在括号中指定),在本例中,还需要为控件的Caption属性提供一个值。我们正在添加的两个菜单项各自具有Hide Sheet(s) and Unhide Sheet(s)...的说明。

  下一条语句是:

.Controls("Hide Sheet(s)").BeginGroup = True

将在两个新菜单项之上插入一组“分隔符”。每个菜单控件都有一个BeginGroup属性,可以通过将它设置为True.来激活。

   在我们到目前为止已经考察的代码的基础之上,“Ply”弹出式菜单将出现在图4所示的图图中。不过,新的菜单项不能做任何事情,功能仍然需要与每个菜单项关联起来。下两条语句就开始实现这一功能:

.Controls("Hide Sheet(s)").OnAction = "HideSheet"

.Controls("Unhide Sheet(s)...").OnAction = "UnhideSheet"

在这里,每个项目的OnAction属性都与一个过程相关联,例如,当Sheet(s)菜单项被选中的时候,将调用HideSheet过程。






图1 用于表格制表键的标准快捷方式菜单






图2 在Visual Basic Editor中工作。AddToPlyMenu过程向Excel的工作表格制表键菜单添加两个命令

msoBarType Constant Example Description

msoBarTypeNormal Standard, Format, etc. The familiar "menu bar." 

msoBarTypeMenuBar Worksheet Menu Bar and Chart Menu Bar Used for creating custom CommandBars.

msoBarTypePopup Ply, Cell, Row, Column, etc. Popup or "Shortcut" menus, displayed by right-clicking.

图3 CommandBar类型

添加功能

  我们已经创建了两项功能。下面让我们来从隐藏选定工作簿表格的过程开始。只需向包含有AddToPlyMenu过程的模块添加简单的、单语句的过程即可。

Sub HideSheet()

 ActiveWindow.SelectedSheets.Visible = False

End Sub

这就是我们添加的全部内容。当运行这个过程的时候,所有被选中的表格将自动隐藏起来。一定要记住,文件中至少应有一个电子表格保持可见。因此,如果你试图隐藏文件中全部电子表格的时候,VBA将返回一个错误。


 

尽管隐藏表格的过程十分简单,而相应的再现表格的过程就要复杂一些了。为了开始,你必须创建一个用户表单,这可以通过在Project Explorer窗口中右击VBA Project (PERSONAL.XLS),然后选择Insert | UserForm. Change the Name property to UnhideDlg来实现,然后,将Caption属性改为Unhide。




图4 用它的两个新菜单项修改的“Ply”弹出式菜单

下一步,在Project Explorer 窗口中右击UnhideDlg,然后选择View Code。VBA Editor应该自动创建一个叫做UserForm_Initialize的过程;修改它,使它像图5所示的样子。

  向表单添加一个ListBox控件,将它的MultiSelect属性改为fmMultiSelectMulti。就在ListBox的上面,添加包含有文字Unhide sheet(s)的Label控件;下一步,向UserForm添加四个CommandButton控件,将它们各自的Name属性改为CommandButtonOK, CommandButtonCancel, CommandButtonSelectAll,和 CommandButtonDeselectAll。然后将它们的Caption属性分别改为OK, Cancel, Select All,和 Deselect All。对话框应该与图6所示的相似。请注意,除了多了Select All 和 Deselect All CommandButtons之外,该对话框十分类似于Excel内建的Unhide对话框。

  现在,你就可以准备为各自的控件分配过程了。为了开始,请双击Cancel CommandButton来查看与之相关联的代码。为了卸载这个对话框,请向CommandButtonCancel_Click过程添加一条Unload语句。

Private Sub CommandButtonCancel_Click()

 ' Unload the dialog box.

 Unload UnhideDlg

End Sub

双击OK CommandButton来查看CommandButtonOK_Click过程,修改它,使它像图7中所示的样子。这个过程将关闭Unhide对话框,然后,确定用户选中的是ListBox里面的哪些项目,并再现相应的表格。

  现在,让我们为Select All 和Deselect All按钮编写基本的代码。这些按钮允许你选中或取消选中ListBox中的每个项目——通过单击来实现。如果ListBox包含有几个项目的话,这可以节省许多鼠标单击。为了继续进行,请双击Select All CommandButton,然后插入如下所示的代码:

Private Sub CommandButtonSelectAll_Click()

 ' Select all items in the ListBox.

 For i = 0 To ListBox1.ListCount - 1

  ListBox1.Selected(i) = True

 Next

End Sub

完成之后,使用如下的代码为Deselect All CommandButton重复该过程:

Private Sub CommandButtonDeselectAll_Click()

 ' Deselect all items in the ListBox.

 For i = 0 To ListBox1.ListCount - 1

  ListBox1.Selected(i) = False

 Next

End Sub

现在,向包含有AddToPlyMenu 和 HideSheet 过程的模块添加UnhideSheet过程:

HideSheet procedures:

Sub UnhideSheet()

 UnhideDlg.Show

End Sub

这个过程将显示UnhideDlg UserForm。由于用于每个CommandButton所完成的任务的代码已经分配给这个控件了,所以仅仅需要这个过程来显示对话框本身。

  你现在就可以准备准备测试这个菜单了。使用Project Explorer t切换到Module1,然后单击AddToPlyMenu过程。按5来返回该例程,该操作将向你的表格制表键快捷方式菜单添加新命令。

   现在请切换到Excel,创建包含有三个表格的工作簿。按住C,然后单击三个工作表格制表键中的两个。右击一个选中的制表键,然后选择Hide Sheet(s),如图8所示。选中的表格现在应被隐藏起来了。

   为了再现这些表格,请右击剩下的表格制表键,选择Unhide Sheet(s)来显示我们已经创建(见图9)的Unhide对话框。单击elect All CommandButton,然后单击OK。隐藏的表格就应该出现了。正如你所看到的,该过程比重复选择Format | Sheet | Unhide来一次一个地显示隐藏的表格要容易得多。

图5 使用UserForm_Initialize过程向列表框添加隐藏得表格名

Private Sub UserForm_Initialize()

 ' Clear the listbox.

 ListBox1.Clear

 ' Insert hidden sheet names.

 For i = 1 To ActiveWorkbook.Sheets.Count

  If ActiveWorkbook.Sheets(i).Visible = False Then

   ListBox1.AddItem(ActiveWorkbook.Sheets(i).Name)

  End If

 Next

End Sub






图6 选中表格来从对话框中再现它

Private Sub CommandButtonOK_Click()

 ' Close the dialog box.

 Unload UnhideDlg

 Application.ScreenUpdating = False

 ' Loop through each item in the ListBox.

 For i = 0 To ListBox1.ListCount - 1

  ' If an item is selected, unhide that sheet.

  If ListBox1.Selected(i) = True Then

   With ActiveWorkbook.Sheets(ListBox1.List(i))

    .Visible = True

    .Activate

   End With

  End If

 Next

End Sub

图7 该过程将再现选定的表格

向Shortcut Menu添加Submenu

  现在我们已经讨论了如何向快捷方式菜单添加命令,下面让我们通过添加子菜单,特别是Excel "Cell"快捷方式菜单,来进一步熟悉这项技术。

  为了开始,请使用Visual Basic Editor中的Project Explorer来激活你的Personal.xls工作簿中的Module1。然后,创建如图10所示的过程。该过程向"Cell" CommandBar添加了一个Move Selection选项,然后创建一个选择移动选项的子菜单。

  完成之后,请创建如图11所示的过程,它将执行选中的任务。

  现在,让我们来测试一下你的工作:运行AddToCellMenu过程,它将向"Cell"快捷方式菜单添加新命令。下一步,切换到Excel,右击任何单元格,选择Move Selection,然后从子菜单中选择一个选项,如图12所示。例如,如果你选择了Disabled,那么当你按J的时候,选择指针将保留在当前的单元格之中。如果你选择了Left,那么每次当你按J的时候,选择指针将向左移动一个单元格。这就允许你可以很容易地根据手头的任务来控制选择指针的运动。


图8 我们自定义的快捷方式菜单可以迅速地完成隐藏和再现表格的工作








图9 自定义的Unhide对话框在工作






图10 AddToCellMenu过程向Cell右击菜单添加Move段菜单项

完成Touch

请记住,本文中所讨论的附加菜单选项仅仅在你调用这些过程的时候出现。如果你将这些过程保存到你的Personal.xls文件,那么从Tools | Macros菜单选项中总是可以访问到这个宏。不过,一个更好的解决方案是当你启动程序的时候,让Excel直接自动为你运行这个宏。为了做到这一点,请返回到Visual Basic Editor,然后向你的Personal.xls工作簿模块添加如下的过程:

Sub Auto_Open()

 Call AddToPlyMenu

 Call AddToCellMenu

End Sub

Auto_Open过程将自动运行菜单宏,并且确保自定义的菜单命令总是右击方式。

   请记住:使用Reset方法可以将自定义的菜单返回到它们的自定义的状态。图2和图10的过程使用了这个方法来在添加新命令之前清除到"Ply"和 "Cell" CommandBars的任何修改。否则,一些命令可能在同一个菜单上出现多次。

Sub selDisabled()

 Application.MoveAfterReturn = False

End Sub

Sub selDown()

 Application.MoveAfterReturn = True

 Application.MoveAfterReturnDirection = xlDown

End Sub

Sub selRight()

 Application.MoveAfterReturn = True

 Application.MoveAfterReturnDirection = xlToRight

End Sub

Sub selUp()

 Application.MoveAfterReturn = True

 Application.MoveAfterReturnDirection = xlUp

End Sub

Sub selLeft()

 Application.MoveAfterReturn = True

 Application.MoveAfterReturnDirection = xlToLeft

End Sub

图11 这些过程指定当用户在一个单元格中按下J时,箭头应该移动的方向

图12 这个自定义的快捷方式菜单使得根据你的不同任务对指针进行控制变得很容易


结论

  修改右击菜单是一项功能强大的技术,你可以用来节省对频繁使用命令的单击操作。我们还示范了如何圆满地完成对Excel开发组来说是较为困难的任务。其中包括同时再现多个表格,改变选择指针的运动方向。

  正如你所看到的,为与你的工作方式相匹配而自定义Excel环境是很容易的。尽管本文所介绍的方法和属性是针对Excel 97的,使用CommandBars属性处理快捷方式菜单的技术同样适用于Access 97, PowerPoint 97,和 Word 97。

  本文中所引用的来源可以从位于http://www.informant.com/mod/modnewupl.htm的Informant Web站点下载得到。文件名为MOD9710DR.ZIP。

David Ringstrom, CPA是Accounting Advisors, Inc.的董事长,该公司是一家以Atlanta为基础的财务和电子表格咨询公司,它所服务的客户遍及全国。他以前发表的作品包括有关Lotus 1-2-3, Quattro Pro, 的 FileMaker Pro的文章。如果想了解有关Accounting Advisors, Inc.'的咨询服务方面的信息,请打电话给(404) 252-3813,或向dringstrom@mindspring.com发送电子邮件。

你的个人宏工作簿

如果你已经记录了一个Exce宏,那么一个名为Personal.xls的隐藏工作簿就将存储在你的\Office\Xlstart文件夹之中。这个个人宏工作簿缉拿感将在你启动Excel的时候自动打开;当你在Excel中工作的时候,存储在该工作簿中的任何过程都总是可以提供的。

不过,你可能不想拥有Personal.xls工作簿。为了决定你是否想这样做,请启动Excel,然后从菜单中选择Window | Unhide。如果禁止了Unhide,或者如果Unhide对话框(见图A)不包含Personal.xls,你将需要创建这个工作簿。最容易的方法是从Excel菜单中选择Tools | Macro,并单击Record New Macro。然后从Store macro in下拉列表中选择Personal Macro Workbook,并单击OK。然后单击Stop Recording工具栏顶部的Stop Recording按钮。现在你就可以使用Personal.xls工作簿了。

 

发表回复
你还没有登录,请先登录注册