第3章 对选区进行基本统计
前两章介绍了单元格选择技巧,本章将介绍一些对选区及选区数值进行基本统计方面的应用。
● 实例18提取选区地址并计数
● 实例19判断选区隐藏的单元格个数
● 实例20列出隐藏的单元格地址
● 实例21统计空白单元格个数
● 实例22统计公式个数
● 实例23计算已用行列数
● 实例24统计带批注之单元格个数
● 实例25统计选区格式为“常规”之单元格个数
● 实例26分别统计选区中文本与字母、数字个数
● 实例27统计选区中负数个数
实例18 提取选区地址并计数
【技巧说明】 提取选区地址并报告选区中单元格个数。
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub选区计数() MsgBox "您选择了" & Selection.Address & Chr(10) _ & "共有单元格" & Selection.Count & "个!" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 在工作表中随意选择一个区域,使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示选区地址和单元格数量,如图1.36所示。
图1.36 提示选区地址和单元格数量
提示
本实例参见光盘样本:..\第1部分\实例18.xlsm。
【相关知识说明】
(1)Selection.Address:Selection表示选择的区域;Address表示地址,它有5个可选参数,具体用法见表1.4。
表1.4 Address参数列表
本例中Address省略了所有参数,则返。$A$1样式之地址;若为相对引用,则地址可改为Address(false,false);若需要返回R1C1样式,则Address改为Address (ReferenceStyle:=xlR1C1)。修改后的两例返回结果如图1.37所示。
图1.37 相对引用样式和R1C1引用样式
(2)Chr(10):Chr()返回String,其中包含有与指定的字符代码相关的字符,0~31之间的数字与标准的非打印ASCII代码相同。正常范围为0~255。然而,在DBCS系统中,charcode的实际范围为-32768~65535。本例中参数为10表示换行符,当MsgBox信息较长时,强制其换行显示。
实例19 判断选区隐藏的单元格个数
【技巧说明】 判断选区隐藏的单元格个数。
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub判断单元格的隐藏个数() Dim cell As Range, i As Integer For Each cell In Selection If cell.EntireRow.Hidden Or cell.EntireColumn.Hidden Then i=i+1 End If Next MsgBox i & "个单元格处于隐藏状态" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 在工作表中选择需要统计的区域如A1:C6,使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示选区中隐藏的单元格数量,如图1.38所示。
提示
本实例参见光盘样本:..\第1部分\实例19.xlsm。
【相关知识说明】
Range.Hidden:返回或设置一个Variant值,它指明是否隐藏行或列。
实例20 列出隐藏的单元格地址
【技巧说明】 列出选区中隐藏的单元格地址。
【案例实现】 操作步骤如下:
图1.38 报告隐藏的单元格数量
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub判断单元格的隐藏状态() Dim cell As Range, temp As String On Error GoTo err For Each cell In Selection If cell.EntireRow.Hidden Or cell.EntireColumn.Hidden Then temp=temp & cell.Address & "、" End If Next temp=Left(temp, Len(temp)-1) MsgBox "以下单元格处于隐藏状态:" & Chr(10) & temp: Exit Sub err: MsgBox "没有处于隐藏状态的单元格" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 在工作表中选择需要统计的区域如A1:C6,使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示选区中隐藏的单元格地址,如图1.39所示。
[6] 选中无隐藏区域D4∶D5,再运行程序,则程序将弹出“没有处于隐藏状态的单元格”提示框,如图1.40所示。
图1.39 显示处于隐藏状态的单元格
图1.40 提示“没有处于隐藏状态的单元格”
提示
本实例参见光盘样本:..\第1部分\实例20.xlsm。
【相关知识说明】
(1)GoTo:无条件地转移到过程中指定的行,用于程序代码的转移。
(2)On Error GoTo err:Error是程序错误,整句即表示当程序有错误时则运行标签“err”之后的代码。
实例21 统计空白单元格个数
【技巧说明】 统计工作表已用区域中空白单元格个数。
【案例介绍】 如图1.41所示的学生成绩表,空白区表示缺考,现需统计缺考总次数。循环检测单元格是否具有空白属性,或者检测其单元格字符长度是否为0,都可以统计出区域中空白单元格个数。
图1.41 学生成绩表
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub判断单元格的空白() MsgBox ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Count & "个空白单元格" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示当前工作表已用区域中空白单元格个数,如图1.42所示。
图1.42 已用区域中空白单元格统计
提示
本实例参见光盘样本:..\第1部分\实例21.xlsm。
【相关知识说明】
xlCellTypeBlanks:空白单元格,也可以用数字4替代。xlCellType参数列表见表1.5。
表1.5 xlCellType参数列表
实例22 统计公式个数
【技巧说明】 统计已用区域中公式个数。
【案例介绍】 如图1.43所示的员工业绩表,合计栏中有部分单元格数据是手工输入的,有部分是用公式计算出来的,现需要统计其中公式数目。
图1.43 员工业绩表
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub统计有公式的单元格() ActiveSheet.UsedRange.SpecialCells(-4123).Select MsgBox "选区中有" & Selection.Count & "个公式!" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示当前工作表已用区域中公式个数,如图1.44所示。
图1.44 提示已用区域中公式个数
提示
1.本实例参见光盘样本:..\第1部分\实例22.xlsm。
2.本实例中也可以直接用一句代码完成:MsgBox "选区中有" & ActiveSheet. UsedRange.SpecialCells(-4123).Count & "个公式!",此处为便于观察包含公式区域,故先选中再计算,实际运用时就应用最简洁的代码实现,从而提高运算速度。
实例23 计算已用行列数
【技巧说明】 统计工作表已用区域中的行数和列数。
【案例介绍】 每个工作表开启与运行程序的速度一般与工作表中的公式多少和已用区域的大小相关。有时打开工作表看到数据不多,可文件却非常大,运行速度也慢。这可能是因为曾经在较大的区域输入过数据,后来将其他区域数据利用键盘上的“Delete”键删除了,但并未清除其单元格格式,从而使工作表的已用区域包含无数据但具有一定格式的单元格。检查工作表中是否具有未清除格式的空白单元格就需要计算已用区域的行列数。
如图1.45所示,在单元格B3∶E7中输入公式“=ROW()*COLUMN()”,并设置字体色为红色,然后删除B7∶E7的数据。
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub计算已用行列数() Dim rng As Range, r As Long, m As Long Set rng=ActiveSheet.UsedRange '将已用区域赋予变量rng r=rng.Rows.Count '计算已用区域行数 m=rng.Columns.Count '计算已用区域列数 MsgBox "你已使用" & r & "行" & m & "列", 64, "提示" '弹出消息框 End Sub
图1.45 删除部分数据的工作表
[4] 关闭VBE窗口返回到工作表。
[5] 使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示当前工作表已用区域中的行列数,其行数包括已删除数据之行,如图1.46所示。
提示
1.本实例参见光盘样本:..\第1部分\实例23.xlsm。
2.为了减小工作表所占空间,同时提高开启速度,请在删除工作表数据时单击功能区中的“全部清除”菜单,如图1.47所示。
图1.46 提示已用区域中的行列数
图1.47 “全部清除”菜单
实例24 统计带批注之单元格个数
【技巧说明】 统计已用区域中带批注之单元格个数。
【案例介绍】 如图1.48所示,考勤表中记录了出勤与旷工状况,对于已出勤但却迟到者用批注标示。现需统计本月所有人迟到次数。
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub统计批注个数() Dim i As Integer, cell As Range On Error GoTo err For Each cell In Selection If Not Intersect(cell, Cells.SpecialCells(xlCellTypeComments)) Is i=i+1 End If Next MsgBox "选区中共有批注" & i & "个!", 64, "提示" End err: MsgBox "工作表中没有批注!", 64 End Sub
Nothing Then
[4] 关闭VBE窗口返回到工作表。
[5] 选中B4∶E10区域,使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示选区中的批注个数,如图1.49所示。
图1.48 考勤表
图1.49 选区中批注计数
提示
本实例参见光盘样本:..\第1部分\实例24.xlsm。
【相关知识说明】
Cells.SpecialCells(xlCellTypeComments):有批注的单元格。如果工作表中没有批注,则程序要出错,故本例中使用了“On Error GoTo err”语句,当程序出错时,执行“err”标签处的语句。出错语句到“err:”之间的代码全部忽略不运行。
实例25 统计选区格式为“常规”之单元格个数
【技巧说明】 统计选区格式为“常规”之单元格个数。
【案例介绍】 大家知道,单元格显示值往往因单元格定义格式的差异而显示为不同的数据。例如,单元格数值为1,定义格式为“0.00%”,将显示“100.00%”;定义格式为“[DBNum2][$-804]G/通用格式”,将显示“壹”。而格式为“常规”即表示该单元格格式未经过修改。本例将统计选区中常规格式之单元格个数。
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub常规格式之单元格个数统计() Dim i As Integer, cell As Range For Each cell In Selection If cell.NumberFormatLocal="G/通用格式" Then i=i+1 End If Next MsgBox "选区中常规格式单元格有" & i & "个!", 64, "提示" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 选中待统计区域,使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示选区中的常规格式单元格数目,如图1.50所示。
图1.50 选区中常规格式单元格计数
提示
本实例参见光盘样本:..\第1部分\实例25.xlsm。
【相关知识说明】
G/通用格式:即为常规格式。可以通过以下方法得到常规格式的名称:
右键单击单元格后进入“设置单元格格式”对话框,单击“分类”下的“常规”,再单击“自定义”,则右边的“类型”框中将显示出“常规”格式的名称。
实例26 分别统计选区中文本与字母、数字个数
【技巧说明】 分别统计选区中文本与字母、数字个数。类似于Word中的字符统计。
【案例介绍】 单元格中存放的数据包括“汉字”、“字母”、“数字”、“特殊符号”(包括标点、空格及片假名、注音字符等)。有时需要对其区分统计,但Excel本身不具备该功能,只有通过VBA实现。
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境;
[2] 单击菜单【插入】\【模块】,打开模块代码窗口;
[3] 在右边代码窗口输入以下代码;
Sub选区字符统计() Dim str As String, ChineseChar As Long, Alphabetic As Long, Number As Long Dim i As Long, rng As Range, j As Long If TypeName(Selection) <> "Range" Then MsgBox "请选择单元格!", 64, "友情提示": Exit Sub For Each cell In Selection j=j+Len(cell.Value) '计算字符总长度 For i=1 To Len(cell) str=Mid(cell.Value, i, 1) If str Like "[一-龥]"=True Then '汉字 hanzi=hanzi+1 '汉字累加 ElseIf str Like "[a-zA-Z]"=True Then '字母 ZiMu=ZiMu+1 '字母累加 ElseIf str Like "[0-9]"=True Then '数字 ShuZi=ShuZi+1 '数字累加 End If Next Next MsgBox "所选单元格区域中共有字数" & j & "个。" & Chr(10) & "汉字:" & hanzi & "个" & _ Chr(10) & "字母:" & ZiMu & "个" & Chr(10) & "数字:" & ShuZi & "个" & Chr(10) _ & "特殊字符及空格:" & j-ZiMu-ShuZi-hanzi & "个。", vbInformation, "字符统计" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 选中待统计区域,使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示选区中的各种字符数目,如图1.51所示。
图1.51 提示选区中各种字符数目
提示
本实例参见光盘样本:..\第1部分\实例26.xlsm。
【相关知识说明】
(1)Like:用来比较两个字符串,本例中使用了三个字符串比较。"[一-龥]"表示从编码“一”到“龥”,即汉字之首尾编码,在此范围之内则是汉字;"[a-zA-Z]"表示小写和大写字母的编码范围;"[0-9]"表示数字编码范围。
(2)TypeName:返回对象的类型。如单元格的类型名称为“Range”、图片的类型名称为“Picture”,类型名称是区分大小写的。本例因为要统计单元格字符,故选项类型不是“Range”时则退出程序。
实例27 统计选区中负数个数
【技巧说明】 统计选区中小于零的数据个数。
【案例介绍】 成绩不可能为负数,但为防止一时疏忽输入了负号造成的失误,需要对选区进行负数个数统计。本案例选取成绩表中部分数据,演示提取负数之过程。
【案例实现】 操作步骤如下:
[1] 使用快捷键Alt+F11进入VBE(Visual Basic Editor)环境。
[2] 单击菜单【插入】\【模块】,打开模块代码窗口。
[3] 在右边代码窗口输入以下代码:
Sub统计负数() Dim rng As Range, i As Integer For Each rng In Selection If rng < 0 Then i=i+1 End If Next MsgBox "选区中有" & i & "个负数!", 64, "提示" End Sub
[4] 关闭VBE窗口返回到工作表。
[5] 选中待统计区域,使用快捷键Alt+F8调出运行宏窗口,然后单击“执行”按钮,程序将弹出一个消息框提示选区中的负数个数,如图1.52所示。
图1.52 选区中负数计数
提示
本实例参见光盘样本:..\第1部分\实例27.xlsm。
【相关知识说明】
Integer:一种变量的数据类型,Integer变量存储为16位(2个字节)的数值形式,其范围为–32768到32767。Integer的类型声明字符是百分比符号(%)。
也就是说,声明Integer类型的变量可以改为“i%”,其数据范围是一样的;本例中变量“i”声明为Integer类型,则限制了可以计算负数的范围为-32768~32767。假设选区中负数超过32767个,则本程序将出错。可以改为“dim i as long”,long型数据取值范围为-2147483648~2147483647。用户可以根据实际状况做修改。
提示
变量类型与取值范围见附录B。