用VBA实现Excel函数03:SUMIF
时间:2022-07-22
本文章向大家介绍用VBA实现Excel函数03:SUMIF,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、函数的理解:
SUMIF,条件求和函数,是一个常用的数据统计公式。SUMIF函数原理可以分步理解:
SUMIF(range, criteria, [sum_range])
- 先是用第2个参数criteria与第1个参数range里的数据逐一做对比,返回FALSE或者TRUE
- 根据返回的FALSE或者TRUE,再用IF函数提取第3个参数sum_range的数字
- 最后再用SUM函数汇总
这就是1个标准的SUMIF函数使用方法。
2、代码实现
有了上面的理解,完成一个标准的SUMIF函数功能应该是比较简单的:
Sub TestMySumIf()
Dim rangeValus() As Variant
Dim sum_range() As Variant
rangeValus = Range("B2:B16").Value
sum_range = Range("C2:c16").Value
Debug.Print MySumIf(rangeValus, "赵四", sum_range)
End Sub
'输出:6192
Function MySumIf(rangeValus As Variant, criteria As Variant, sum_range As Variant) As Double
Dim i As Long
Dim dSum As Long
For i = LBound(rangeValus, 1) To UBound(rangeValus, 1)
If rangeValus(i, 1) = criteria Then
dSum = dSum + VBA.Val(sum_range(i, 1))
End If
Next
MySumIf = dSum
End Function
3、代码完善
SUMIF函数的参数提示上可以看出,第3个参数是在“[]”内的,首先我们也完成这个可省略的功能,省略的情况下,其实第1和第3参数相当于是同一个了,所以我们只要知道第3个参数sum_range没有传递的情况下,直接让3个参数sum_range等于第1个参数range就可以了:
Sub TestMySumIf()
Dim rangeValus() As Variant
Dim sum_range() As Variant
rangeValus = Range("C2:C16").Value
Debug.Print MySumIf(rangeValus, 6192)
End Sub
Function MySumIf(rangeValus As Variant, criteria As Variant, Optional sum_range As Variant) As Double
If VBA.IsMissing(sum_range) Then
sum_range = rangeValus
End If
Dim i As Long
Dim dSum As Long
For i = LBound(rangeValus, 1) To UBound(rangeValus, 1)
If rangeValus(i, 1) = criteria Then
dSum = dSum + VBA.Val(sum_range(i, 1))
End If
Next
MySumIf = dSum
End Function
IsMissing函数就是用来判断这种可选参数在调用时,是否提供了这个参数的传递。
SUMIF函数的第2个参数criteria输入形式是非常多样的,除了前面看到的输入的是条件本身之外,它还可以输入比较符:
> 大于
< 小于
>= 大于或等于
<= 小于或等于
要实现这个功能,我们就需要用到VBA里的字符串操作了:
Sub TestMySumIf()
Dim rangeValus() As Variant
Dim sum_range() As Variant
rangeValus = Range("C2:C16").Value
Debug.Print MySumIf(rangeValus, ">6666")
End Sub
'输出:607857
Function MySumIf(rangeValus As Variant, criteria As Variant, Optional sum_range As Variant) As Double
If VBA.IsMissing(sum_range) Then
sum_range = rangeValus
End If
'分离比较符和条件
Dim strcp As String
strcp = VBA.CStr(criteria)
If VBA.Left(strcp, 2) = "<=" Then
strcp = "<="
ElseIf VBA.Left(strcp, 2) = ">=" Then
strcp = ">="
ElseIf VBA.Left(strcp, 1) = "<" Then
strcp = "<"
ElseIf VBA.Left(strcp, 1) = ">" Then
strcp = ">"
Else
strcp = ""
End If
criteria = VBA.Mid(criteria, VBA.Len(strcp) + 1)
'如果数字前面带了比较符,criteria传入的是文本,而数字会小于文本的数字
If VBA.IsNumeric(criteria) Then
criteria = VBA.Val(criteria)
End If
Dim i As Long
Dim dSum As Long
For i = LBound(rangeValus, 1) To UBound(rangeValus, 1)
'根据比较符来使用具体比较方法
Select Case strcp
Case ">="
If rangeValus(i, 1) >= criteria Then
dSum = dSum + VBA.Val(sum_range(i, 1))
End If
Case "<="
If rangeValus(i, 1) <= criteria Then
dSum = dSum + VBA.Val(sum_range(i, 1))
End If
Case "<"
If rangeValus(i, 1) < criteria Then
dSum = dSum + VBA.Val(sum_range(i, 1))
End If
Case ">"
If rangeValus(i, 1) > criteria Then
dSum = dSum + VBA.Val(sum_range(i, 1))
End If
Case Else
If rangeValus(i, 1) = criteria Then
dSum = dSum + VBA.Val(sum_range(i, 1))
End If
End Select
Next
MySumIf = dSum
End Function
Left,Mid,Len都是String类型的基础操作函数,在VBA中用的会比较多,用法比较简单,具体用法可以查看官方文档。
4、小结
实现1个简单的SUMIF函数,还非常的不完善,主要学习:
- 可选参数是否传递的判断IsMissing函数。
- 字符串的处理函数。
- 微信小程序请求server时遇到的2个问题
- Android NDK层编译OpenCV代码开发详解
- 实时通信框架 Socket.IO
- Kafka 快速起步
- 老司机带你用python来爬取妹子图
- 爬虫必学知识之正则表达式下篇
- 爬虫必学知识之正则表达式上篇
- python爬虫常用库之requests详解
- python爬虫常用库之urllib详解
- 如何 build 出尽可能小的 docker image?
- 一步一步教你如何用python操作mysql
- 利用Python实现卷积神经网络的可视化
- SDP(13): Scala.Future - far from completion,绝不能用来做甩手掌柜
- 干货|浅谈强化学习的方法及学习路线
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- swift 中类(class)和结构体(struct)区别
- C语言三剑客之《C专家编程》一书精华提炼
- 前端必备技能:json-server全攻略
- 温故知新——Spring AOP(二)
- R语言中的偏最小二乘PLS回归算法
- R如何与Tableau集成分步指南
- 漏洞复现 | CVE‐2020‐5902踩坑记
- PCA图显示分组无差异,怎么办?
- 我接手了一个“垃圾”系统,全栈优化后将性能提升了350倍
- 用 eggnog-mapper 进行功能注释
- 将SAP C4C Custom BO使用ABSL编写的逻辑通过OData服务暴露出去
- Linux笔记(14)| 字符设备驱动基础入门(续)
- scRNAseq包更新动作太大
- Linux笔记(13)| 字符设备驱动基础入门
- 你要的rmarkdown文献图表复现全套代码来了(单细胞)