文科生也能学会的Excel VBA 宏编程入门

文科生也能学会的Excel VBA 宏编程入门文章目录VBA宏编程简介准备工作打开宏功能打开“开发工具”选项卡VBA编程示例任务介绍文件宏全局宏VBA宏编程简介VBA编程是Office系列软件自带的编程功能,也就是说不只是Excel,Word和PPT也能进行VBA编程。而“宏”可以理解为一组自动化程序,执行一个宏就能执行其对应的一系列操作。创建宏主要有两种方法,一种是录制宏,也就是将人的一些操作录下来,需要的时候执行宏就可以自动重复这些操…

大家好,又见面了,我是你们的朋友全栈君。

VBA宏编程简介

VBA编程是Office系列软件自带的编程功能,也就是说不只是Excel,Word和PPT也能进行VBA编程。而“”可以理解为一组自动化程序,执行一个宏就能执行其对应的一系列操作。创建宏主要有两种方法,一种是录制宏,也就是将人的一些操作录下来,需要的时候执行宏就可以自动重复这些操作;另一种就是本文要介绍的,通过VBA编程来自己写一个宏。

准备工作

Excel默认是没有打开宏功能和VBA编程功能的,因此需要打开一下。

打开宏功能

依次点击【文件】 → \rightarrow 【选项】 → \rightarrow 【信任中心】 → \rightarrow 【信任中心设置】 → \rightarrow 【宏设置】 → \rightarrow 【启用所有宏】
在这里插入图片描述

打开“开发工具”选项卡

依次点击【文件】 → \rightarrow 【选项】 → \rightarrow 【自定义功能区】找到“开发工具”,并把它添加到右边
在这里插入图片描述

VBA编程

示例任务介绍

该任务分两个sheet,其中Sheet1为学生的分数,Sheet2为对Sheet1的信息进行分类统计,具体如下:
在这里插入图片描述
在这里插入图片描述
第一个表起名为“分数”,第二个表起名为“统计”

文件宏

  1. 依次点击【开发工具】 → \rightarrow 【Visual Basic】
    在这里插入图片描述
    左侧看到如上图所示目录,双击【Sheet1】、【Sheet2】、【ThisWorkbook】都可以打开编程窗口,但程序作用范围不一样,由于我们需要操作两个Sheet,因此双击【ThisWorkbook】打开。这里大家可能能猜到了,Workbook指的就是这个Excel文件。
  2. 编写如下程序
Sub 分类统计()
    
    Dim maleCtr As Integer '男生人数
    Dim femaleCtr As Integer '女生人数
    Dim daCtr As Integer '名字以达结尾人数
    Dim maleSum As Double '男生总分
    Dim femaleSum As Double '女生总分
    
    Dim i As Integer
    
    i = 2
    
    Do While Not IsEmpty(Sheet1.Range("A" & i))
        Dim name, sex As String
        Dim score As Double
        
        name = Sheet1.Range("A" & i)
        sex = Sheet1.Range("B" & i)
        score = Sheet1.Range("C" & i)
        
        If sex = "男" Then
            maleCtr = maleCtr + 1
            maleSum = maleSum + score
        Else
            femaleCtr = femaleCtr + 1
            femaleSum = femaleSum + score
            
        End If
        
        If name Like "*达" Then  'like是相似的意思,*为通配符
            daCtr = daCtr + 1
        End If
        
        i = i + 1 '下一行
    Loop
    
    Sheet2.Range("A2").NumberFormatLocal = "0"    '设置数字格式为没有小数
    Sheet2.Range("B2").NumberFormatLocal = "0.##"    '设置数字格式为小数点后两位,非零才显示
    Sheet2.Range("C2:E2").NumberFormatLocal = "0.00"   '设置数字格式为小数点后两位且补零
            
    
    Sheet2.Range("A2") = maleCtr
    Sheet2.Range("B2") = femaleCtr
    Sheet2.Range("C2") = daCtr
    Sheet2.Range("D2") = maleSum / maleCtr
    Sheet2.Range("E2") = femaleSum / femaleCtr
    
End Sub
  • 下面对程序进行一些说明,首先Sub 宏名称()...End Sub里“宏名称”改成任意你想要的宏名称即可,但不可以有空格。
  • Dim 变量名 As 数据类型是Visual Basic语言定义变量的方式,其中常用的数据类型有Integer整数、Double小数、String字符串、Date日期。
  • Visual Basic语言中单引号'后面的为注释内容,即程序之外的文本,不参与程序的运行,一般用来写一些解释说明,方便程序的理解。如程序中Dim maleCtr As Integer '男生人数maleCtr这个整数类型的变量用于累加Sheet1中男生的人数。
  • Do While 逻辑条件 ... Loop是Visual Basic中的循环语句之一,当逻辑条件为真时进入循环,当逻辑条件为假时退出循环。本程序中这个循环是为了一行行遍历Sheet1这张表,直到最后一个学生。因此我们需要判断变量i什么时候到最后一行。这里采用的逻辑条件Not IsEmpty(Sheet1.Range("A" & i)),其中IsEmpty()是用于判断是否为空,为空时返回true,否则返回false,但我们希望当不为空时继续循环,因此前面加个Not用于取反
  • Sheet1.Range("A1" )可以用于取出Sheet1中A1格里面的内容,此外还可以用Sheets(1).Range("A1" )Sheets("分数").Range("A1" )
  • "A" & i是将字符串"A"和整数i拼接起来,随着i=i+1的累加,这个程序中会依次遍历"A2""A3"一直到退出循环。
  • Visual Basic常用的逻辑判断语句如下,当逻辑条件1满足时执行程序1,都不满足时执行程序3,其中Elseif 逻辑条件 Then的数量不限。
