【数据分析】Excel中使用VBA进行宏编程

Microsoft Excel是广泛用于数据处理和分析的工具,而VBA(Visual Basic for Applications)是一种基于Microsoft Visual Basic的编程语言,可用于在Excel中创建自定义宏和自动化任务,控制Excel工作簿、工作表和数据,执行各种操作。这篇博客将介绍如何使用VBA进行Excel宏编程,以提高工作效率和自动化重复任务。

0 准备工作

  1. Excel中主选项卡默认是没有开发工具选项的,需要选择主选项卡文件→选项→自定义功能区,打开Excel中的开发工具面板:
    在这里插入图片描述
    这样,在Excel的主选项卡中就有开发工具选项了:
    在这里插入图片描述

  2. 在开发工具选项卡中选择Visual Basic,进入VBA编辑器(或使用快捷键Alt+F11):
    在这里插入图片描述

  3. 创建新的模块(Module)并开始编写第一个宏:
    在这里插入图片描述

  4. 如,在Excel中显示消息框:

    Sub 显示消息框()
        MsgBox "欢迎使用VBA宏编程!"
    End Sub
    

    在这里插入图片描述

  5. 编写完成后,保存,使用F5运行或者在开发工具选项卡中选择“运行”来执行宏:
    在这里插入图片描述

  6. 运行结果:
    在这里插入图片描述

1 VBA简介

1.1 Excel VBA应用程序的构成

从开发者角度看,Excel VBA应用程序由工作表、用户窗体、模块和类模块等部分构成。

  • 工作表:用于保存和显示程序的数据,是程序的主体部分。一般先在工作表中制作出特定表格的格式,并设置好样式,再通过VBA代码获取表格中的数据,经过加工处理后将其填写入相应的单元格,供用户进行查看、打印输出等操作。
  • 用户窗体:在Excel VBA应用程序中,除了可使用工作表与用户进行交互外,还可向程序添加用户窗体,用来与用户进行交互操作。使用用户窗体可将用户与工作表中的数据进行隔离,防止数据被意外修改并隐藏工作表中的敏感数据,使限制权限的用户只看到应该操作的数据。
  • 模块:在模块中可保存程序的通用过程,供其他过程调用。例如录制宏的代码就保存在模块中。
  • 类模块:在Excel VBA中,除了可使用系统提供的对象外,还可通过自定义类来创建自定义的对象,自定义的类必须保存在“类模块”中。大多数应用程序都不使用“类模块”。

1.2 事件驱动

VBA 是运行在 Microsoft Office 软件之上,包括 Excel、Word、PPT、Outlook 等,可以用来编写非软件自带的功能的编程语言,不同的是每一个软件具有自己独有的对象,例如 Excel 有单元格对象,Word 有段落对象,PPT 有幻灯片对象。

Office 软件提供丰富的功能接口,VBA 可以调用它们,实现自定义的需求。基本上,能用鼠标和键盘能做的事情,VBA 都能做,它采用了与Windows相似的事件驱动编程方式。

在这种模式下,Windows监视窗口活动或事件信号,这些事件可以是用户鼠标点击或按键操作,也可以是程序控制或其他窗口的操作引发的。通过VBA的事件驱动机制,开发人员可以编写事件过程来处理系统产生的事件,实现特定的功能,如在鼠标点击时打开一个窗口。

与传统的过程化应用程序不同,事件驱动的应用程序中,代码执行路径不是按照预定顺序进行的。相反,代码在响应不同事件时执行不同的片段。这些事件可以由用户、操作系统、其他应用程序的消息触发,甚至是应用程序自身的消息触发。

由于事件顺序无法预测,代码必须对各种执行状态做出假设。为确保这些假设在执行时有效,应用程序的结构需要组织良好。在Excel中使用VBA开发应用程序实质上是编写处理各对象不同事件的代码。

1.3 宏

简单的说,宏就是一段可以运行的 VBA 代码片段。Excel宏使用VBA语言进行编写,通过VBA编写的宏可控制Excel,对Excel的功能进行扩充。

1.3.1 创建宏

Excel提供了两种创建宏的方法:一种方法是利用Excel操作环境中的宏录制器录制用户的操作;另一种方法是使用Visual Basic编辑器编写自己的宏代码。

利用宏录制器可记录用户在Excel中的操作动作,以便自动创建需要的宏,这在不太了解宏命令时是非常方便的。

使用Visual Basic编辑器可以打开已录制的宏,修改其中的命令,也可以在Visual Basic编辑器中直接输入命令创建宏。对于很多无法录制的命令(如创建新的窗体等),使用Visual Basic编辑器创建宏是唯一的方法。

启用录制宏的两种方式:

在这里插入图片描述

在这里插入图片描述

注:宏名不但可以包含字母、数字和下画线,还可以使用中文,但不能包含空格。但名称开头需为字母或下划线,且不能与已有宏重名。

在这里插入图片描述
注:在宏中定义的快捷键将覆盖任何对等的默认的Excel快捷键。

