分享

VBA常用代码解析(第二十三讲)

 wdmexcel 2015-09-04

089 创建自定义工具栏

为了方便用户操作,在Excel原有的的工具栏上,还可以创建自定义的工具栏,如下面的代码所示。

Sub NowToolbar()

Dimarr As Variant

Dimid As Variant

Dimi As Integer

DimToolbar As CommandBar

On ErrorResume Next

Application.CommandBars('MyToolbar').Delete

arr= Array('会计凭证''会计账簿''会计报表''凭证打印''账簿打印''报表打印')

id =Array(989328495909614707986)

SetToolbar = Application.CommandBars.Add('MyToolbar'msoBarTop)

With Toolbar

.Protection = msoBarNoResize

.Visible = True

For i = 0 To 5

With .Controls.Add(Type:=msoControlButton)

.Caption = arr(i)

.FaceId = id(i)

.BeginGroup = True

.Style = msoButtonIconAndCaptionBelow

End With

Next

End With

SetToolbar = Nothing

End Sub

代码解析:

NowToolbar过程使用Add方法在Excel窗口中创建自定义工具栏。应用于CommandBars对象的Add方法请参阅▲83

10行代码,使用Add方法在菜单栏上创建名称为“MyToolbar”的命令栏,创建时设置新命令栏的Position参数为msoBarTop,使新命令栏位于应用程序窗口的顶部。如果将Position参数设置成msoBarFloating,新命令栏为浮动工具栏。

关于Position参数的MsoBarPosition常数请参阅▲83

12行代码,设置“MyToolbar”命令栏的Protection属性为msoBarNoResize。应用于CommandBar对象的Protection属性指定命令栏的保护类型,可以为表格所列的MsoBarProtection常数之一。

14行到第21代码,使用Add方法在新命令栏中添加按钮控件,设置按钮控件的各项属性。其中第19行代码,设置按钮控件的Style属性为msoButtonIconAndCaptionBelow,使工具栏按钮显示时包含图标和标题,且标题位于图标之下。

应用于CommandBar对象的Style属性返回或设置工具栏按钮的显示方式,可以为表格所列的MsoButtonStyle常数之一。运行NowToolbar过程,将在Excel窗口的顶部创建一个自定义的工具栏。

090 自定义工具栏按钮图标

在创建自定义的工具栏时,除了可以为工具栏按钮添加Excel内置的图标外,还能为工具栏按钮添加自定义的图标,如下面的代码所示。

Sub AddCustomButton()

DimxBar As CommandBar

DimxButton As CommandBarButton

On ErrorResume Next

Application.CommandBars('CustomBar').Delete

SetxBar = CommandBars.Add('CustomBar'msoBarTop)

SetxButton = xBar.Controls.Add(msoControlButton)

WithxButton

.Picture = LoadPicture(ThisWorkbook.Path& '\P.BMP')

.Mask = LoadPicture(ThisWorkbook.Path &'\M.BMP')

.TooltipText = 'Excel Home 论坛'

EndWith

xBar.Visible= True

SetxBar = Nothing

SetxButton = Nothing

End Sub

代码解析:

AddCustomButton过程创建自定义工具栏,并设置工具栏的按钮自定义图标。

67行代码,使用Add方法在Excel窗口中添加自定义工具栏和按钮。请参阅▲89

9行代码,设置工具栏按钮的Picture属性为同一目录中的p.bmp图片。

应用于CommandBarButton 对象的Picture属性返回一个IPictureDisp对象,表示 CommandBarButton对象的图像,语法如下:

expression.Picture

参数是必需的,返回一个CommandBarButton对象。

指定对象的Picture属性就能设置对象的图像。

10行代码,设置工具栏按钮的Mask属性为同一目录中的m.bmp图片。

为了使工具栏按钮图标透明显示,在指定对象的Picture属性后,还需要指定对象的Mask属性。

应用于CommandBarButton 对象的Mask属性返回表示CommandBarButton对象的屏蔽图像的IPictureDisp对象,语法如下:

expression.Mask

参数是必需的,返回一个CommandBarButton对象。

屏蔽图像决定按钮图像透明的部分。在创建作为屏蔽图像使用的图像时,所有要透明的区域应该为白色,所有要显示的区域应该为黑色。

11行代码,设置按钮的“屏幕提示”为“ExcelHome论坛”。

运行AddCustomButton过程,创建自定义工具栏,并设置工具栏按钮的图标。

091 自定义工作簿图标

Excel标题栏的图标是默认的,而借助API函数可以自定义工作簿标题栏图标,如下面的代码所示。

Private Declare Function FindWindow Lib'user32' Alias 'FindWindowA' (ByVal lpClassName As StringByVal lpWindowName As String) As Long

Private Declare Function DrawMenuBar Lib'user32' (ByVal hWnd As Long) As Long

Private Declare Function SetFocus Lib 'user32'(ByVal hWnd As Long) As Long

Private Declare Function SendMessage Lib'user32' Alias 'SendMessageA' (ByVal hWnd As LongByVal wMsg As LongByVal wParamAs IntegerByVal lParam As Long) As Long

Private Declare Function ExtractIcon Lib'shell32.dll' Alias 'ExtractIconA' (ByVal hInst As LongByVal lpszExeFileName As StringByVal nIconIndex As Long) As Long

Private Const WM_SETICON = &H80

Private Sub Workbook_Open()

DimIStyle As Long

DimhIcon As Long

DimhWndForm As Long

hWndForm= FindWindow(vbNullStringApplication.Caption)

hIcon= ExtractIcon(0ActiveWorkbook.Path & '\p.bmp'0)