If 逻辑条件1 Then 
... 程序1
Elseif 逻辑条件2 Then 
... 程序2
Else 
... 程序3
End If
  • name Like "*达"的意思是name这个字符串的内容是否以“达”结尾,其中“*”为通配符,可以表示任意长度的任意内容,如果写成"*达*"意思就是名字中间是否有”达”。
  • Sheet2.Range("A2").NumberFormatLocal = "0"是设置数字单元格的显示格式,例如可以有"0.0""0.##""0.00%"等各种你想要的格式。这里的0和#都是一个代号,0代表即便这一位上没有数字也要显示一个0;#代表这一位如果有数字就显示,没有就不显示;%结尾会自动转成百分比显示,具体可以看Excel的帮助或是这个链接:Excel自定义格式。上述代码中为了展示不同的格式才这么写,实际上整数就用"0",两位小数就用"0.00"即可。
  • Sheet2.Range("A2") = maleCtr大家肯定都能猜到了,这是往Sheet2中对应的单元格里填数。这里Range()其实可以选多个单元格,就如上面设置格式的时候就用过多选:Sheet2.Range("C2:E2").NumberFormatLocal = "0.00"
  1. 点击绿色的小三角在这里插入图片描述就可以运行这个程序了,保存程序的时候可能会提示为无法保存,这时候将Excel文件另存为带宏的格式即可,例如xlsm格式。

  2. 这时,点击【开发工具】 → \rightarrow 【宏】也能找到我们编写的宏,点执行就能运行,但我们可以看到,这里宏的位置为“ThisWorkbook”,也就是我们打开的这个Excel文件,在别的文件里是无法运行这个宏的。
    在这里插入图片描述

  3. 运行结果如下:
    在这里插入图片描述

  4. 如果想调试程序,点击【调试】 → \rightarrow 【逐语句】即可一行一行运行程序,将鼠标放到对应变量上可以看到它们的值,这样程序运行结果不对时就可以用于寻找BUG。

全局宏

上面我们提到,通过【Visual Basic】进入编程界面编写的宏是属于单个文件或Sheet的,如果我们想编写一个可以在所有文件中运行的宏要怎么做呢?下面是具体做法。

  1. 点击【开发工具】 → \rightarrow 【录制宏】
  2. 宏名称随意,保存在必须选择【个人宏工作簿】,这个工作簿就是这台电脑共享的宏保存位置,具体位置为C:\Users\【用户名】\AppData\Roaming\Microsoft\Excel\XLSTART,里面有一个文件叫PERSONAL.XLSB。共用的宏就保存在这里,通过将这个文件发给别人覆盖对应的文件就可以把共用的宏给别人用了。如果是文件自带的宏,只需要把Excel文件发给对方就可以,文件已经自包含了。
    在这里插入图片描述
  3. 点【确定】,这时可能会提示文件必须打开,那我们就把PERSONAL.XLSB这个文件打开后再来一次。
  4. 这次点【确定】可以录制了,事实上什么都无需录,直接点【停止录制】即可,我们只想要个壳而已。
  5. 点击【宏】,找到我们刚才录制的这个宏,点击【编辑】。
    在这里插入图片描述
  6. 我们会看到这个宏保存在【PERSONAL.XLSB】这个分支的【模块】分支下面,如果是第一次录制就是【模块1】,对于我来说是【模块2】。我们将前面的程序复制一下,然后替换掉这个空的宏里的所有代码。
    在这里插入图片描述
  7. 仅仅是将代码复制过来是不够的,因为这个宏是共用的,代码中Sheet1等变量的指代不明,不知道是哪个Excel文件中的Sheet1,因此我们做些小的修改。直接查找替换,将Sheet1都替换成ActiveWorkbook.Sheets(1);将Sheet2都替换成ActiveWorkbook.Sheets(2)即可。这里顾名思义,ActiveWorkbook就是指当前激活的那个Excel文件,因此想在哪个文件运行宏,就从那个文件执行宏即可。记得点保存,最终完整代码如下:
