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. Python处理NetCDF格式数据为TIFF数据(附脚本代码)

    博客小序:NetCDF格式数据广泛应用于科学数据的存储,最近几日自己利用python处理了一些NetCDF数据,特撰此博文以记之. 参考博客: https://www.cnblogs.com/shou ...

  2. 推荐一个比 ls 命令速度快 100 倍的文件目录浏览神器

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...

  3. 学习笔记(一)-PyTorch在Windows环境搭建

    一.安装Anaconda 3.5 Anaconda是一个用于科学计算的Python发行版,支持Linux.Mac和Window系统,提供了包管理与环境管理的功能,可以很方便地解决Python并存.切换 ...

  4. cogs1709. [SPOJ 705] 不同的子串(后缀数组

    http://cogs.pro:8080/cogs/problem/problem.php?pid=vyziQkWaP 题意:给定一个字符串,计算其不同的子串个数. 思路:ans=总共子串个数-相同的 ...

  5. Codeforces 735D Taxes(简单数论)

    题目链接 http://codeforces.com/problemset/problem/735/D 题意:一个人的收入为n他要交的税是n的最大除数,他为了少缴税将n分成k个数n1,n2,n2... ...

  6. 最长上升子序列模板 hdu 1087 Super Jumping! Jumping! Jumping!

    Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. May ...

  7. poj 2352 & Ural 1028 数星星 题解

    一道水题,由于x坐标递增y坐标也递增于是前缀和统计即可,用树状数组实现. #include<bits/stdc++.h> using namespace std; const int ma ...

  8. R:ggplot2数据可视化——基础知识

    1 安装 # 获取ggplot2 最容易的就是下载整个tidyverse: install.packages("tidyverse") # 也可以选择只下载ggplot2: ins ...

  9. webstrom 内存溢出,软件崩溃卡死解决的方法

    今天用gulp搭建了一个工程,准备做一个体育h5的项目,其中需要用到sass代码压缩,加版本号等功能. gulpfile.js和package.json都是已经写好的.我用CMD命令窗口cnpm安装n ...

  10. docker容器内 java应用程序启动慢

    原谅我对JVM 不是很熟悉. 参考http://hongjiang.info/tomcat-startup-slowly-in-docker/ 感谢作者.