1.使用MsgBox函数
MsgBox是VBA中用于显示消息框的函数。它可以向用户显示信息,并获取用户的响应。这个函数常用于程序执行过程中的提示、警告或确认操作。
基本语法
MsgBox(prompt[, buttons][, title][, helpfile, context])
prompt: 必需的参数,指定要在消息框中显示的文本。
buttons: 可选参数,指定要显示的按钮类型和图标。
title: 可选参数,指定消息框的标题。
helpfile和context: 用于指定帮助文件,对于初学者来说通常不需要使用。
Sub MsgBoxWithButtonsAndTitle()
' 声明一个变量来存储用户的选择
Dim userResponse As VbMsgBoxResult
' 显示一个带有"是"和"否"按钮的消息框
userResponse = MsgBox("Do you want to continue?", vbYesNo + vbQuestion, "Confirmation")
' 根据用户的选择执行不同的操作
If userResponse = vbYes Then
MsgBox "You clicked Yes!", vbInformation, "Result"
Else
MsgBox "You clicked No!", vbExclamation, "Result"
End If
End Sub
buttons参数
buttons参数的设置非常灵活,使消息框显示具有“确定”“取消”按钮和信息消息图标
按钮类型和数目
vbOKOnly = 0 ' 只显示"确定"按钮(默认设置)
vbOKCancel = 1 ' 显示"确定"和"取消"按钮
vbAbortRetryIgnore = 2 ' 显示"放弃"、"重试"和"忽略"按钮
vbYesNoCancel = 3 ' 显示"是"、"否"和"取消"按钮
vbYesNo = 4 ' 显示"是"和"否"按钮
vbRetryCancel = 5 ' 显示"重试"和"取消"按钮
图标样式
vbCritical = 16 ' 显示危险警告图标
vbQuestion = 32 ' 显示询问图标
vbExclamation = 48 ' 显示警告图标
vbInformation = 64 ' 显示信息图标
默认按钮
vbDefaultButton1 = 0 ' 第一个按钮为默认按钮
vbDefaultButton2 = 256 ' 第二个按钮为默认按钮
vbDefaultButton3 = 512 ' 第三个按钮为默认按钮
vbDefaultButton4 = 768 ' 第四个按钮为默认按钮
消息框模态
vbApplicationModal = 0 ' 应用程序模式,用户必须对消息框作出响应才能继续使用当前应用程序
vbSystemModal = 4096 ' 系统模式,应用程序需被挂起直至用户对消息框作出响应
其他选项
vbMsgBoxHelpButton = 16384 ' 在消息框上添加"帮助"按钮
vbMsgBoxSetForeground = 65536 ' 将消息框设置为前景窗口
vbMsgBoxRight = 524288 ' 显示右对齐的消息框
vbMsgBoxRtlReading = 1048576 ' 指定在希伯来语和阿拉伯语系统中显示的文本应当从右到左阅读
获得消息框的返回值
如果希望能根据用户对于消息框的不同选择,进行相应的操作,可以对消息框的返回值进行判断
获取返回值
MsgBox汗水会返回一个整数值,表示用户点击了哪个按钮,我们可以将这个返回值赋给一个变量,然后根据这个变量的值来决定下一步的操作
Dim result As VbMsgBoxResult
result = MsgBox("您的提示信息", [按钮类型], "标题")
常见的返回值
vbOK = 1 ' 用户点击了"确定"按钮
vbCancel = 2 ' 用户点击了"取消"按钮
vbAbort = 3 ' 用户点击了"中止"按钮
vbRetry = 4 ' 用户点击了"重试"按钮
vbIgnore = 5 ' 用户点击了"忽略"按钮
vbYes = 6 ' 用户点击了"是"按钮
vbNo = 7 ' 用户点击了"否"按钮
示例代码
Sub HandleMsgBoxReturn()
' 声明变量来存储返回值
Dim result As VbMsgBoxResult
' 显示一个带有"是"和"否"按钮的消息框
result = MsgBox("您想要继续操作吗?", vbYesNo + vbQuestion, "确认操作")
' 根据返回值执行不同的操作
Select Case result
Case vbYes
' 用户点击了"是"
MsgBox "您选择了继续操作。", vbInformation, "操作确认"
' 这里可以添加继续操作的代码
Case vbNo
' 用户点击了"否"
MsgBox "您选择了取消操作。", vbExclamation, "操作取消"
' 这里可以添加取消操作的代码
End Select
End Sub
始终使用明确的常量(如vbYes、vbNo等)而不是数字值来比较返回结果,这样可以提高代码的可读性。
考虑使用Select Case语句而不是多个If…Then语句,特别是当有多个可能的返回值时。
在处理重要操作时,使用消息框来确认用户的意图可以防止意外操作。
在消息框中排版
如果在消息框中显示的字符串很长,比如是一段多行的文字内容,为了达到美观的效果,需要首字缩进,并将隔行分隔开来
Sub FormattedMsgBox()
Dim message As String
message = vbTab & "这是第一段文字,我们使用了制表符来缩进。" & vbNewLine & vbNewLine & _
vbTab & "这是第二段文字。注意我们在段落之间使用了两个换行符来创建空行。" & vbNewLine & vbNewLine & _
vbTab & "这是第三段文字。通过这种方式,我们可以创建美观的多段落文本。"
MsgBox message, vbOKOnly + vbInformation, "格式化消息示例"
End Sub
2.自动关闭的消息框(没有尝试成功)
如果希望显示的消息框自动关闭,那么可以使用以下方法显示消息框
使用WishShell.Popup方法显示消息框
使用API函数显示消息框
用WishShell.Popup方法显示消息框
WshShell.Popup 方法属于 Windows Script Host (WSH) 对象模型,它提供了比标准 VBA MsgBox 更多的控制选项,包括自动关闭功能。
基本语法
CreateObject(“WScript.Shell”).Popup prompt[, seconds][, title][, buttons + icon]
prompt: 要显示的消息文本
seconds: 消息框显示的时间(秒),0 表示一直显示直到用户响应
title: 消息框的标题
buttons + icon: 按钮类型和图标(与 MsgBox 类似)
调试模式下消息框可能不会自动关闭
Sub WshShell()
' 声明 WshShell 对象变量
Dim WshShell As Object
' 创建 WScript.Shell 对象实例
Set WshShell = CreateObject("Wscript.Shell")
' 使用 WshShell.popup 方法显示消息框
WshShell.popup "执行完毕", 2, "提示", 64
' 释放 WshShell 对象
Set WshShell = Nothing
End Sub
使用API关闭消息框
' 在模块的声明部分添加以下 API 声明
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Dim TID As Long
Sub Test()
' 设置定时器,2000 毫秒(2秒)后调用 CloseTest 过程
TID = SetTimer(0, 0, 2000, AddressOf CloseTest)
' 显示消息框
MsgBox "执行完毕!"
End Sub
Sub CloseTest(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
' 发送 Esc 键模拟关闭消息框
Application.SendKeys "{ESC}", True
' 销毁定时器
KillTimer 0, TID
End Sub
3.使用InputBox函数
有时需要用户输入简单的数据,此时可以使用InputBox函数显示一个输入框
基本语法
InputBox(prompt[, title][, default][, xpos][, ypos][, helpfile, context])
prompt: 显示在输入框中的提示信息(必须)
title: 输入框的标题(可选)
default: 输入框中的默认值(可选)
xpos, ypos: 输入框在屏幕上的位置(可选)
helpfile, context: 帮助文件相关参数(很少使用)
Sub BasicInputBox()
Dim userInput As String
userInput = InputBox("请输入您的姓名:", "姓名输入")
If userInput <> "" Then
MsgBox "您好," & userInput & "!", vbInformation, "欢迎"
Else
MsgBox "您没有输入姓名。", vbExclamation, "提示"
End If
End Sub
获得单元格区域地址
Sub RngInput()
Dim rng As Range
On Error GoTo line
Set rng = Application.InputBox("请使用鼠标选择单元格区域:", , , , , , , 8)
'将选中区域的所有单元格的背景色设置为浅灰色
rng.Interior.ColorIndex = 15
line:
End Sub
4.调用内置对话框
如果需要使用“打印”“打开”等Excel内置对话框已经具有的功能,可以使用代码直接调用这些内置的 对话框
在VBA中,我们主要通过Application.Dialogs对象来调用这些内置对话框
常用的内置对话框有:
xlDialogOpen(1):打开文件对话框
xlDialogSaveAs(5):另存为对话框
xlDialogPrint(8):打印对话框
xlDialogPageSetup(7):页面设置对话框
Sub 使用内置对话框示例()
' 声明变量用于存储对话框的返回值
Dim result As Boolean
' 调用"打开文件"对话框
result = Application.Dialogs(xlDialogOpen).Show
' 如果用户选择了文件并点击了"打开",result 将为 True
If result Then
MsgBox "文件已成功打开!", vbInformation, "操作成功"
Else
MsgBox "用户取消了操作。", vbInformation, "操作取消"
End If
' 调用"打印"对话框
result = Application.Dialogs(xlDialogPrint).Show
' 如果用户设置了打印选项并点击了"打印",result 将为 True
If result Then
MsgBox "文档已发送到打印机!", vbInformation, "操作成功"
Else
MsgBox "用户取消了打印。", vbInformation, "操作取消"
End If
' 调用"页面设置"对话框
Application.Dialogs(xlDialogPageSetup).Show
' 注意:页面设置对话框不返回布尔值,所以我们不需要检查返回值
' 调用"另存为"对话框
result = Application.Dialogs(xlDialogSaveAs).Show
' 如果用户选择了保存位置并点击了"保存",result 将为 True
If result Then
MsgBox "文件已成功保存!", vbInformation, "操作成功"
Else
MsgBox "用户取消了保存。", vbInformation, "操作取消"
End If
End Sub
常量名 值 说明
xlDialogActiveCellFont 476 单元格字体
xlDialogBorder 45 边框
xlDialogCellProtection 46 单元格保护
xlDialogDeleteFormat 111 删除格式
xlDialogFormatNumber 42 设置数字格式
xlDialogPatterns 84 图案
xlDialogClear 52 清除
xlDialogColumnWidth 47 列宽
xlDialogRowHeight 127 行高
xlDialogConditionalFormatting 583 条件格式
xlDialogDefineName 61 定义名称
xlDialogDefineStyle 229 样式
xlDialogDisplay 27 显示选项
xlDialogFont 26 字体
xlDialogSetBackgroundPicture 509 工作表背景
xlDialogInsert 55 插入
xlDialogInsertHyperlink 596 插入超链接
xlDialogInsertPicture 342 插入图片
xlDialogNew 119 新建工作簿
xlDialogOpen 1 打开
xlDialogSaveAs 5 另存为
xlDialogWorkbookCopy 283 移动或复制工作表(当前工作簿)
xlDialogWorkbookInsert 354 插入工作表
xlDialogWorkbookMove 282 移动或复制工作表
xlDialogWorkbookName 386 重命名工作表
xlDialogWorkbookNew 302 新建工作簿
xlDialogWorkbookProtect 417 保护工作簿
xlDialogPageSetup 7 页面设置
xlDialogPrint 8 打印对话框
xlDialogPrinterSetup 9 打印机设置
xlDialogPrintPreview 222 打印预览
xlDialogSetPrintTitles 23 设置打印标题
xlDialogRun 17 运行
xlDialogTable 41 数据透视表
xlDialogSendMail 189 发送邮件
在VBA中,可以直接使用这些常量名来调用相应的对话框,比如:
Sub 打开打印对话框()
Application.Dialogs(xlDialogPrint).Show
End Sub
获取选定文件的文件名
如果只希望用户在显示的内置“打开”对话框中选定文件的文件名(以及路径),而不想真正打开该文件,那么可以使用GetOpenFilename方法
基本语法:
Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
FileFilter:指定文件类型筛选器(可选)
FilterIndex:指定默认选择的筛选器(可选)
Title:对话框标题(可选)
ButtonText:确认按钮文本(可选)
MultiSelect:是否允许多选(可选)
Sub 获取选定文件名()
' 声明变量
Dim selectedFile As Variant
' 设置文件筛选器
Dim fileFilter As String
fileFilter = "Excel文件 (*.xlsx; *.xls), *.xlsx; *.xls," & _
"所有文件 (*.*), *.*"
' 调用GetOpenFilename方法
selectedFile = Application.GetOpenFilename( _
FileFilter:=fileFilter, _
Title:="请选择一个文件", _
ButtonText:="选择")
' 检查用户是否选择了文件
If selectedFile <> False Then
' 用户选择了文件
MsgBox "您选择的文件是: " & selectedFile, vbInformation, "文件选择结果"
Else
' 用户取消了选择
MsgBox "您没有选择任何文件。", vbExclamation, "操作取消"
End If
End Sub
使用另存为对话框
在备份文件时可以使用GetSaveAsFilename方法显示标准的内置“另存为”对话框,获取备份文件的文件名和保存路径,而无需真正保存任何文件
基本语法:
Application.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)
InitialFilename:初始文件名(可选)
FileFilter:指定文件类型筛选器(可选)
FilterIndex:指定默认选择的筛选器(可选)
Title:对话框标题(可选)
ButtonText:确认按钮文本(可选)
Sub 使用另存为对话框()
' 声明变量
Dim backupPath As Variant
Dim defaultName As String
Dim fileFilter As String
' 设置默认文件名(可选)
defaultName = "备份文件_" & Format(Now, "yyyymmdd_hhnnss") & ".xlsx"
' 设置文件筛选器
fileFilter = "Excel工作簿 (*.xlsx), *.xlsx," & _
"Excel 97-2003 工作簿 (*.xls), *.xls," & _
"所有文件 (*.*), *.*"
' 调用GetSaveAsFilename方法
backupPath = Application.GetSaveAsFilename( _
InitialFilename:=defaultName, _
FileFilter:=fileFilter, _
Title:="选择备份文件保存位置", _
ButtonText:="保存")
' 检查用户是否选择了保存位置
If backupPath <> False Then
' 用户选择了保存位置
MsgBox "您选择的备份文件路径是: " & backupPath, vbInformation, "备份位置"
' 这里可以添加实际的备份逻辑
' 例如:ThisWorkbook.SaveCopyAs backupPath
Else
' 用户取消了操作
MsgBox "您取消了备份操作。", vbExclamation, "操作取消"
End If
End Sub
调用操作系统“关于”对话框
VBA程序开发按成后,有时需要一个“关于”对话框,除了使用窗体外,还可以调用操作系统的“关于”对话框,显示自定义的内容
' 在模块的顶部声明 ShellAbout 函数
Private Declare PtrSafe Function ShellAbout Lib "shell32.dll" Alias "ShellAboutA" ( _
ByVal hWnd As LongPtr, _
ByVal szApp As String, _
ByVal szOtherStuff As String, _
ByVal hIcon As LongPtr) As Long
' 创建一个自定义过程来显示"关于"对话框
Sub ShowAboutDialog()
' 定义变量
Dim appName As String
Dim appInfo As String
Dim result As Long
' 设置应用程序名称和信息
appName = "我的Excel VBA应用"
appInfo = "版本: 1.0" & vbNewLine & _
"作者: [您的名字]" & vbNewLine & _
"Copyright ? " & Year(Date) & vbNewLine & vbNewLine & _
"这是一个使用VBA开发的Excel应用程序。"
' 调用 ShellAbout 函数
result = ShellAbout(Application.hWnd, appName, appInfo, 0)
End Sub
' 在需要显示"关于"对话框的地方调用这个过程
Sub TestShowAbout()
ShowAboutDialog
End Sub
1 thought on “6.使对话框——《VBA常用技巧代码解析》”