VBA 中的用户窗体就是指带 UI 的用户界面,在运行的时候会单独弹出一个窗口,类似于在 windows 系统中运行的一个可执行程序一样(这个说法不太严谨,因为可执行程序也可能是只有命令窗口而没有 UI 的)。再具体一点,就是一个窗口界面当中,有可能会包含有文本框、复选框、单选按钮、下拉列表,就如在网页中填写的表单一样。再具体一点,就是如下图这样的:

1. 用户界面设计

如上图,UI 设计的部分其实是很简单的,微软的特色,直接拖拉拽就可以实现了。而每一个控件(或者称为元素,也即放进窗体中的各种按钮、输入框等等)的属性,可以在选中它之后,在默认位于左下角的 “属性” 列表框中进行设置,可设置项包含按钮的名字、前景色、背景色、显示出来的文本、宽度、高度、字体颜色、字号、距离左侧的距离、距离顶部的距离等等,很简单。如果这个 “属性” 框没有出现的话,可以在顶部菜单栏的 “视图” 中选择 “属性窗口”,它就会出现了。

2. 用户交互

2.1 按钮事件

直接在窗体中双击放进去的按钮,就可以进入到按钮的事件开发界面,默认的是单击事件,如下图

留意上图中的红框部分,左上角显示的是该按钮的名称,右上角显示的是该按钮的事件,这里是单击事件 Click,这两个都是下拉选择框,分别点击它们右边的倒三角可以看到其它的控件和各控件对应的其它方法,如下

如果你选中了其它事件,则 VBE 会自动给你生成这个事件的函数签名,它是根据按钮的名称和事件名称来命名的,所以这个函数名字应该是不能改动的(我没有试过改)

其它按钮的事件也类似,就不赘述了。

2.2 获取控件的值

因为控件很多,就不能一一举例了,只举几具做为示例,其它也类似的,通常都是它在属性列表中叫什么,就能通过这个名字来取到它的值

文本框

假设文本框名为 tbx,则通过 tbx.Value 或者 tbx.Text 都能得到输入到文本框中的内容

多选按钮

假设多选按钮名为 cbx,则通过 cbx.Value 可以得到这个多选按钮的值,如果它被选中了,则值为 True,否则为 False。通过 cbx.Caption 可以得到这个多选按钮对应的文本

单选按钮

假设单选按钮名为 obtn,则通过 obtn.Value 可以得到这个多选按钮的值,如果它被选中了,则值为 True,否则为 False。通过 cbx.Caption 可以得到这个多选按钮对应的文本

3. 历遍所有控件

比如一个窗体中,存在多个多选框,要一个个去判断它是否被选中,此时可以考虑历遍所有控件,通过判断控件类型的方法来获取多选框。

先看如下代码:

orderStr = ""
For Each ctrls In Me.Controls
If TypeName(ctrls) = "CheckBox" Then
If ctrls.Value = True Then
orderStr = orderStr & "||" & ctrls.Caption
End If
End If
Next ctrls

Me.Controls 是一个固定的写法,Me 代表当前窗体,而 Controls 则表示窗体上的所有控件。用 TypeName 函数来判断每个控件的类型,然后就可以对不同的控件执行不同的操作了

4. 动态生成控件

即不再使用人工的方式来拖拉拽设置控件,而是在 VBA 代码中来根据条件来动态地添加控件到窗体中。

先看代码:

For Each order In orderArr
Set newCbk = form_combinedModel.Controls.Add("Forms.CheckBox.1")
With newCbk
.Left = 30
.Top = y
.Width = 80
.Height = 18
.Caption = order
End With
y = y + gap
panelH = panelH + gap
Next order

这里的 orderArr 是一个数组,所以可以使用 For Each 来历遍它。重点在于第 2 行,这里的 form_combinedModel 是窗体的名字,通过它的 .Controls.Add 方法就能够添加新控件。这个方法的参数是固定的,需要添加什么类型的控件就使用对应的参数,示例代码中添加的是多选框,对应的是 Forms.CheckBox.1,这个参数可以在 这里 找到。

