学习Excel技术,关注微信公众号:

excelperfect

在上篇文章中,我们展示了自定义函数有效的方式是通过将单元格区域读取到Variant型数组来传递单元格区域数据。本文将介绍在自定义函数中最有效的方式是使用Excel内置函数。

线性插值是一种常用技术,用来查找缺失值或者计算两个值之间的值。例如下表:

图1

现在,想要知道Level的66.25对应的Flow1的值是多少?假设该值在66的Level对应的Flow1值6.19与66.5的Level对应的Flow1值8.64构成的直线上,可以计算66.25对应的Flow1的值如下:

8.64与6.19之差是2.45,66.25是66与66.5之间的中间值,所以将2.45的一半加上6.19得到7.415。

公式为:

=6.19+(8.64-6.19)*(66.25-66.0)/(66.5-66.0)

编写一个简单的自定义函数如下:

Function VINTERPOLATEA(Lookup_ValueAs Variant, _

Table_Array As Range, _

Col_Num As Long)

Dim vArr As Variant

Dim j As Long

vArr = Table_Array.Value2

For j = 1 To UBound(vArr)

If vArr(j, 1) > Lookup_Value Then

Exit For

End If

Next j

VINTERPOLATEA = (vArr(j - 1, Col_Num) + _

(vArr(j, Col_Num) - vArr(j - 1, Col_Num)) * _

(Lookup_Value - vArr(j - 1, 1)) / (vArr(j, 1) - vArr(j - 1, 1)))

End Function

代码中,Lookup_value是在单元格区域Table_Array的第1列中要找的值,Col_Num是要进行插值的数据的列号索引(本例中为2)。

这个自定义函数计算速度已经很快了。然而,还可以更快!

仔细分析这个自定义函数代码,实际的计算仅使用2行数据,但要获得这2行数据必须将所有数据导入到数组并在第1列执行线性查找。

因此,让我们试着在自定义函数代码中通过Application.WorksheetFunction.MATCH来使用Excel的MATCH函数。由于数据已排序,所以可以使用近似匹配查找MATCH。一旦通过MATCH获取行号,就可以获得我们需要的数据所在的2行。

修改后的自定义函数如下:

Function VINTERPOLATEB(Lookup_Value As Variant, _

Table_Array As Range, _

Col_Num As Long)

Dim jRow As Long

Dim rng As Range

Dim vArr As Variant

Set rng = Table_Array.Columns(1)

jRow = Application.WorksheetFunction.Match(Lookup_Value, rng, 1)

vArr = Table_Array.Resize(2).Offset(jRow - 1, 0).Value

VINTERPOLATEB = (vArr(1, Col_Num) + _

(vArr(2, Col_Num) - vArr(1, Col_Num)) * _

(Lookup_Value - vArr(1, 1)) / (vArr(2, 1) - vArr(1, 1)))

End Function

代码使用MATCH函数查找到所需的行,然后使用Resize和Offset将区域调整为仅需要的2行数据。

注意,有两种方法从VBA调用像MATCH这样的Excel函数:Application.Match和Application.WorksheetFunction.Match。其差别主要在于错误处理(例如,当在完全匹配选项时找不到完全匹配项):

  • Application.Match返回包含错误的Variant型值,允许使用IsError:

If IsError(Application.Match)

  • Application.WorksheetFunction.Match触发VBA错误,需要On Error语句处理。

并且Application.Math更快些。

因此,需要添加错误处理和达到数据边界的情况处理:

  • 使用On Error来捕捉非数字数据

  • 检查要查找的值是否在表中数据范围之外

  • 检查要查找的值是否是表中最后一个值

代码如下:

Function VINTERPOLATEC(Lookup_ValueAs Variant, _

Table_Array As Range, _

Col_Num As Long)

Dim jRow As Long

Dim rng As Range

Dim vArr As Variant

Dim vValue As Variant

On Error GoTo FuncFail

Set rng = Table_Array.Columns(1)

'检查是否是最后一行

vValue = rng.Cells(rng.Rows.Count, 1).Value2

If Lookup_Value = vValue Then

VINTERPOLATEC =Table_Array.Cells(rng.Rows.Count, Col_Num).Value2

Exit Function

End If

'如果Lookup_Value不在rng中则返回错误

If Lookup_Value > vValue Or Lookup_Value < rng.Cells(1).Value2Then

VINTERPOLATEC = CVErr(xlErrNA)

Exit Function

End If

'使用MATCH查找行号

jRow = Application.WorksheetFunction.Match(Lookup_Value, rng, 1)

'获取2行数据

vArr = Table_Array.Resize(2).Offset(jRow - 1, 0).Value2

VINTERPOLATEC = (vArr(1, Col_Num) + _

(vArr(2, Col_Num) - vArr(1, Col_Num)) * _

(Lookup_Value - vArr(1, 1)) / (vArr(2, 1) - vArr(1, 1)))

Exit Function

FuncFail:

VINTERPOLATEC = CVErr(xlErrValue)

End Function

下面是代码的图片版:

小结:唯一比将所有数据一次性传递到VBA中更快的方法是,使用Excel函数且仅传递给该函数所需的最少数据。

resize函数_Excel VBA解读(134): 使用Excel函数提高自定义函数的效率相关推荐

  1. 计算机中日期函数的应用,解读:使用EXCEL中的TEXT函数将文本转换为日期

    在EXCEL中,文本的功能是将各种形式的值转换为特定格式的文本.函数如下:= Text(要转换的单元格,特定格式的字符串) 例如:将单元格A1的值设置为1,我们要将A1的内容转换为001格式,可以使用 ...

  2. VBA基础知识整理(字典,自定义函数)

    字典 基本概念 '1 什么是VBA字典?'字典(dictionary)是一个储存数据的小仓库.共有两列.'第一列叫key , 不允许有重复的元素.'第二列是item,每一个key对应一个item,本列 ...

  3. 自定义函数fac1用递推方法求n!,自定义函数fac2用递归方法求n!,主函数中输入整数n(0≦n≦10)后,分别调用函数fac1和函数fac2求n!,最后输出调用的结果值进行对比。

    自定义函数fac1用递推方法求n!,自定义函数fac2用递归方法求n!,主函数中输入整数n(0≦n≦10)后,分别调用函数fac1和函数fac2求n!,最后输出调用的结果值进行对比. 参考运行截图: ...

  4. navicat存储过程返回值为空_Excel VBA解读(128):Function过程详解——枯燥的语法...

    学习Excel技术,关注微信公众号: excelperfect 在<Excel VBA解读(27):看看VBA的Sub过程和Function过程>中,我们讲解了Function过程的基本形 ...

  5. oracle体育成绩字段,在Excel中利用自定义函数处理体育达标成绩

    一.建立标准查分表 首先是根据<国家体育锻炼标准评分表>以16岁男子(高中一年级)为例,在Excel中建立标准评分表,把工作表命名为"评分表",建立该表的目的是为了编制 ...

  6. excel运行python自定义函数_终于,可以在Excel中直接使用Python!

    大家好,我是早起. 经常给大家推荐好用的数据分析工具,也收到了铁子们的各种好评.这次也不例外,我要再推荐一个,而且是个爆款神器. Excel和Jupyter Notebok都是我每天必用的工具,而且两 ...

  7. 在 Excel 中编写自定义函数——基础篇

    工作中经常在 Excel 中使用公式,很多问题不是一个函数可以解决的,往往是很多函数嵌套在一起.熟练以后,输入很长很长的公式倒也不是什么难事,就当是一次脑筋锻炼.但是阅读上到底有点不方便,尤其是隔了很 ...

  8. 计算机公式与函数试题,计算机国考样题EXCEL之公式与函数的应用一

    计算机国考样题EXCEL之公式与函数的应用一 (38页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 公式与函数的应用一第一题:公式在单元格 ...

  9. python中查看表头的函数_Python中也可以写Excel中的“Vlookup”函数?太牛逼了吧!...

    原标题:Python中也可以写Excel中的"Vlookup"函数?太牛逼了吧! Vlookup函数,可以算是一个数据专员必须要会使用的基本函数了,确实很好用.但是你可能会注意到, ...

最新文章

  1. html百度地图app,uniapp H5 百度地图(示例代码)
  2. win8下notepad++无法设置文件关联
  3. 【深度】阿里巴巴万级规模 K8s 集群全局高可用体系之美
  4. SpringBoot整合easyexcel实现导入导出
  5. iOS 7.1 arm64 编辑报错 警告解决办法
  6. jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】
  7. YUV格式转换RGB(基于opencv)
  8. wincc服务器系统,什么情况下用wincc服务器与客户端
  9. 华为数据之道_数字化与数据治理的典范实践者 | 华为数据之道
  10. 深度学习之TensorFlow
  11. 《C程序员从校园到职场》一1.2 C语言的主要特点
  12. 转 windows查看端口占用命令
  13. MYSQL的Commit与程序的原子性
  14. 268. 丢失的数字 Missing Number
  15. 华为路由器第三方插件_为什么路由器不开 SSH 就等于失去了很多乐趣?
  16. 偷梁换柱:谨防“Synaptics”蠕虫病毒
  17. 开头的单词_为什么以“S”开头的单词最多?| 英汉比较教学法·语音思维No.16...
  18. kubelet源码分析(四)之 syncLoopIteration
  19. 怦然心动(Flipped)-7
  20. PC端浏览器兼容测试总结

热门文章

  1. 第四节、逆矩阵与转置矩阵
  2. ASP.NET三层数据操作与GridView互动
  3. C语言-人狼羊菜问题-最容易看懂的解决方法及代码
  4. 微软Print to PDF打印机提示参数错误的解决方法
  5. Tomcat中出现“RFC 7230 and RFC 3986“错误的解决方法
  6. 解决使用mybatis分页插件PageHelper的一个报错问题
  7. 解决umount.nfs: /data: device is busy 问题
  8. jQuery中的队列是什么?
  9. Linux 文件的权限
  10. EasyStack 与F5合作, OpenStack开源云平台携手软件定义的应用交付服务