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

news2024/11/18 17:34:40

目录

  • 0 准备工作
  • 1 VBA简介
    • 1.1 Excel VBA应用程序的构成
    • 1.2 事件驱动
    • 1.3 宏
      • 1.3.1 创建宏
      • 1.3.2 宏安全
  • 2 VBA基础
    • 2.1 注释
    • 2.2 数据类型
      • 2.2.1 基本数据类型
      • 2.2.2 枚举类型
      • 2.2.3 用户自定义数据类型
    • 2.2 变量
    • 2.3 常量
    • 2.4 运算符
    • 2.5 程序结构
    • 2.6 过程
    • 2.7 函数
  • 3 Excel应用程序开发流程
    • 3.1 需求分析
    • 3.2 界面设计
    • 3.3 代码设计
    • 3.4 帮助系统
    • 3.5 系统测试
    • 3.6 应用程序发布
  • 4 常用功能

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 常用功能

  • 待完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1417649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

配置华为交换机环路检测案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE…

给你一颗“定心丸”——记一次由线上事故引发的Log4j2日志异步打印优化分析

一、内容提要 自知是人外有人,天外有天,相信对于Log4j2的异步日志打印早有老师或者同学已是熟稔于心,优化配置更是信手拈来,为了防止我在这里啰里八嗦的班门弄斧,我先将谜底在此公布:_log4j2.asyncQueueFu…

【ArcGIS微课1000例】0098:查询河流流经过的格网

本实验讲述,ArcGIS中查询河流流经过的格网,如黄河流经过的格网、县城、乡镇、省份等。 文章目录 一、加载数据二、空间查询三、结果导出四、注意事项一、加载数据 加载实验配套数据0098.rar中的河流(黄河)和格网数据,如下图所示: 接下来,将查询河流流经过的格网有哪些并…

Python进阶(1) | 使用VScode写单元测试

Python进阶(1) | 单元测试 2024.01.28 VSCode: 1.85.1 Linux(ubuntu 22.04) 文章目录 Python进阶(1) | 单元测试1. 目的2. Python Profile3. 单元测试框架3.1 什么是单元测试3.2 选一个单元测试框架3.3 编写 Python 单元测试代码3.4 在 VSCode 里发现单元测试3.5 再写一个单元…

Linux的优先级说明

一、背景 在工作中,不少同学对nice,priority,schedue策略,实时优先级,普通进程优先级的概念混淆,导致最后的代码可能引入bug,本文将统一进行说明,部分内容参考网络大佬的文章 &…

美化背景(拼图小游戏)

package Puzzlegame.com.wxj.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.util.Random;public class GameJframe extends JFrame { //游戏主界面 //创建一个二维数组//目的:管理数据//加载图片的时候,会根据二维数组中…

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机) 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM?②STM32F103C8T6如何生成PWM?③控制舵机需要什么样的PWM波? 三…

看图说话:Git图谱解读

很多新加入公司的同学在使用Git各类客户端管理代码的过程中对于Git图谱解读不太理解,我们常用的Git客户端是SourceTree,配合P4Merge进行冲突解决基本可以满足日常工作大部分需要。不同的Git客户端工具对图谱展示会有些许差异,以下是SourceTre…

jenkins对接K8S

创建连接K8S的凭据 查看需要使用到的命名空间 [rootk8s ~]# kubectl get ns |grep arts-system arts-system Active 16d创建service accounts [rootk8s ~]# kubectl create sa jenkins-k8s -n arts-system serviceaccount/jenkins-k8s created [rootk8s ~]# kubectl…

使用vscode查bug

具体操作 修改CMakeList.txt # set(CMAKE_BUILD_TYPE "Release")//注释Release模式 set(CMAKE_BUILD_TYPE "Debug")//设置为Debug模式 # set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")//注释*这行代码是用来设置 CMake 构建系统中 Release 模式…

Go Zero微服务个人探究之路(十)实战走通微服务前台请求调用的一套流程model->rpc微服务->apiHTTP调用

前言 Go语言凭借低占用,高并发等优秀特性成为后台编程语言的新星,GoZero框架由七牛云技术副总裁团队编写,目前已经成为Go微服务框架里star数量最多的框架 本文记录讲述笔者一步步走通前台向后台发出请求,后台api调用rpc服务的相…

verilog编程之乘法器的实现

知识储备 首先来回顾一下乘法是如何在计算机中实现的。 假设现在有两个32位带符号定点整数x和y,我们现在要让x和y相乘,然后把乘积存放在z中,大家知道,两个32位数相乘,结果不会超过64位,因此z的长度应该为64…

总结6(循环(for))

循环 定义: 某些代码会被重复执行 分类: for 1.格式 for(1; 2; 3) 语句A; 2.执行的流程(1,2,A,3 2,A,3 2,A,3..........) 单个for循环的使用 多个for循环的嵌套使用 1). for(1; 2; 3) for&#xff0…

用通俗易懂的方式讲解:一种全新的大模型检索增强生成方法

如何使大型语言模型更加事实、正确和可靠? 检索增强生成(RAG)是一种有效的方法,可以缓解大型语言模型的基本局限性,如幻觉和缺乏最新知识。 然而,如果您曾尝试过RAG,您会同意我所说的RAG易于原…

【每日一题】4.LeetCode——环形链表

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

RK3568平台开发系列讲解(Linux系统篇)互斥锁使用

🚀返回专栏总目录 文章目录 一、互斥锁API二、使用互斥锁的步骤三、互斥锁使用规则四、使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、互斥锁API 在Linux中,你可以使用互斥锁(Mutex)来实现多线程或多进程之间的互斥访问。互斥锁用于确保在同一时间只有一…

24. 两两交换链表中的节点(力扣LeetCode)

文章目录 24. 两两交换链表中的节点题目描述解题思路只使用一个临时节点使用两个临时节点 24. 两两交换链表中的节点 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff0…

STM32学习笔记(二) —— 调试串口

我们在调试程序时,经常会使用串口打印相关的调试信息,但是单片机串口不能直接与 PC 端的 USB 接口通讯,需要用到一个USB转串口的芯片来充当翻译的角色。我们使用的开发板上有这个芯片,所以在打印调试信息的时候直接使用USB线连接开…

每日一题——LeetCode1365.有多少小于当前数字的数字

方法一 暴力循环 对于数组里的没一个元素都遍历一遍看有多少元素小于当前元素 var smallerNumbersThanCurrent function(nums) {let n nums.length;let ret [];for (let i 0; i < n; i) {let count 0;for (let j 0; j < n; j) {if (nums[j] < nums[i]) {count…

【C语言】数组的应用:三子棋游戏

由于代码较长&#xff0c;为了增加可读性&#xff0c;我们把代码分别写到game.h&#xff0c;game.c&#xff0c;test.c&#xff0c;里面&#xff0c;其中game.h用来声明函数&#xff0c;实现函数功能的代码在game.c&#xff0c;测试游戏的代码在test.c 为了方便后续的更改&…