分享

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

 wdmexcel 2015-08-26


077 内置对话框

077-1 调用内置的对话框

如果需要使用“打开”、“打印”等Excel内置对话框已经具有的功能,可以使用代码直接调用这些内置的对话框,如下面的代码所示。

Sub DialogOpen()

Application.Dialogs(xlDialogOpen).Showarg1:=ThisWorkbook.Path & '\*.xls'

End Sub

代码解析:

DialogOpen过程显示内置的“打开”对话框并选定示例所在的文件夹。

显示内置对话框语法如下:

Application.Dialogs(xlDialogConst).Show

Dialogs集合代表所有的内置对话框,每个Dialog对象代表一个内置对话框,不能新建内置对话框或向该集合中添加内置对话框。

参数xlDialogConst是内置对话框的内置常量,每个常量都以“xlDialog”开头,其后是对话框的名称,如“打开”对话框的常量为“xlDialogOpen”。常用内置对话框的内置常量如表格所示。

显示内置对话框使用Show方法,应用于Dialog对象的Show方法语法如下:

expression.Show(Arg1Arg2Arg3Arg4Arg5Arg6Arg7Arg8Arg9Arg10Arg11Arg12Arg13Arg14Arg15Arg16Arg17Arg18Arg19Arg20Arg21Arg22Arg23Arg24Arg25Arg26Arg27Arg28Arg29Arg30)

参数expression是必需的,返回Dialog对象之一。

参数arg1到参数arg30是可选的,仅应用于内置对话框,是命令的初始参数。若要查找要设置的参数,请在内置对话框参数列表中查找对应的对话框常量。

运行alogOpen过程,显示内置的“打开”对话框,并且直接选定示例所在的文件夹。

077-2 获取选定文件的文件名

如果只希望获取用户在显示的内置“打开”对话框中选定文件的文件名,而不想真正打开该文件,那么可以使用GetOpenFilename方法,如下面的代码所示。

Sub OpenFilename()

DimFilename As Variant

Dimmymsg As Integer

Dimi As Integer

Filename= Application.GetOpenFilename(Title:='删除文件'MultiSelect:=True)

If IsArray(Filename)Then

mymsg = MsgBox('是否删除所选文件?'vbYesNo'提示')

If mymsg = vbYes Then

For i = 1 To UBound(Filename)

Kill Filename(i)

Next

End If

EndIf

End Sub

代码解析:

OpenFilename过程使用GetOpenFilename方法显示标准的内置“打开”对话框,获取用户选定文件的文件名后使用Kill语句删除。

GetOpenFilename方法显示标准的内置“打开”对话框,获取文件名,语法如下:

expression.GetOpenFilename(FileFilterFilterIndexTitleButtonTextMultiSelect)

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

参数FileFilter是可选的,指定文件筛选条件的字符串。如果省略,则默认参数值为“所有文件(*.*)”。

参数FilterIndex是可选的,指定默认文件筛选条件的索引号,取值范围为1 到由 FileFilter 所指定的筛选条件数目。如果省略,或者取值大于可用筛选数目,则采用第一个文件筛选条件。

参数Title是可选的,指定对话框的标题。如果省略,则使用“打开”作为标题。

参数ButtonText是可选的,仅用于Macintosh

参数MultiSelect是可选的,如果该值为True,则允许选定多个文件名,如果该值为False,则只允许选定单个文件名。默认值为False

5行代码显示标准的“打开”对话框,将对话框的标题设置为“删除文件”,将MultiSelect参数设置为True,允许选定多个文件。

6行代码,获得返回值。当用户选定文件后,返回的是选定的文件名或用户输入的文件名。因为MultiSelect参数已设置为True,所以返回值将是一个包含所有选定文件名的数组(即使仅选定了一个文件名)。如果用户取消了对话框,则该值为False

8行到第12行代码,经询问用户后使用Kill语句从磁盘中删除用户选定的文件。

运行OpenFilename过程,显示标准的内置“打开”对话框,删除用户选定的文件,如所图示。

注意 VBA中数组下界默认从0开始,但使用GetOpenFilename方法选择多个文件时返回的包含选定文件名的数组下界是从1开始。

077-3 使用“另存为”对话框

在备份文件时可以使用GetSaveAsFilename方法显示标准的内置“另存为”对话框,获取备份文件的文件名和保存路径,而无须真正保存任何文件。如下面的代码所示。

