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. Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths)

    Leetcode之深度优先搜索(DFS)专题-1080. 根到叶路径上的不足节点(Insufficient Nodes in Root to Leaf Paths) 这篇是DFS专题的第一篇,所以我会 ...

  2. POJ - 3164-Command Network 最小树形图——朱刘算法

    POJ - 3164 题意: 一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图. 题目就是求这个最小的树形图. 参考资料:https://blog.csdn.net/ ...

  3. Codefroces 374 B Inna and Sequence (树状数组 || 线段树)

    Inna and Sequence 题意:先给你一个n,一个m, 然后接下来输入m个数,表示每次拳击会掉出数的位置,然后输入n个数,每次输入1或0在数列的末尾加上1或0,如果输入-1,相应m序列的数的 ...

  4. CF999C Alphabetic Removals 思维 第六道 水题

    Alphabetic Removals time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. odoo12从零开始:三、1)创建你的第一个应用模型(module)

    前言 以前,我一直都不知道为什么好多框架的入门都是“hello world”开始,当我思前想后我要如何介绍odoo的model.record.template等继承等高级特性时,发现在那之前便需要清楚 ...

  6. 关于BFC的一些事

    BFC的生成 在实现CSS的布局时,假设我们不知道BFC的话,很多地方我们生成了BFC但是不知道.在布局中,一个元素是block元素还是inline元素是必须要知道的.而BFC就是用来格式化块状元素盒 ...

  7. 【LeetCode】75-颜色分类

    题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色 ...

  8. c语言实现名值对通过key查找value

    需求.例如: 1." key1 = value1 " 通过"key1"从该字符串中查找出"value",value去除前后空格 2.&quo ...

  9. IPv6地址存储

    import java.util.Arrays; /** * @author: 何其有静 * @date: 2019/4/2 * @description: IPv6地址存储 * https://mp ...

  10. 阿里雷卷:Reactive 基金会的成立将对开发方式带来哪些影响?

    作者 | 赵钰莹 近日,Linux 基金会宣布成立 Reactive 基金会.对于 Reactive,各位开发者应该并不陌生,尤其是 Node.js 开发者,但真正了解并意识到这件事情对开发方式带来的 ...