vba-用户图形界面


 

一、控件介绍

用户图形界面主要是控件设置和操作

窗体控件、ActiveX控件:

Office2013:在开发工具——插入  下

Office2003:在视图——工具栏——窗体  下

窗体控件说明:

标签:用于输入和显示静态文本

分组框:用于组合其他多个控件

按钮:用于执行宏命令

复选框:选中控件,可以多项选择

选项按钮:用于选择的控件,通常几个选项按钮用组合框组合在一起使用,在一组中只能同时选择一个选项按钮

列表框:显示多个选项列表,用户可以从中选择一个选项

组合框:提供可选择的多个选项,用户可以选择其中的一个项目

滚动条:包括水平滚动条和垂直滚动条

微调控件:通过单击控件的箭头来选择数值

 

窗体控件:

 

ActiveX控件:

 

 

二、窗体、ActiveX控件的使用

使用“组合框控件”,设置控件格式——控制:

设置数据源区域(用来显示下拉菜单的值)、单元格链接(即现在的下拉数据在数据区域第几个值,选中“女”则显示2,“男”则显示1)、下拉显示项目数(即下拉框显示列表数量)

 

插入ActiveX的“选项按钮”,通过“设计模式”,“查看代码”添加代码实现其逻辑。

 

Private Sub xb1_Click()
    If xb1.Value = True Then
        Range("F2").Value = ""
        xb2.Value = False
    End If
End Sub

Private Sub xb2_Click()
    If xb2.Value = True Then '如果xb2被选中则执行如下逻辑
        Range("F2").Value = ""    '在F2单元格里输入“女”
        xb1.Value = False '更改xb1为未选中状态
    End If
End Sub

三、InputBox函数、Application.InputBox方法

1、InputBox函数

InputBox(Prompt:="提示文字",Title:="对话框标题,可省略",Default:="文本框默认值,可省略",xpos:="左端距离",ypos:="顶端距离")
str = InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500)
也可以省略所有参数:
str = InputBox("请输入姓名:", "操作提示", "张Dream", 2000, 2500)

除Prompt外,其他参数都可以省略

InputBox(Prompt:="提示文字",Title:="对话框标题,可省略",Default:="文本框默认值,可省略",xpos:="左端距离",ypos:="顶端距离")
str = InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500)
也可以省略所有参数:
str = InputBox(Prompt:="请输入姓名:",, Default:="张三")

Sub InBox()
    Dim str As String
    '第一个参数prompt是对话框上的提示文字
    '第二个参数Title是对话框的标题,如果省略,默认标题为“Microsoft Excel”
    '第三个参数Default是默认输入值,如果省略,则文本框中内容为空
    '第四个参数xpos是对话框左端与屏幕左端的距离,如果省略,对话框的水平方向居中显示
    '第五个参数ypos是对话框顶端与屏幕顶端的距离,如果省略,对话框将显示距离屏幕顶端约三分之一的位置
    str = InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500)
    Range("A1") = str '将输入的值写入A1单元格
End Sub

2、Application.InputBox方法

 

 

Sub AppInbox()
    Dim str As String
    str = Application.InputBox(prompt:="请输入姓名:", Title:="操作提示", Default:="五三", Left:=100, Top:=500)
    Range("A1") = str
End Sub

3、InputBox函数、InputBox方法的区别

 参数的差异:

InputBox(Prompt:="请输入姓名:", Title:="操作提示", Default:="张Dream", xpos:=2000, ypos:=2500)

 

Application.InputBox(prompt:="请输入姓名:", Title:="操作提示", Default:="五三", Left:=100, Top:=500)

 

InputBox函数只能返回一个String型的字符串,而InputBox方法返回的数据类型不确定,并且InputBox方法比InputBox函数多一个Type参数

 

Application.InputBox中Type参数说明

0:公式

1:数字:

2:文本

4:逻辑值(True或False)

8:单元格引用(Range对象)

16:错误值,如#N/A

64:数值数组

 

