函数的使用
技巧1  调用工作表函数求和
在对工作表的单元格区域进行求和计算时,使用工作表Sum函数比使用VBA代码遍历单元格进行累加求和效率要高得多,代码如下所示。
#001  Sub rngSum()
#002      Dim rng As Range
#003      Dim d As Double
#004      Set rng = Range("A1:F7")
#005      d = Application.WorksheetFunction.Sum(rng)
#006      MsgBox rng.Address(0, 0) & "单元格的和为" & d
#007  End Sub
代码解析:
rngSum过程调用工作表Sum函数对工作表的单元格区域进行求和计算。
在VBA中调用工作表函数需要在工作表函数前加上WorksheetFunction属性。应用于Application对象的WorksheetFunction属性返回WorksheetFunction对象,作为VBA中调用工作表函数的容器,在实际应用中可省略Application对象识别符。
技巧2  查最大、最小值
在VBA中没有内置的函数可以进行最大、最小值的查,借助工作表Max、Min函数可以快速地在工作表区域中查最大、最小值,如下面的代码所示。
#001  Sub seeks()
#002      Dim rng As Range
#003      Dim myRng As Range
#004      Dim k1 As Integer, k2 As Integer
#005      Dim max As Double, min As Double
#006      Set myRng = Sheet1.Range("A1:F30")
#007      For Each rng In myRng
#008          If rng.Value = WorksheetFunction.max(myRng) Then
#009              rng.Interior.ColorIndex = 3
#010              k1 = k1 + 1
#011              max = rng.Value
#012          ElseIf rng.Value = WorksheetFunction.min(myRng) Then
#013              rng.Interior.ColorIndex = 5
#014              k2 = k2 + 1
#015              min = rng.Value
#016          Else
#017              rng.Interior.ColorIndex = 0
#018          End If
#019      Next
#020      MsgBox "最大值是:" & max & "共有 " & k1 & "个" _
#021          & Chr(13) & "最小值是:" & min & "共有 " & k2 & "个"
#022  End Sub
代码解析:
seeks过程在工作表单元格区域中查最大、最小值,并将其所在的单元格底分别设置为红和蓝。
第2行到第5行代码声明变量类型。
第6行代码使用关键字Set将单元格引用赋给变量myRng。
第7行到第19行代码遍历单元格区域,使用工作表Max、Min函数判断单元格数值是否是所在区域的最大、最小值,如果是,将其所在的单元格底设置为红或蓝,并保存其数值和数量。
第20、21行代码使用消息框显示最大、最小值数值和数量。
运行seeks过程后将工作表区域最大、最小值所在的单元格的底设置为红或蓝并用消息框显示其数值和数量,如图 1541所示。
图 1541    查最大、最小值
技巧3  不重复值的录入
在工作表中录入数据时,有时希望能限制重复值的录入,比如在示例的A列单元格只能录入唯一的人员编号,此时可以利用工作表的Change事件结合工作表的CountIf 函数来判断所录入的人员编号是否重复,示例代码如下。
#001  Private Sub Worksheet_Change(ByVal Target As Range)
#002      With Target
#003          If .Column <> 1 Or .Count > 1 Then Exit Sub
#004          If Application.CountIf(Range("A:A"), .Value) > 1 Then
#005              .Select
#006              MsgBox "不能输入重复的人员编号!", 64
#007              Application.EnableEvents = False
#008              .Value = ""
#009              Application.EnableEvents = True
#010          End If
#011      End With
#012  End Sub
代码解析:
工作表的Change事件过程,使A列单元格只能录入唯一的人员编号。
第4行代码使用工作表的CountIf 函数来判断在A列单元格输入的人员编号是否重复。工作表的CountIf 函数计算区域中满足给定条件的单元格的个数,语法如下:
COUNTIF(range, criteria)
参数range为需要计算其中满足条件的单元格数目的单元格区域。
参数criteria为确定哪些单元格将被计算在内的条件,其形式可以为数字、表达式、单元格引用或文本。
在示例中以所录入的人员编号与A列单元格区域进行比较,如果CountIf 函数的返回值大于1,说明录入的是重复编号。
5行代码,重新选择该单元格便于下一步清空后重新录入。
789行代码,清除录入的重复编号,在清除前将vba计算字符串长度Application对象的EnableEvents属性设置为False,禁用事件。因为如果不禁用事件,那么在清除重复值的过程中会不断地触发工作表的Change事件,从而造成代码运行的死循环。
经过以上的设置,在工作表的A列中只能录入唯一的人员编号,如果录入重复值会进行提示,如图 1551所示,点击确定后自动清除录入的重复编号。
图 1551    限制重复值的录入
技巧4  获得当月的最后一天
在实际工作中经常需要根据给定的日期计算其所属月份的最后一天,此时可以使用DateSerial函数完成计算,如下面的代码所示。
#001  Sub Serial()
#002      Dim DateStr As Byte
#003      DateStr = Day(DateSerial(Year(Date), Month(Date) + 1, 0))
#004      MsgBox "本月的最后一天是" & Month(Date) & "月" & DateStr & "号"
#005  End Sub
代码解析:
Serial过程配合使用了4个VBA内置函数Year、Month、Day和DateSerial完成计算并使用消息框显示当月最后一天的日期。
Year、Month和Day函数分别返回代表指定日期的年、月、日的整数,语法如下:
Year(Date)
Month(Date)
Day(Date)
其中参数Date可以是任何能够表示日期的Variant、数值表达式、字符串表达式或它们的组合。
DateSerial函数返回包含指定的年、月、日的Variant (Date),语法如下:
DateSerial(year, month, day)

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