Sub CopyFilename()

DimNowWorkbook As Workbook

DimFileName As String

On ErrorGoTo line

FileName= Application.GetSaveAsFilename _

(InitialFileName:='D:\' &Date & ' ' & ThisWorkbook.Name_

fileFilter:='Excel files(*.xls)*.xlsAll files (*.*)*.*'_

Title:='数据备份')

If FileName<> 'False' Then

Set NowWorkbook = Workbooks.Add

With NowWorkbook

.SaveAs FileName

ThisWorkbook.Sheets('Sheet2').UsedRange.Copy_

.Sheets('Sheet1').Range ('A1')

.Save

End With

GoTo line

EndIf

ExitSub

line:

ActiveWorkbook.Close

End Sub

代码解析:

CopyFilename过程使用GetSaveAsFilename方法显示标准的内置“另存为”对话框,获取备份文件的文件名和保存路径,新建工作簿保存备份数据。

4行代码,错误处理语句。备份过程中,如果已存在同名工作簿,会出现提示,如果选择了“否”,此时新工作簿已经建立,在执行第12行代码时发生错误,使程序中断,所以使用GoTo语句执行第21行代码,关闭新建立的工作簿。

5行代码,使用GetSaveAsFilename方法显示标准的内置“另存为”对话框。GetSaveAsFilename方法的语法如下:

expression.GetSaveAsFilename(InitialFilenameFileFilterFilterIndexTitleButtonText)

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

参数InitialFilename是可选的,指定建议的文件名。如果省略,将活动工作簿的名称作为建议的文件名。

参数FileFilter是可选的,指定文件筛选条件的字符串。

参数FilterIndex是可选的,指定默认文件筛选条件的索引号,取值范围为1 FileFilter 指定的筛选条件数目之间。如果省略,或者取值大于可用筛选数目,则采用第一个文件筛选条件。

参数Title是可选的,指定对话框标题。如果省略,则使用默认标题。

参数ButtonText是可选的,仅用于 Macintosh

6行代码,设置对话框的保存路径为D盘,保存文件名为日期加工作簿名称。

7行代码,设置对话框文件保存类型为Excel文件类型。如果需要设置为文本类型需设置为“文本文件(*.txt)*.txt”,而如果是图片文件则需设置为“图片文件(*.bmp;*.jpg)* bmp;*.jpg”。

8行代码,设置对话框的标题为“数据备份”。

9行代码,如果用户没有取消操作。

10行到第16行代码,使用Add方法新建工作簿保存到对话框选定的路径中,将数据备份到新工作簿中。

17行代码,使用GoTo语句执行第21行代码,关闭新建工作簿和开启屏幕刷新。

运行CopyFilename过程,显示内置“另存为”对话框,供用户备份工作簿数据。

078 调用操作系统“关于”对话框

VBA程序开发完成后,有时需要一个“关于”对话框,除了使用窗体外,还可以调用操作系统的“关于”对话框,显示自定义的内容,如下面的代码所示。

Private Declare Function ShellAbout Lib'shell32.dll' Alias 'ShellAboutA' ( _

ByVal hwnd As LongByVal szApp As String_

ByVal szOtherStuff As StringByVal hIcon As Long) As Long

Private Declare Function FindWindow Lib'user32' Alias 'FindWindowA' ( _

ByVal lpClassName As StringByVal lpWindowName As String) As Long

Private Sub CommandButton1_Click()

DimApphWnd As Long

ApphWnd= FindWindow('XLMAIN'Application.Caption)

ShellAboutApphWnd'财务处理系统''yuanzhuping@yeah.net 0513-86548930'0

End Sub

代码解析:

1行到第5行代码是API函数声明。

89行代码调用操作系统的“关于”对话框并显示自定义的内容。

代码运行后显示对话框。

7部分菜单和工具栏

079 在菜单中添加菜单项

Excel工作表的菜单中可以添加新的菜单项和子菜单,如下面的代码所示。

Sub myTools()

DimmyTools As CommandBarPopup

DimmyCap As Variant

Dimmyid As Variant

Dimi As Byte

myCap= Array('基础应用''VBA程序开发''函数与公式''图表与图形''数据透视表')

myid= Array(281283285287292)

WithApplication.CommandBars('Worksheet menu bar')