使用application.InputBox方法,返回Range对象

 

Option Explicit

Sub RngInput()
    Dim rng As Range '定义一个Range对象
    On Error GoTo cancel '如果单击“取消”按钮,出现错误,跳转到cancel处
    Set rng = Application.InputBox(prompt:="请选择要输入的单元格区域", Type:=8)
    rng.Value = 100 '在选中的单元格输入100
cancel:
End Sub 

Application.InputBox方法返回复合类型

Application.InputBox(prompt:="请选择要输入的单元格区域", Type:=1 + 2) '1:数字,2:文本,1+2:数字或文本中任意一种
Application.InputBox(prompt:="请选择要输入的单元格区域", Type:=3) '与上面语句效果一样 

四、MsgBox函数

1、参数语法

Sub msg()
    '第一个参数prompt时对话框中药显示的文本信息,时必选参数
    '第二个参数Buttons指定对话框中显示的按钮数目、按钮形式、使用的图标样式、缺省按钮以及消息框的强制回应等。参数值时值(或常数)的综合,如果省略,缺省值为0
    '第三个参数Title指定在对话框的标题栏中显示的字符串,如果省略,默认“Microsoft Excel”
    MsgBox prompt:="中午十二点,该吃饭了!", Buttons:=vbOKOnly + vbInformation, Title:="温馨提醒"
End Sub

 

2、MsgBox的6种按钮设定

Sub msg()
    MsgBox prompt:="显示“确定”按钮", Buttons:=vbOKOnly, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“确定”和“取消”按钮", Buttons:=vbOKCancel, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“中止”、“重试”和“忽略”按钮", Buttons:=vbAbortRetryIgnore, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“是”、“否”和“取消”按钮", Buttons:=vbYesNoCancel, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“是”和“否”按钮", Buttons:=vbYesNo, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“重试”和“取消”按钮", Buttons:=vbRetryCancel, Title:="练习MsgBox按钮"
End Sub

 

3、MsgBox的4中图标样式

  

Sub msg()
    MsgBox prompt:="显示“关键消息”按钮", Buttons:=vbCritical, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“警告询问”按钮", Buttons:=vbQuestion, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“警告消息”按钮", Buttons:=vbExclamation, Title:="练习MsgBox按钮"
    MsgBox prompt:="显示“通知消息”按钮", Buttons:=vbInformation, Title:="练习MsgBox按钮"
End Sub

 

处理MsgBox交互结果

Sub msg()
    Dim yn As Integer
    yn = MsgBox(prompt:="是否在A1单元格中输入100?", Buttons:=vbYesNo + vbQuestion, Title:="练习MsgBox按钮")
    If yn = vbYes Then
        Range("A1").Value = 100
    ElseIf yn = vbNo Then
        Range("A1").Value = -2
    End If
End Sub

 

4、设置缺省按钮和对话框类型

默认情况下按回车键即可执行的按钮成为缺省按钮(如果按钮上有虚线框,则这个按钮为缺省按钮)

Sub msg()
    Dim yn As Integer '第二个按钮设置为缺省按钮,参数值也可以携程4+32+256 或292
    yn = MsgBox(prompt:="是否在A1单元格中输入100?", Buttons:=vbYesNo + vbQuestion + vbDefaultButton2, Title:="练习MsgBox按钮")
    If yn = vbYes Then
        Range("A1").Value = 100
    ElseIf yn = vbNo Then
        Range("A1").Value = -2
    End If
End Sub

  

 Buttons参数还有第四组设定值,用来决定对话框的类型,如下表:

5、MsgBox函数的返回值

 

Sub msg()
    Dim yn As Integer
    yn = MsgBox(prompt:="是否在A1单元格中输入100?", Buttons:=vbYesNo + vbQuestion)
    '判断用户按下哪一个按钮
    If yn = vbYes Then
        Range("A1").Value = 100
    ElseIf yn = vbNo Then
        Range("A1").Value = -2
    End If
End Sub

  

