六、在vba中使⽤函数(公式)
⾃⼰熟悉excel⼯作表中的函数公式,本节主要处理如何在vba中使⽤函数,分两种:⼯作表函数和vba函数:
(1)在vba中使⽤⼯作表函数,必须使⽤前缀Application.WorksheetFunction.
(2)⼤部分⼯作表函数在vba中与在⼯作表中的⽤法相同;
(2)⼀些⼯作表函数在vba中不实⽤。例如:Concatenate 函数就不实⽤,因为在vba 中可以使⽤ & 运算符来连接多个⽂本值。(2)⼀些⼯作表函数在vba中⽤法略有差异,如vlookup;(3)vba函数可不要前缀直接调⽤,但若需寻,在 Application.WorksheetFunction不到,需要使⽤vba.前缀(了解vba函数的分类后可逐级,分类见附录)
⼀、在vba中使⽤⼯作表函数
  问题导⼊:“使⽤⼯作表函数”⽂件,做成查询系统,完成以下功能:
vlookup函数8种用法
      (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周"。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。