SendMessagehWndFormWM_SETICONTruehIcon

SendMessagehWndFormWM_SETICONFalsehIcon

End Sub

代码解析:

工作簿打开后使用API函数自定义工作簿标题栏的图标。

1行到第6行代码,API函数声明。

7行到第15行代码,工作簿的Open事件过程,把工作簿标题栏默认的图标更改为同一文件夹下的p.bmp图片。工作簿打开后标题栏。

092 移除工作表的最小最大化和关闭按钮

如果不希望工作表的最小、最大化和关闭按钮出现在菜单栏中,可以使用以下代码去除:

ActiveWorkbook.Protect,,True

代码解析:

使用Protect方法对工作簿进行保护。Protect方法应用于Workbook对象的时保护工作簿使其不至被修改,语法如下:

expression.Protect(PasswordStructureWindows)

参数expression是必需的,该表达式返回一个Workbook对象。

参数Password是可选的,为工作表或工作簿指定区分大小写的密码。

参数Structure是可选的,如果为True,则保护工作簿结构(工作表的相对位置)。默认值为False

参数Windows是可选的,如果为True,则保护工作簿窗口。

恢复工作表的最大、最小化和关闭按钮的代码如下:

ActiveWorkbook.Protect,,False

在本例中将Windows参数设置为True,使工作簿窗口受到保护,工作表的最小、最大化和关闭按钮及图标不出现在菜单栏中。

093 在工具栏上添加下拉列表框

如果需要在工具栏中添加类似“字体”这样的下拉列表控制框控件,那么可以使用下面的代码。

Sub AddDropdown()

DimmyDropdown As Object

DimmyCap As Variant

Dimi As Integer

myCap= Array('基础应用''VBA程序开发''函数与公式')

CallDeleteButton

SetmyDropdown = Application.CommandBars('Formatting').Controls _

.Add(Type:=msoControlDropdownBefore:=1)

WithmyDropdown

.Caption = '请选择版块'

.OnAction = 'myOnA'

.Style = msoComboNormal

For i = 0 To UBound(myCap)

.AddItem myCap(i)

Next

.ListIndex = 1

EndWith

End Sub

Sub DeleteButton()

WithApplication.CommandBars('Formatting').Controls(1)

If .Caption = '请选择版块' Then .Delete

EndWith

End Sub

Sub myOnA()

DimmyList As Byte

myList= Application.CommandBars('Formatting') _

.Controls(1).ListIndex

ActiveWorkbook.FollowHyperlink_

Address:='http://club./forum-'& myList & '-1.html'NewWindow:=True

End Sub

代码解析:

AddDropdown过程使用Add方法在工具栏中添加下拉列表控制框控件。

5行代码使用Array函数创建一个数组用于保存下拉列表控制框控件加载列表项所需的元素。

6行代码先运行第19行到第23行的DeleteButton过程删除可能存在的下拉列表控制框控件,以免重复添加。DeleteButton过程判断工具栏中第一个控件的Caption属性是否为“请选择版块”,如果是则删除该下拉列表控制框控件。

78行代码使用Add方法在工具栏中添加下拉列表控制框控件。应用于 CommandBarControls 对象的Add方法请参阅▲79 。示例中将其参数Type设置为msoControlDropdown,添加的就是下拉列表控制框控件。

10行代码设置下拉列表控制框控件的Caption属性,应用于 CommandBarControls 对象的Caption属性返回或设置指定命令栏控件的题注文字,也可作为默认的“屏幕提示”显示。

11行代码设置改变下拉列表控制框控件的内容时要运行的过程为第24行到第30行代码的myOnA过程。myOnA过程根据下拉列表控制框控件的ListIndex属性值打开Excel Home论坛中相应的版块。

12行代码设置下拉列表控制框控件的样式。Style属性返回或设置命令栏控件的显示方式,该属性值可设置为表格所列MsoComboStyle常量之一。

13行到第15行代码使用AddItem方法将数组中的元素添加到下拉列表控制框控件的列表项中。

16行代码将下拉列表控制框控件的ListIndex属性设置为1,使其显示第一条列表项。

094 屏蔽工作表的复制功能

有时我们并不希望用户对工作表中的数据进行复制粘贴操作,此时可以把所有的复制功能都屏蔽,如下面的代码所示。

DimCmdCtrls As CommandBarControls

DimCmd As CommandBarControl

Sub ProCopy()

SetCmdCtrls = Application.CommandBars.FindControls(ID:=19)

ForEach Cmd In CmdCtrls

Cmd.Enabled = False

Next

Application.CellDragAndDrop= False

Application.OnKey('^c')““

End Sub

Sub StaCopy()

SetCmdCtrls = Application.CommandBars.FindControls(ID:=19)

ForEach Cmd In CmdCtrls

Cmd.Enabled = True

Next

Application.CellDragAndDrop= True

Application.OnKey('^c')

End Sub

代码解析:

12行代码在模块顶部声明两个模块级的变量。

3行到第10行代码ProCopy过程,屏蔽工作表中所有的复制功能。其中第4行到第7行代码使用FindControls方法将所有与“复制”相关的命令栏控件赋给变量CmdCtrls后将其Enabled设置为False。关于FindControls方法请参阅▲80

8行代码屏蔽单元格拖放功能,关于应用于Application对象的CellDragAndDrop属性请参阅▲10

9行代码屏蔽<Ctrl+C>组合键功能,关于应用于Application 对象的OnKey方法请参阅▲68

11行到第18行代码StaCopy过程,恢复所有的复制功能。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多