此外要注意的是,这个新添加的控件是一个对象,所以需要在变量前面使用 Set 关键字。示例代码中接下来的 With 语句,是用于设置这个新的控件的属性,这里设置了它的位置(左距、上距)、宽度、高度、显示文本


本系列教程其它文章

Excel VBA 入门(零)

Excel VBA 入门(一)数据类型

Excel VBA 入门(二)数组和字典

Excel VBA 入门(三) 流程控制1-条件选择

Excel VBA 入门(四)流程控制2-循环控制

Excel VBA 入门(五)Excel对象操作

Excel VBA 入门(六)过程和函数

Excel VBA 入门(七)注释、宏按钮及错误处理

Excel VBA 入门(八)单元格边框

Excel VBA 入门(九)操作工作薄

Excel VBA入门(十)用户窗体开发

Excel VBA入门(十)用户窗体开发的更多相关文章

  1. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  2. Excel VBA入门(八)单元格边框

    本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...

  3. Excel VBA入门(七)注释、宏按钮及错误处理

    系统性的知识前面已经讲完,从本章开始,本系列教程涉及的将会是一些相对凌散的内容. 1. 注释 代码注释是一件利人利己的事,为了方便自己在代码需要更新修改时,依然能够快速地看懂自己完的每一行代码到底是什 ...

  4. Excel VBA入门(六)过程和函数

    前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...

  5. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  6. Excel VBA入门(四)流程控制2-循环控制

    所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...

  7. Excel VBA入门(三) 流程控制1-条件选择

    VBA中的流程控制分为两种,其一是条件结构式的,即根据条件判断的结果去选择性执行相应的语句(块):另一种是循环,即循环地执行语句(块).本节介绍第一种. 1. IF if 语句其实包含有几种形式: ① ...

  8. Excel VBA入门(一)数据类型

    与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...

  9. Excel VBA入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

随机推荐

  1. Java连载24-break语句、continue语句、输出质数练习

    ​一.break 1.break是Java语言中的关键字,被翻译为“中断/折断” 2.break + ";"可以成为一个单独的完整的java语句:  break; 3.break语 ...

  2. fiddler的安装于使用(一)安装fiddler

    Fiddler的简介 Fiddler是位于客户端和服务器端之间的代理,也是目前最常用的抓包工具之一 .它能够记录客户端和服务器之间的所有 请求,可以针对特定的请求,分析请求数据.设置断点.调试web应 ...

  3. Ryuji doesn't want to study 2018徐州icpc网络赛 树状数组

    Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, ea ...

  4. lightoj 1086 - Jogging Trails(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1086 题解:题目就是求欧拉回路然后怎么判断有欧拉回路只要所有点的度数为偶数.那 ...

  5. 模板汇总——KMP & EX-KMP

    1. kmp 相当于往前求出一段字符信息,使得 这段字符信息和前缀相等. void getnext(){ , j = ; nx[] = -; while(j < m){ || b[j] == b ...

  6. lightoj 1036 - A Refining Company(简单dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1036 题解:设dp[i][j]表示处理到(i,j)点时的最大值然后转移显然是 ...

  7. 基于GitLab+Jenkins的DevOps赋能实践

    随着微服务.中台架构的兴起,DevOps也变得非常关键,毕竟是一些基础设施层面的建设,如果搞好了对后面的研发工作会有很大的效率提升.关于DevOps本身的概念,网上已经非常多了,在园子里随便搜索一些都 ...

  8. Erlang模块supervisor翻译

    概要: 通用监督者行为   描述: 一个实现监督者的行为模块,一个监督被称为子进程的其它进程的进程.一个子进程可以是另一个监督者或工作者进程.工作者进程通常的实现使用gen_event,gen_fsm ...

  9. Docker下使用disconf:细说demo开发

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  10. m6A甲基化及预测方法工具总结

    DNA.RNA和蛋白三个层面的可逆修饰示意图(Fu et al. Nature Reviews Genetics, 2014) DNA和蛋白存在各种修饰,RNA也不例外,目前已知的RNA修饰已经超过上 ...