大家好,又见面了,我是你们的朋友全栈君。
VBA编程是Office系列软件自带的编程功能,也就是说不只是Excel,Word和PPT也能进行VBA编程。而“宏”可以理解为一组自动化程序,执行一个宏就能执行其对应的一系列操作。创建宏主要有两种方法,一种是录制宏,也就是将人的一些操作录下来,需要的时候执行宏就可以自动重复这些操作;另一种就是本文要介绍的,通过VBA编程来自己写一个宏。
Excel默认是没有打开宏功能和VBA编程功能的,因此需要打开一下。
依次点击【文件】 → \rightarrow → 【选项】 → \rightarrow →【信任中心】 → \rightarrow →【信任中心设置】 → \rightarrow →【宏设置】 → \rightarrow →【启用所有宏】
依次点击【文件】 → \rightarrow → 【选项】 → \rightarrow →【自定义功能区】找到“开发工具”,并把它添加到右边
该任务分两个sheet,其中Sheet1为学生的分数,Sheet2为对Sheet1的信息进行分类统计,具体如下:
第一个表起名为“分数”,第二个表起名为“统计”
左侧看到如上图所示目录,双击【Sheet1】、【Sheet2】、【ThisWorkbook】都可以打开编程窗口,但程序作用范围不一样,由于我们需要操作两个Sheet,因此双击【ThisWorkbook】打开。这里大家可能能猜到了,Workbook指的就是这个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(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
日期。'
后面的为注释内容,即程序之外的文本,不参与程序的运行,一般用来写一些解释说明,方便程序的理解。如程序中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"
一直到退出循环。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"
。就可以运行这个程序了,保存程序的时候可能会提示为无法保存,这时候将Excel文件另存为带宏的格式即可,例如xlsm格式。
上面我们提到,通过【Visual Basic】进入编程界面编写的宏是属于单个文件或Sheet的,如果我们想编写一个可以在所有文件中运行的宏要怎么做呢?下面是具体做法。
C:\Users\【用户名】\AppData\Roaming\Microsoft\Excel\XLSTART
,里面有一个文件叫PERSONAL.XLSB
。共用的宏就保存在这里,通过将这个文件发给别人覆盖对应的文件就可以把共用的宏给别人用了。如果是文件自带的宏,只需要把Excel文件发给对方就可以,文件已经自包含了。
PERSONAL.XLSB
这个文件打开后再来一次。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
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132583.html原文链接:https://javaforall.cn