在创建宏之后,可以将宏分配给对象(如按钮、图形、控件和快捷键等),这样执行宏就像单击按钮或按快捷键一样简单。正是由于这种操作方便的特性,使用宏可以方便地扩展Excel的功能。如果不再需要使用宏,可以将其删除。

如果将录制的宏名称设置为“Auto_Open”,则每次打开包含此宏的工作簿时,该宏都会运行。另一种在打开工作簿时自动运行宏的方法是使用Visual Basic编辑器(VBE)在工作簿的Open事件中编写VBA过程。Open事件是一个内置的工作簿事件,它会在每次打开该工作簿时都运行自己的宏代码。如在用户打开工作簿时显示一个“欢迎”对话框,可新建一个模块,在其中输入以下代码:

        Sub Auto_Open()
          MsgBox ("欢迎使用Excel!")
        End Sub

保存并关闭该文件,若提示不能保存,则选择“否”后,将文件保存为.xlsm类型即可。
在这里插入图片描述
再次打开该文件时,将会显示“欢迎使用Excel!”的对话框。

1.3.2 宏安全

从Office软件支持宏开始,宏病毒也随之出现。许多病毒经过专门设计,可以利用VBA宏对系统和数据文件进行恶意操作。因此,宏的安全性越来越受到用户的重视。

按照如下步骤设置宏安全性:

  1. Excel选项卡选择文件→选项→信任中心或者选项卡选择开发工具→宏安全
    在这里插入图片描述
  2. 设置宏的安全性为禁用所有宏,并发出通知
    在这里插入图片描述
    四种类型的宏设置:
  • “禁用所有宏,并且不通知”:如果不信任宏,则使用此设置。文档中的所有宏及有关宏的安全警报都被禁用。如果文档具有信任的未签名的宏,则可以将这些文档放在受信任的位置上。受信任的位置中的文档可直接运行,不会由信任中心安全系统进行检查。
  • “禁用所有宏,并发出通知”:这是默认设置。如果想禁用宏,但又希望在存在宏时收到安全警报,则应使用此选项。这样,可以根据具体情况选择何时启用这些宏。
  • “禁用无数字签署的所有宏”:此设置与“禁用所有宏,并发出通知”选项相同。但下面这种情况除外:在宏已由受信任的发行者进行了数字签名时,如果信任发行者,则可以运行宏;如果不信任发行者,将发出通知。这样,可以选择启用那些签名的宏或信任发行者的宏。所有未签名的宏都被禁用,且不发出通知。
  • “启用所有宏(不推荐,可能会运行有潜在危险的代码)”:可以暂时使用此设置,以便允许运行所有宏。因为此设置容易使计算机受到恶意代码的攻击,所以不建议永久使用此设置。

2 VBA基础

2.1 注释

VBA 中的注释以英文单引号 ' 开头,后面接注释的内容。从单引号开始的部分不会被执行。

'我是一行注释

2.2 数据类型

Excel单元格中可以保存处理多种类型的数据,包括数值、日期/时间、文本、货币等。VBA中除了提供这些数据类型之外,还提供字节、布尔和变体数据等类型。

2.2.1 基本数据类型

常见的VBA基本数据类型如下表:

数据类型 含义 精度范围
Byte 字节型 0 ~ 255
Integer 整型 -32,768 ~ 32,767
Long 长整型 -2,147,483,648 ~ 2,147,483,647
String 字符串 变长字符串:0 ~ 20亿(231)个字符
定长字符串:1~约64K(216)个字符
Single 单精度浮点型 在表示负数时: -3.402823E38 ~ -1.401298E-45
在表示正数时: 1.401298E-45 ~ 3.402823E38
Double 双精度浮点型 在表示负数时: -1.79769313486231E308 ~ -4.94065645841247E-324
在表示正数时: 4.94065645841247E-324 ~ 1.79769313486231E308
Decimal 定点数 未放置定点数: +/- 79,228,162,514,264,337,593,543,950,335
放置定点数: +/- 7.9228162514264337593543950335
Currency 货币型 -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
Date 日期型 时间:00:00:00 至 23:59:59
日期: 100-1-1 至 9999-12-31
Boolean 逻辑值 True 或 False
Variant 变体型 不限
Object 对象型 VBA 和 Excel 对象

2.2.2 枚举类型

枚举就是将变量的值逐一列举出来,属于该枚举型的变量只能取列举的某一个值。当一个变量只有几种可能的值时,可以定义为枚举类型(Enum)。

枚举型举例:

Public Enum WorkDays
    星期日
    星期一
    星期二
    星期三
    星期四
    星期五
    星期六
End Enum

2.2.3 用户自定义数据类型

在VBA中,还可以使用Type语句定义自己的数据类型,其格式如下:

Type 数据类型名
    数据类型元素名 As 数据类型
    数据类型元素名 As 数据类型
    ...
End Type

注,自定义数据类型的定义必须放在模块(模块和类模块)的声明部分中。在使用记录类型之前,必须用Type语句进行定义。一般情况下,记录类型在模块中定义,其变量可以出现在工程的任何地方。

2.2 变量

  • 待完成

2.3 常量

  • 待完成

2.4 运算符

  • 待完成

2.5 程序结构

  • 待完成

2.6 过程

  • 待完成

