仿Excel 关闭前保存文档对话框.docx
- 文档编号:11113448
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:15
- 大小:186.17KB
仿Excel 关闭前保存文档对话框.docx
《仿Excel 关闭前保存文档对话框.docx》由会员分享,可在线阅读,更多相关《仿Excel 关闭前保存文档对话框.docx(15页珍藏版)》请在冰豆网上搜索。
仿Excel关闭前保存文档对话框
仿Excel关闭前保存文档对话框
(一)
主 题:
仿Excel关闭前保存文档对话框
版 本:
Excel2000及其以后版本
说 明:
本示例主要仿建了一个Excel关闭前保存文档对话框,让用户可以自定义标题和显示消息。
(CodeBywangminbai)
在Excel中当用户更改了一个文档之后在关闭文档时就会显示一个询问用户是否保存文档的对话框,但此对话框的标题和显示消息总是一成不变的,久了就会觉得没有味道。
而且当用户在工作薄的Workbook_BeforeClose过程中设置了代码时,即使用户了点击询问对话框的“取消”按钮来取消关闭文档的操作时,你也会发现Workbook_BeforeClose过程的中的代码已经被执行,用户的很多设置已经被更改。
而这往往是用户不愿意看到的。
所以应在执行这些代码之前显示一个对话框来询问用户是否保存文档还是取消操作。
这个对话框用VBA的MsgBox函数就可以做到,但是如果你是WINDOWSXP的用户你就会发现VB的MsgBox函数显示的对话框的风格和Excel本身所显示的对话框的风格很不一样(前提是你选择的不是Windows的经典外观)。
这就显得不协调,见下图:
Excel对话框
VBA的MsgBox函数对话框
为了协调起见,我们就用Excel5的宏对话框来创建一个对话框,使其的风格样式和Excel对话框几乎没有分别,而且可以自定义对话框的标题及显示的消息。
效果见下图:
Excel对话框
自定制的宏对话框
在这里我就介绍一下定制的过程。
在你需要建立对话框的文档里插入一个MsExcel5.0对话框。
方法是点击任意工作表标签,然后选择弹出菜单中的插入菜单,在插入对话框中选择MsExcel5.0对话框。
单击确定按钮。
然后将其命名为“关闭前对话框”。
在对话框表中右键单击对话框的外框,选择设置控件格式菜单,将其控件格式设置为下图:
在窗体原有的两个按钮的基础上添加一个按钮,然后将按钮的标题分别更改为是(Y)、否(N)和 取消。
右键分别单击这三个按钮,选择设置控件格式菜单,将三个控件的大小格式设置如下图:
分别设置是(Y)、否(N)和取消控件的其它格式如图:
是(Y)按钮
否(N)按钮
取消按钮
在窗体上新建一个标签控件,将其更名为 Prompt ,将其格式设置如图:
最后对照上面的Excel对话框截图,对各个控件的位置进行调整使其以Excel对话框的控件位置一致。
分别指定对话框外框、按纽是(N)、否(N)和取消的宏为 ShowDialog 、 COk 、 CNo 和 CCancel。
在VBE的立即窗口中输入以下代码,按回车键,隐藏宏对话框表。
(如值为-1则可使对话框表可见)
ThisWorkbook.DialogSheets("关闭前对话框").visible=2
完成以上工作后,在VBE的模块和工作薄过程中添加以下代码,之后只要你对文档做出更改,在关闭文档时就会弹出此对话框询问你是否保存更改。
代码:
'//******************************************************************************************************************************************
'//此模块的过程主要是EXCEL5.0宏对话框的调用,主要用于在关闭文当前询问用户是否保存对文档所做的修改,采用宏对话框主要是为了保持此类对话框的风格一致。
*
'//******************************************************************************************************************************************
'//从指定的模块或应用程序实例中载入一个图标
PrivateDeclareFunctionLoadIcon_
Lib"user32"_
Alias"LoadIconA"(_
ByValhInstanceAsLong,_
ByVallpIconNameAsAny)_
AsLong
'//清除图标
PrivateDeclareFunctionDestroyIcon_
Lib"user32"(_
ByValhIconAsLong)_
AsLong
'//获得窗口在屏幕坐标中的位置
PrivateDeclareFunctionGetWindowRect_
Lib"user32"(_
ByValhwndAsLong,_
lpRectAsRECT)_
AsLong
'//移动窗体的API
PrivateDeclareFunctionMovewindow_
Lib"user32"_
Alias"MoveWindow"(_
ByValhwndAsLong,_
ByValxAsLong,_
ByValyAsLong,_
ByValnWidthAsLong,_
ByValnHeightAsLong,_
ByValbRepaintAsLong)_
AsLong
'//用来产生TIMER控件的效果。
PrivateDeclareFunctionSetTimer_
Lib"user32"(_
ByValhwndAsLong,_
ByValnIDEventAsLong,_
ByValuElapseAsLong,_
ByVallpTimerfuncAsLong)_
AsLong
'//结束Settimer过程
PublicDeclareFunctionKillTimer_
Lib"user32"(_
ByValhwndAsLong,_
ByValnIDEventAsLong)_
AsLong
'//查找窗体句柄
PrivateDeclareFunctionFindWindow_
Lib"user32"_
Alias"FindWindowA"(_
ByVallpClassNameAsString,_
ByVallpWindowNameAsString)_
AsLong
'//释放设备环境
PrivateDeclareFunctionReleaseDC_
Lib"user32"(_
ByValhwndAsLong,_
ByValhdcAsLong)_
AsLong
'//取得窗体设备环境
PrivateDeclareFunctionGetDC_
Lib"user32"(_
ByValhwndAsLong)
AsLong
'//取得系统颜色刷
PrivateDeclareFunctionGetSysColorBrush_
Lib"user32"(_
ByValnIndexAsLong)_
AsLong
'//绘制图标
PrivateDeclareFunctionDrawIconEx_
Lib"user32"(_
ByValhdcAsLong,_
ByValxLeftAsLong,_
ByValyTopAsLong,_
ByValhIconAsLong,_
ByValcxWidthAsLong,_
ByValcyWidthAsLong,_
ByValistepIfAniCurAsLong,_
ByValhbrFlickerFreeDrawAsLong,_
ByValdiFlagsAsLong)_
AsLong
'//准备用来取得屏幕的高和宽(像素为单位)
PrivateDeclareFunctionGetSystemMetrics_
Lib"user32"(_
ByValnIndexAsLong)_
AsLong
'//设置窗体标题或控件内容
PrivateDeclareFunctionSetWindowText_
Lib"user32"_
Alias"SetWindowTextA"(_
ByValhwndAsLong,_
ByVallpStringAsString)_
AsLong
'//——以下定义常数及类型——
PrivateTypeRECT
LeftAsLong
TopAsLong
RightAsLong
BottomAsLong
EndType
PrivateConstSM_CXSCREEN=0
PrivateConstSM_CYSCREEN=1
PrivateConstIDI_EXCLAMATION=32515& '惊叹图标
PublicConstMyYesAsString="YES"
PublicConstMyNoAsString="NO"
PublicConstMyCancelAsString="CANCEL"
PrivateConstCOLOR_BTNFACE=15 '按钮表面色
PrivateConstDI_NORMAL=&H3 '用常规方式绘图(合并DI_IMAGE和DI_MASK)
'//——以下定义变量——
PublicDialogHwndAsLong '对话框句柄
PublicMyTidAsLong
PublicBackSaveMsgAsString '对话框返回值
PrivateDialogTitleAsString,DialogPromptAsString
'//****************************************************************************************************************************************
'//以下三个过程取得用户点击窗体时的返回值
'//****************************************************************************************************************************************
PublicSubCOk()
BackSaveMsg=MyYes '点击“是”
EndSub
'//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PublicSubCNo()
BackSaveMsg=MyNo '点击“否”
EndSub
'//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PublicSubCCancel()
BackSaveMsg=MyCancel '点击“取消”
EndSub
'//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'//****************************************************************************************************************************************
'//显示窗体在指定的位置,和设定窗体标题等
'//****************************************************************************************************************************************
SubShowDialog()
DimDialogRectAsRECT,VidWidthAsLong,VidHeightAsLong,MleftAsLong,MtopAsLong
'//设置对话框显示信息
ThisWorkbook.DialogSheets("关闭前对话框").Labels("Prompt").Caption=DialogPrompt
VidWidth=GetSystemMetrics(SM_CXSCREEN) '取得屏幕的宽
VidHeight=GetSystemMetrics(SM_CYSCREEN) '取得屏幕的高
DialogHwnd=FindWindow("bosa_sdm_XL9",vbNullString) '取得EXCEL5宏对话框的句柄
SetWindowTextDialogHwnd,DialogTitle '设置窗体标题
GetWindowRectDialogHwnd,DialogRect '取得宏对话框的窗体区域
Mleft=(VidWidth-(DialogRect.Right-DialogRect.Left))/2'取得显示时的左上角横坐标(X)
Mtop=(VidHeight-(DialogRect.Bottom-DialogRect.Top))/2'取得显示时的左上角纵坐标(Y)
'//移动窗体至指定位置
MovewindowDialogHwnd,Mleft,Mtop,DialogRect.Right-DialogRect.Left,DialogRect.Bottom-DialogRect.Top,True
'//设置SetTimer过程
MyTid=SetTimer(DialogHwnd,0,10,AddressOfpMsgOutProc)
EndSub
'//****************************************************************************************************************************************
'//以下代码创建了一个函数,其返回值其参数为:
'//返回值:
String型,共有3个:
1、MyYes;2、MyNo;3、MyCancel分别代表,点击“是”按钮、点击“否”按钮和点击“取消”按钮
'//Prompt:
可选的。
字符串表达式,作为显示在对话框中的消息。
如果省略Prompt,则将显示"您是否保存对此份示例文档的修改?
"字符串。
'//Title:
可选的。
在对话框标题栏中显示的字符串表达式。
如果省略Title,则将显示"OFFICE精英俱乐部"字符串。
'//****************************************************************************************************************************************
PublicFunctionCloseDialog(OptionalPromptAsString="您是否保存对此份示例文档的修改?
",OptionalTitleAsString="OFFICE精英俱乐部")AsString
DialogTitle=Title
DialogPrompt=Prompt
Application.ExecuteExcel4Macro("Beep(3)") '发出声音
ThisWorkbook.DialogSheets("关闭前对话框").Show '显示EXCEL宏对话框
CloseDialog=BackSaveMsg '取得返回值
EndFunction
'//****************************************************************************************************************************************
'//回调函数
'//****************************************************************************************************************************************
PrivateFunctionpMsgOutProc(ByValhwndAsLong,ByValuMsgAsLong,ByValidEventAsLong,ByValSysTimeAsLong)AsLong
DimMYdcAsLong,myIconAsLong
DimIconRushAsLong
IconRush=GetSysColorBrush(COLOR_BTNFACE) '取得按钮颜色刷
MYdc=GetDC(DialogHwnd) '取得宏对话框场景
myIcon=LoadIcon(0,IDI_EXCLAMATION) '载入图标
DrawIconExMYdc,17,10,myIcon,0,0,0,IconRush,DI_NORMAL '在指定位置绘制图标,在这里最好用DrawIconEx函数。
而不用DrawIcon函数,不然绘制图标时闪烁的厉害
DestroyIconmyIcon '清除图标
ReleaseDCDialogHwnd,MYdc '释放窗体设备场景
EndFunction
'//****************************************************************************************************************************************
'//此为表格一按钮调用代码
'//****************************************************************************************************************************************
SubExample()
ThisWorkbook.Worksheets
(1).Range("A1").Value="更改"
Application.Quit
EndSub
'//---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 仿Excel 关闭前保存文档对话框 Excel 关闭 保存 文档 对话框