# Excel VBA解读（134）： 使用Excel函数提高自定义函数的效率

excelperfect

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

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

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

If IsError(Application.Match)

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

• 使用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

0 条评论

• ### Excel VBA解读（135）： 影响工作表公式中运用自定义函数效率的Bug及解决方法

在前面的两篇文章中，我们通过简单地修改VBA代码来使自定义函数运行得更快。本文将聚焦于Excel中会影响到自定义函数的Bug，并探讨如何避免它们。

• ### Excel VBA解读（137）： 让使用用户定义函数的数组公式更快

Excel数组公式能够做很多令人惊讶的事情。除了在输入完后要按Ctrl+Shift+Enter组合键外，与普通公式一样。本文主要研究使用用户定义函数的数组公式。

• ### Matlab加上VBA编程，表格就能画画了

之前学习Matlab是为了参加一个数学建模的比赛，但是在慢慢的学习当中发现了matlab这款软件是真的有趣，真的非常有用，大家没事也可以去学习一下使用matla...

• ### Excel VBA解读（143）： 在自定义函数中使用整列引用时，如何更有效率？

Excel用户经常发现在公式中使用整列的引用很方便，这样可避免每次添加新数据时都必须调整公式。因此，当编写用户自定义函数时，可能会使用：

• ### Excel应用实践06：进行多条件统计

这是在知乎上看到的一个问题，我试着用VBA来解决。欢迎大家就自已使用Excel中遇到的问题或想要的解决方案提问，我将尽力解答。

• ### Excel应用实践04：分页单独打印Excel表中的数据

在实际工作中，我们经常会遇到想将工作表中的数据（如下图1所示的“数据”工作表）导入到固定的表格（如下图2所示）中并打印。

• ### Excel应用实践03：使用Excel进行个人计划执行记录与统计分析

一转眼，2019年已至4月，自从年初立下flag后，便努力朝着实现它的方向奔跑。有些执行得很好，比如每天更新完美Excel微信公众号，坚持每天学习，而有些则还没...

• ### Excel VBA解读（138）： 自定义函数时使用字节数组实现更快的字符串处理

如果有很多行，要查找每行字符串第一个大写字母的位置，则使用数组公式会花费不少时间。