自己熟悉excel工作表中的函数公式,本节主要处理如何在vba中使用函数,分两种:工作表函数和vba函数:
(1)在vba中使用工作表函数,必须使用前缀Application.WorksheetFunction.
(2)大部分工作表函数在vba中与在工作表中的用法相同;
(2)一些工作表函数在vba中不实用。例如:Concatenate 函数就不实用,因为在vba 中可以使用 & 运算符来连接多个文本值。
(2)一些工作表函数在vba中用法略有差异,如vlookup;
(3)vba函数可不要前缀直接调用,但若需寻找,在 Application.WorksheetFunction找不到,需要使用vba.前缀找(了解vba函数的分类后可逐级找,分类见附录)
一、在vba中使用工作表函数
问题导入:“使用工作表函数”文件,做成查询系统,完成以下功能:
(1)输入准考证号,获得相关信息;
(2)填充统计信息。
处理:(1)先考虑问题(2),在工作表界面可直接用“counta()”函数查找某表某列的非空数据个数,填充到“共导入__名考生”中;
(2)在vba界面,用已有知识解决此问题,可写for循环,逐一判断每个单元格是否为空"<>" " "后,统计非空个数;
(3)步骤(2)太麻烦,探索VBA中函数解决:Sheet1.Range("D26") = Application.WorksheetFunction.CountA(Sheet2.Range("a:a")) - 1
(4)对工作表进行for循环,k=k+application·····解决完整
(5)类似解决男生统计人数:Sheet1.Range("D27") = Application.WorksheetFunction.CountIf(Sheet2.Range("f:f"), "男")
(6)考虑问题(1),用vlookup函数求学号对应姓名信息,转为vba中函数解决,其余信息类似处理:
Sheet1.Range("D14") = Application.WorksheetFunction.VLookup(Sheet1.Range("D9"), Sheet2.Range("a:f"), 5, "false")
(7)将步骤(6)进行for循环出现严重问题,不在当前表找不到时,程序报错对话框(工作表界面是返回N/A)停止运行
(8)在进入for循环前加语句“On Error Resume Next”,解决报错对话框问题
(9)“地区”格较麻烦,应填入sheets(i).name,但由于有"on error resume next",总是填入最后一张表的name,因此应考虑“找到数据”时的for循环停止机制
(10)找到数据时Sheet1.Range("D14")会被填充,可以此判断是否找到了数据,即 if Sheet1.Range("D14")<>"" then exit for end if
(11)Sheet1.Range("D14")可能残留前次查询数据,因此需在for循环前将其清空。注意填充操作前均需考虑先清空目标单元格。
二、使用vba函数
(1)以文本函数left为例,演示在vba中的调用过程:vba-->strings-->left,了解vba函数的分类;
(2)演示“DEMO-2-根据部门列创建工作表(最终完成版)”,输入“e”或“99999”,分别报错“类型不匹配”及“溢出”,讲解变量类型的声明及范围;
(3)演示如果不声明“iCol”变量类型,运行仍会报错,因inputbox返回text类型值,而iCol作为后面for循环的参数应是integer;
(4)若不声明变量类型,可通过“iCol = iCol * 1”或“iCol =Val( iCol )强制转换为integer类型,但仍无法解决输入“e”报错的问题;
(5)增加判断语句“If VBA.Information.IsNumeric(iCol) = False or iCol< 1 Then MsgBox ("请输入正确的数字") Exit Sub End If"
(6)重点掌握vba函数中的文本函数:instr,split
(7)InStr([start, ]string1, string2[, compare]),返回 string2在string1中最先出现的位置,找不到返回“0”,规避了WorksheetFunction.find()函数找不到报错的问题;
如“”“DEMO-3-VBA函数”中提取指定位置的字符:Sheet1.Range("b2") = Left(Sheet1.Range("a2"), InStr(Sheet1.Range("a2"), "@") - 1)
(8)Split(expression[, delimiter[, limit[, compare]]]),“delimiter”为指定分隔符,若不输入则默认为空格符“ ”分割,返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
(9)用“DEMO-3-VBA函数“演示,用工作表的文本函数进行提取很麻烦,但split进行文本提取很方便,如“Range("b2") = Split(Range("a2"), "-")(2)”得到"2015",而
Range("b2") = Split(Range("a2"), "-")(2) & "年" & Split(Range("a2"), "-")(3) & "周",可得到“2015年37周"。