.Reset

Set myTools = .Controls('帮助(&H)').Controls.Add(Type:=msoControlPopupBefore:=1)

With myTools

.Caption = 'ExcelVBA'

.BeginGroup = True

For i = 1 To 5

With .Controls.Add(Type:=msoControlButton)

.Caption = myCap(i - 1)

.FaceId = myid(i - 1)

.OnAction = 'myC'

End With

Next

End With

EndWith

SetmyTools = Nothing

End Sub

代码解析:

myTools过程使用Add方法在Excel工作表菜单栏中的“帮助”菜单中添加一个标题为“Excel Home 技术论坛”的菜单项和5个子菜单。

2行到第5行代码声明变量类型。

67行代码使用Array函数创建两个数组用于保存子菜单的名称和图标ID

9行代码,在添加菜单项前先使用Reset方法重置菜单栏以免重复添加菜单项。Reset方法重置一个内置控件,恢复该控件原来对应的动作,并将各属性恢复成初始状态,语法如下:

expression.Reset

参数expression 是必需的,返回一个命令栏或命令栏控件对象。

10行代码,使用Add方法在Excel工作表菜单栏中的“帮助”菜单中添加菜单项。Add方法应用于CommandBarControls对象时,新建一个CommandBarControl对象并添加到指定命令栏上的控件集合,语法如下:

expression.Add(TypeIdParameterBeforeTemporary)

参数expression 是必需的,返回一个CommandBarControls对象,代表命令栏中的所有控件。

参数Type是可选的,添加到指定命令栏的控件类型,可以为表格所列的MsoControlType常数之一。

因为在本例中将添加的是带有子菜单的菜单项,所以将参数Type设置为弹出式控件。

参数Id是可选的,标识整数。如果将该参数设置为 1或者忽略,将在命令栏中添加一个空的指定类型的自定义控件。

参数Parameter是可选的,对于内置控件,该参数用于容器应用程序运行命令。对于自定义控件,可以使用该参数向Visual Basic过程传递信息,或用其存储控件信息。

参数Before是可选的,表示新控件在命令栏上位置的数字。新控件将插入到该位置控件之前。如果忽略该参数,控件将添加到指定命令栏的末端。

在本例中将Before参数设置为1,菜单项添加到“帮助”菜单的顶端。

参数Temporary是可选的。设置为True将使添加的菜单项为临时的,在关闭应用程序时删除。默认值为False

12行代码,设定新添加菜单项的Caption属性为“Excel Home 技术论坛”。Caption属性返回或设置命令栏控件的标题。

13行代码,设置新添加菜单项的BeginGroup属性为True,分组显示。

14行到第19行代码,在“Excel Home 技术论坛”菜单项上添加五个子菜单并设置其Caption属性、FaceId属性和OnAction属性。

FaceId属性设置出现在菜单标题左侧的图标,以数字表示,一个数字代表一个内置的图标。

OnAction属性设置一个VBA的过程名,该过程在用户单击子菜单时运行,本例中设置为下面的过程。

Public Sub myC()

MsgBox'您选择了: ' & Application.CommandBars.ActionControl.Caption

End Sub

代码解析:

myC过程是单击新添加子菜单所运行过程,为了演示方便在这里只使用MsgBox函数显示所其Caption属性。

删除新添加的菜单项及子菜单的代码如下所示。

Sub DelmyTools()

Application.CommandBars('Worksheetmenu bar').Reset

End Sub

代码解析:

DelmyTools过程使用Reset方法重置菜单栏,删除添加的菜单项及子菜单。

为了在打开工作簿时自动添加菜单项,需要在工作簿的Activate事件中调用myTools过程,如下面的代码所示。

Private Sub Workbook_Activate()

CallmyTools

End Sub为了在关闭工作簿时删除新添加的菜单项,还需要在工作簿的Deactivate事件中调用DelmyTools过程,如下面的代码所示。

Private Sub Workbook_Deactivate()

CallDelmyTools

End Sub如果希望这个菜单为所有工作簿使用,那么就应该在工作簿的Open事件中调用myTools过程,在BeforeClose事件中调用DelmyTools过程。

运行myTools过程,将在Excel工作表菜单栏中的“帮助”菜单中添加一个名为“ExcelVBA”的菜单项及五个子菜单。


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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多