五、Application对象的FindFile方法

 判断文件是否打开

Sub OpenFile()
    If Application.FindFile = True Then '判断文件是否打开
        MsgBox "选中的文件已打开!"
    Else
        MsgBox "没有打开任何文件!"
    End If
End Sub

 

六、Application对象的GetOpenFilename方法、FileFilter方法

 获取选中文件的文件名

Sub GetFile()
    Dim fil As String
    fil = Application.GetOpenFilename() '将选中的文件名赋给变量fil1
    If fil = "False" Then
        MsgBox "没有选中任何文件"
        Exit Sub
    Else
        Range("A1").Value = fil
    End If
End Sub

D:\Study\Excel\公式.xlsx

可以使用FileFilter参数限制可选择的文件类型。

Sub GetFile()
    Dim fil As String
    'filefilter 参数是一个文本字符串 "Excel 97-2003 工作簿(*.xls)"是文件筛选条件,显示在【文件类型】下拉列表
    '.xls指定在对话框中显示的文件类型,筛选条件和文件类型之间用英文逗号(,)隔开
    'fil = Application.GetOpenFilename(filefilter:="Excel 97-2003 工作簿(*.xlsx),*.xls") '将选中的文件名赋给变量fil1
    'fil = Application.GetOpenFilename(filefilter:="Excel 工作簿(*.xlsx),*.xlsx") '将选中的文件名赋给变量fil1
    fil = Application.GetOpenFilename(filefilter:="Excel 文件(*.xl*),*.xl*", MultiSelect:=True)
    If fil = "False" Then
        MsgBox "没有选中任何文件"
        Exit Sub
    Else
        'D:\Study\Excel\公式.xlsx
        Range("A1").Value = fil
    End If
End Sub

如果希望能在两种或多种类型的文件中选择,可以修改参数值,如下(文件类型可以用*表示,例如*.xls*):

Sub GetFile()
    Dim fil As String
    fil = Application.GetOpenFilename(filefilter:="Excel或Word 文件(*.xls;*.xlsx;*.doc),*.xls*;*.xlsx;*.doc")
    If fil = "False" Then
        MsgBox "没有选中任何文件"
        Exit Sub
    Else
        Range("A1").Value = fil
    End If
End Sub

除了FileFilter、GetOpenFilename方法还有其他参数,例如:

FileFilter参数执行在对话框中显示的文件类型

filerIndex参数指定【文件类型】下拉列表中的第几项为默认文件筛选条件,如果省略,默认为1

MultiSelect参数决定可以选中的文件个数。如果设置为True,表示可以同时选中多个文件,默认值为False,即只能选中一个文件

Title参数设置对话框的标题,如果省略,默认为“打开” 

Sub GetFile()
    Dim fil
    'filefilter 指定在对话框中显示的文件类型
    'FilterIndex 指定【文件类型】下拉列表中的第几项为默认文件筛选条件,如果省略,默认为1
    'Title 设置对话框的标题
    'MultiSelect 决定可以选中的文件个数,如果设置为True,表示可以同时选中多个文件,默认值为False,即只能选中一个文件
    fil = Application.GetOpenFilename(filefilter:="Excel 97-2003 工作簿(*.xls*),*.xls*,Word 97-2003 文档(*.doc),*doc", FilterIndex:=2, Title:="请选择文件", MultiSelect:=True)
    [A1].Resize(UBound(fil), 1) = Application.WorksheetFunction.Transpose(fil)
End Sub

'D:\Study\Excel\Excel基础.xlsx
'D:\Study\Excel\公式.xlsx

 

七、Application对象的GetSaveAsFilename方法

GetSaveAsFilename方法打开【另存为】对话框,在对话框里选择文件,获得文件名。  

