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. Azure DevOps vsts-agent-linux 安装出错, Must not run with sudo

    在linux安装 vsts-agent-linux 在vsts-agent-linux的解压目录运行./config.sh, 提示"Must not run with sudo", ...

  2. JVM知识点总结

    JVM总体梳理 一.jvm体系总体概览 JVM体系总体分四大块:类的加载机制.jvm内存结构.GC算法 垃圾回收.GC分析 命令调优 这里画了一个思维导图,将所有的知识点进行了陈列,因为图比较大可以点 ...

  3. 使用WPF为Powershell程序制作GUI界面

    1. 使用Xaml创建应用界面 打开visual studio,创建一个新的项目,在已安装模板中选择Visual C# →Wpf应用. 完成创建后,我们得到如下图所示的应用界面. wpf界面是基于xa ...

  4. asp.net comp雷达图

    <system.web> <httpHandlers> <add path="ChartImg.axd" verb="GET,HEAD,PO ...

  5. Docker笔记(九):网络管理

    Docker的应用运行在容器中,其相互之间或与外部之间是如何通信的,涉及到哪些知识点,本文对相关内容进行整理.因网络这块牵涉的面较多,因此只从日常使用或理解的角度出发,过于专业的就不深入探讨了. 1. ...

  6. javascript删除数组元素的7个方法

    在JavaScript中,除了Object之外,Array类型(数组)恐怕就是最常用的类型了.与其他语言的数组相比,JavaScript中的Array非常灵活.这种灵活性有利有弊,好处是其富有创造性, ...

  7. Go组件学习——手写连接池并没有那么简单

    1.背景 前段时间在看gorm,发现gorm是复用database/sql的连接池. 于是翻了下database/sql的数据库连接池的代码实现,看完代码,好像也不是很复杂,但是总觉得理解不够深刻,于 ...

  8. http gzip压缩功能记录

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 本文链接:https://www.cnblogs.com/shaoshuai95928/articles/Tomcat.html 最近在spri ...

  9. MAC下安装REDIS和REDIS可视化工具RDM并连接REDIS

    实验环境:一台mac V:10.13.6 一.安装redis brew install redis 二.安装RDM 直接下载安装rdm dmg文件 链接: https://pan.baidu.com/ ...

  10. 分析spring4和spring5日志中的不同

    日志在工作中起到关键作用,我们经常使用它来打印关键信息,方便分析,或者是输出错误信息,用于bug排查,spring中同样使用了日志进行信息的输出,但是spring4和spring5之间的日志又有些不同 ...