Sub 分类统计()

    
    Dim maleCtr As Integer '男生人数
    Dim femaleCtr As Integer '女生人数
    Dim daCtr As Integer '名字以达结尾人数
    Dim maleSum As Double '男生总分
    Dim femaleSum As Double '女生总分
    
    Dim i As Integer
    
    i = 2
    
    Do While Not IsEmpty(ActiveWorkbook.Sheets(1).Range("A" & i))
        Dim name, sex As String
        Dim score As Double
        
        name = ActiveWorkbook.Sheets(1).Range("A" & i)
        sex = ActiveWorkbook.Sheets(1).Range("B" & i)
        score = ActiveWorkbook.Sheets(1).Range("C" & i)
        
        If sex = "男" Then
            maleCtr = maleCtr + 1
            maleSum = maleSum + score
        
        Else
            femaleCtr = femaleCtr + 1
            femaleSum = femaleSum + score
            
        End If
        
        If name Like "*达" Then  'like是相似的意思,*为通配符
            daCtr = daCtr + 1
        End If
        
        i = i + 1 '下一行
    Loop
    
    ActiveWorkbook.Sheets(2).Range("A2").NumberFormatLocal = "0"    '设置数字格式为没有小数
    ActiveWorkbook.Sheets(2).Range("B2").NumberFormatLocal = "0.##"    '设置数字格式为小数点后两位,非零才显示
    ActiveWorkbook.Sheets(2).Range("C2:E2").NumberFormatLocal = "0.00"   '设置数字格式为小数点后两位且补零
            
    
    ActiveWorkbook.Sheets(2).Range("A2") = maleCtr
    ActiveWorkbook.Sheets(2).Range("B2") = femaleCtr
    ActiveWorkbook.Sheets(2).Range("C2") = daCtr
    ActiveWorkbook.Sheets(2).Range("D2") = maleSum / maleCtr
    ActiveWorkbook.Sheets(2).Range("E2") = femaleSum / femaleCtr
    
End Sub
  1. 在想要执行宏的Excel文件中点击【宏】,这时就可以看到我们刚才写的宏了,点击【执行】就可以运行。
    在这里插入图片描述
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132583.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • bowtie 加mn标签_Bowtie 比对「建议收藏」

    bowtie 加mn标签_Bowtie 比对「建议收藏」【Bowtie】DNA序列拼接的原理【Jenny点评】我一直以为Bowtie是一个短序列拼接工作,实际上这是错误的。它不是序列拼接工作,只是一个序列比对的工具。最后的结果是相对index而言,对各个短序列进行定位。——————短序列比对的原理如何?目前有哪些常用的短序列比对软件?okhttp://blog.sina.com.cn/s/blog_9617895f01011n…

    2022年10月27日
  • 贪心算法及几个经典例子c语言_贪心算法一定是最优解吗

    贪心算法及几个经典例子c语言_贪心算法一定是最优解吗贪心算法一、基本概念:      所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。     贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前

    2022年10月21日
  • 设计模式之原型(prototype)模式

    相信大多数的人都看过《西游记》,对孙悟空拔毛变出小猴子的故事情节应该都很熟悉。孙悟空可以用猴毛根据自己的形象复制出很多跟自己一模一样的小猴兵出来,其实在设计模式中也有一个类似的模式,我们可以通过一个原

    2021年12月28日
  • SecureCRT中文乱码解决方法

    SecureCRT中文乱码解决方法SecureCRT中文乱码解决方法1、先选中当前的Session地址2、然后点击SercureCRT上排主菜单的“Options”,也就是“选项”的意思3、点击Options之后,会出现一个下拉列表,我们选择第一个“SessionOptions…”4、接着会出现一个弹出框,选择目录中的“Appearance”,该功能可以对SercureCRT的外观进行设置5、此时可以看到SercureCRT的编码格式是“Default”,也就是默认的编码格式,我们改为“UTF-8”6、改完编码格式之后,我们回

  • no rule to process file “xxxxxxxxx” of type XXXXXX.h for architecture i386解决办法

    no rule to process file “xxxxxxxxx” of type XXXXXX.h for architecture i386解决办法1.每次遇到黄色警告就头疼,一方面log一大堆,不想看.二来解决麻烦.2直接说解决办法TARGET→BuildPhases→ Compile Source→删除报错的xxxxx.h文件→clean工程→编译(OK,解决),你要没解决我也没办法

  • 达人评测小米平板5怎么样[通俗易懂]

    达人评测小米平板5怎么样[通俗易懂]小米平板5系列将推出三款新机,均会搭载高通处理器,分别为骁龙870、骁龙860和骁龙768G,分别对应高、中、低三个档位,无论是学习还是娱乐、工作,小米平板5都能提供匹配的体验。骁龙870大家此前已经非常熟悉,目前市面上已经有多款搭载该芯片的产品亮相,而骁龙860目前还未在国内上市。据悉,骁龙860处理器是此前骁龙855Plus的增强版,采用7nm工艺打造,CPU主频为2.96GHz,为1+3+4的三丛集架构设计,超大核为Kryo485,并且在5G、内存等和方面带来了全新提升,性能更..

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号