Sub GetSaveAs()
    Dim fil As String, filename As String, filter As String, tle As String
    filename = "我要选择的文件"
    filter = "Excel 97-2003 工作簿(*.xls*),*.xls*,Word 97-2003 文档(*.doc),*.doc,文本文件(*.txt),*.txt"
    tle = "请选择需要的文件"
    '用变量做方法的参数
    '第一个参数InitialFileName指定显示的文件名,如果省略,则显示活动工作簿的名称
    '第二个参数filefilter执行文件的筛选条件
    '第三个参数FilterIndex设置【保存类型】下拉列表中的第几项默认筛选条件,如果省略,默认值为1
    '第四个参数Title指定对话框的标题,如果省略面膜人为“另存为”
    fil = Application.GetSaveAsFilename(InitialFileName:=filename, filefilter:=filter, FilterIndex:=2, Title:=tle)
    Range("A1") = fil '把文件名写入A1单元格
End Sub

八、Application对象的FileDialog属性

 FileDialog属性可以获得指定目录的路径及名称,如下:

Option Explicit

Sub getFolder()
    With Application.FileDialog(filedialogtype:=msoFileDialogFolderPicker)
        .InitialFileName = "D:\" '设置D盘根目录为起始目录
        .Title = "请选择一个目录" '设置对话框标题
        .Show '显示对话框
        If .SelectedItems.Count > 0 Then '判断是否选中了目录
            Range("A1").Value = .SelectedItems(1) '将选择的目录名及路径写进A1单元格
        End If
    End With
End Sub

'D:\Study\Excel\Excel公式与函数-示例文件

除了msoFileDialogFolderPicker,filedialogtype参数还可以选用其他的值,如下:

 

九、构建用户窗体,自己设计交互界面

用户窗体时Excel的另一个对象:UserForm对象,用户可以在窗体上自由添加ActiveX控件,并利用这些控件从用户那里获得信息,或将信息输出给用户  

1、添加窗体两种:在VBA编辑窗口

1、【插入】——【用户窗体】

 2、右键单击工程目录树——选中【插入】——【用户窗体】

2、设置窗体属性

分别是“窗体名称”、“窗体标题栏名称”

 

也可以按照属性分类查看,并进行设置

 

如果对属性不太熟悉,可以选中属性后,按快捷键F1,即可弹出帮助信息

帮助地址:https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/bordercolor-property

 

3、在窗体中添加控件

 如果窗口中没有显示【工具箱】,可以依次执行【视图】——【工具箱】菜单命令打开它。

默认情况下,【工具箱】中有16种控件相同。如果想增加【工具箱】中的控件数目,可以右键单击【工具箱】窗体,执行【添加控件】菜单命令进行添加。

4、窗体相关设置

Option Explicit

'窗体显示
Sub xianshi()
    Load 录入  '加载"录入"窗体
    录入.Show  '显示"录入"窗体,将窗体显示给用户
End Sub

'窗体的显示模式
Sub modal()
    '录入.Show vbModal '显示窗体模式窗体,默认或缺省则为vbModal,这个窗体将以模式窗体显示
    录入.Show vbModeless  '显示无模式窗体
    Range("A1") = "现在显示的是无模式窗体!"
End Sub

'关闭窗体
Sub hideform()
    录入.Hide '隐藏"录入"窗体
End Sub
Sub unloadform()
    Unload 录入  '卸载"录入"窗体,卸载后窗体将从屏幕和内存中同时删除
End Sub

5、给窗体添加控件,并使用控件

 

对窗体进行初始化设置UserForm_Initialize

Private Sub UserForm_Initialize()
    '设置性别复合框的条目为“男”和“女”
    性别.List = Array("", "")
End Sub

 

 为命令按钮添加事件过程

Option Explicit

Private Sub UserForm_Initialize()
    '设置性别复合框的条目为“男”和“女”
    性别.List = Array("", "")
End Sub