2.7 函数

  • 待完成

3 Excel应用程序开发流程

3.1 需求分析

在进行Excel应用程序开发时,首先需要准确了解用户的需求,需求分析的目的是确定需要完成哪些工作。

需求分析阶段的主要任务如下:

  • 功能需求:给出应用程序必须完成的所有功能。
  • 环境需求:用户的计算机硬件环境、软件环境和Excel的版本等。
  • 界面需求:应用程序的用户界面是直接面对用户的,界面设计是用户能否方便、快捷地操作应用程序的关键之一。在需求分析阶段,应提出界面的需求。
  • 安全保密需求:对客户信息的保密要求应在本阶段进行计划。
  • 用户技术层次:在需求分析阶段,了解用户的技术层次,可为应用程序的开发提供一些辅助信息。

3.2 界面设计

在Excel中进行界面设计的方式主要有以下3种:

  1. 在工作表中添加控件
    在较简单的应用程序中(只需要调用少数几个宏过程),可向工作表中添加按钮或其他控件,接着与宏过程进行绑定即可:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 用户窗体
    用户界面是应用程序的一个重要组成部分。在Excel的应用程序中,用户窗体作为应用程序的用户界面部分,将用户的操作和Excel工作表中的数据隔离开。
    在VBA编辑器中插入一个用户窗体:
    在这里插入图片描述
    使用工具箱(视图→工具箱打开)中的控件设计窗体:
    在这里插入图片描述
  3. 自定义功能区
    功能区是从Excel 2007起新增加的组件,取代了以往版本的菜单和工具栏,可使用XML代码自定义功能区。
    在这里插入图片描述

3.3 代码设计

将用户界面设计好以后,接下来就需要编写界面中各部分的事件代码(如用户窗体中的按钮、功能区中的按钮等)。

在Excel中设计VBA应用程序时,界面设计和代码设计一般是交替进行的,即设计好一个界面后就编写相应的代码。有时也可先录制修改好宏代码,再和工作表或用户窗体中的按钮进行绑定。

3.4 帮助系统

在Windows应用程序中提供了在线电子文档的帮助系统,Excel也可以制作这种帮助系统。
对于小型应用系统,一般不提供帮助系统;但对于一个大型应用系统,提供一个好的帮助系统可让用户更快地理解系统,更快地熟悉系统的功能。

3.5 系统测试

在创建了应用程序之后,必须对其进行测试,测试和调试应用程序所花费的时间可能与开发系统的时间同样多。

对于一个完成开发的应用程序,在设计测试数据时,应尽可能多地考虑到各种不同的情况:不但要使用正常的合乎逻辑的数据去测试应用程序的功能性,还应使用一些可能导致应用程序出错的数据去测试应用程序的健壮性。

在设计测试数据的同时应编写出测试数据的结果,并与应用程序进行实测时得到的数据进行对比,如果结果相同,则通过测试;否则,应检查并修改应用程序。

3.6 应用程序发布

通过测试后的应用程序就可以发布给最终用户使用了。在发布时需要注意以下3个问题:

  1. Excel版本:如果是在Excel特定版本环境下开发的应用程序,并使用了该特定版本的一些新功能,就要求用户使用该Excel的特定版本。
  2. 动态链接库:如果应用程序中使用了ActiveX控件,则需要考虑是否要将包含该ActiveX控件的DLL文件(或OCX文件)包含在应用程序中予以发布。
  3. 辅助文件:在一个大型的应用程序中,有时可能还会使用到其他辅助文件(如图片文件、数据库文件和帮助文件等),需要将这些文件包括在发布文件中,并且最好将其发布到其他盘符中进行测试,以检查在VBA代码中是否使用了绝对路径来引用相关的文件。

4 常用功能

  • 待完成

相关推荐

  1. Excel VBA】在 Excel VBA 使用 For 循环全面指南

    2024-01-29 08:16:01       10 阅读
  2. Excel VBA ——从MySQL数据库导出一个报表-笔记

    2024-01-29 08:16:01       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-29 08:16:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-29 08:16:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-29 08:16:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-29 08:16:01       20 阅读

热门阅读

  1. RBE306TC Computer Vision Systems

    2024-01-29 08:16:01       29 阅读
  2. 知识搜索术学习笔记

    2024-01-29 08:16:01       28 阅读
  3. 自然语言处理(NLP)领域的应用和发展历程

    2024-01-29 08:16:01       30 阅读
  4. C++ 将类的方法作为线程来运行

    2024-01-29 08:16:01       33 阅读
  5. scanf读取返回值问题

    2024-01-29 08:16:01       33 阅读
  6. 【数据分析】numpy基础第四天

    2024-01-29 08:16:01       32 阅读
  7. [lighttpd]lighttpd配置http强制跳转https

    2024-01-29 08:16:01       39 阅读
  8. 写一段防止sql注入的sql查询

    2024-01-29 08:16:01       30 阅读
  9. Zookeeper面试题合集

    2024-01-29 08:16:01       32 阅读
  10. VLM 系列——Qwen-VL 千问—— 论文解读

    2024-01-29 08:16:01       33 阅读