Private Sub 确定_Click()
    '判断信息输入是否完整
    If 姓名.Value = "" Or 性别.Value = "" Or 出生年月.Value = "" Then
        MsgBox "信息输入不完整,请重新输入!", vbExclamation, "错误提示"
        Exit Sub '退出执行程序
    End If
    Dim xrow As Integer
    xrow = Range("A1").CurrentRegion.Rows.Count + 1 '求第一行空行行号
    '将姓名,性别,出生年月写入第一条空行
    Cells(xrow, "A") = 姓名.Value
    Cells(xrow, "B") = 性别.Value
    Cells(xrow, "C") = 出生年月.Value
    '内容写入工作表后,将控件中的内容清除
    姓名.Value = ""
    性别.Value = ""
    出生年月.Value = ""
    
    
End Sub

Private Sub 退出_Click()
    Unload Me '卸载“录入”窗体,Me指录入窗体,即代码所在的模块
End Sub

6、用键盘控制控件

1)更改控件的<Tab>键顺序

在【视图】——【Tab键顺序(A)】在弹出框调整即可

  

2)给控件执行快捷键 

 将Accelerator设置为N,表示按下<Alt+N>组合键等于在窗体单击【确定】按钮

 

7、改造Excel现有的界面

 1)更改标题栏的程序名称,默认名称是“Microsoft Excel”

Application.Caption = "我的程序" '更改标题栏程序名称为“我的程序”

2)显示或隐藏菜单栏

逐个隐藏

Sub MenuHide()
    Dim i% '定义一个变量
    With Application.CommandBars(1)
        .Controls("文件(&F)").Visible = False
        .Controls("编辑(&E)").Visible = False
        .Controls("视图(&V)").Visible = False
        .Controls("插入(&I)").Visible = False
        .Controls("格式(&O)").Visible = False
        .Controls("工具(&T)").Visible = False
        .Controls("数据(&D)").Visible = False
        .Controls("窗口(&W)").Visible = False
        .Controls("帮助(&H)").Visible = False
    End With
End Sub

也可以用循环语句实现隐藏

Sub MenuHide()
    Dim i% '定义一个变量
    With Application.CommandBars(1)
        For i = 1 To .Controls.Count
            .Controls(i).Visible = False '隐藏第i个菜单,false为隐藏,true为显示
        Next
    End With
End Sub

3)显示或隐藏工具栏

Sub ToolHide()
    '隐藏 常用工具栏 和 格式工具栏
    With Application
        .CommandBars("Starndard").Visible = False '隐藏常用工具栏
        .CommandBars("Formatting").Visible = False '隐藏格式工具栏
    End With
End Sub

想隐藏窗口中显示的所有工具栏,可以使用程序: 

Sub ToolHide()
    Dim i%
    For i = 2 To Application.CommandBars.Count '索引号为2开始,因为1时菜单栏
        Application.CommandBars(i).Enabled = False '隐藏所有工具栏
    Next
End Sub

4)设置窗口 

Sub WindowSet()
    With ActiveWindow
        .DisplayHeadings = False '隐藏行标和列标
        .DisplayHorizontalScrollBar = False '隐藏水平滚动条
        .DisplayVerticalScrollBar = False '隐藏垂直滚动条
        .DisplayGridlines = False '隐藏网格线
        .DisplayWorkbookTabs = False '隐藏工作表标签
    End With
End Sub 

5)其他设置

Sub Other()
    With Application
        .DisplayFormulas = False '隐藏编辑栏
        .CommandBars.DisableAskAQuestionDropdown = True '隐藏帮助
        .CommandBars("ply").Enabled = False '右键单击工作表标签后不显示菜单
        .CommandBars("cell").Enabled = False '右键单击工作表区域后不显示菜单
        .DisplayStatusBar = False '隐藏状态栏
        .ShowStartupDialog = False '隐藏任务窗格
    End With
End Sub 

十、典型的技巧或示例

 等等……

 

十一、代码调试与优化

1、VBA可能发生的错误分类

编译错误

运行时错误

逻辑错误

2、VBA程序的3种状态

设计模式

运行模式

中断模式:这时通过F8键逐句执行程序,观察运行情况。

3、断点

设置断点,可以利用F9快捷键快速设置或清除断点

F8逐行执行程序,观察运行情况

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM