相关文章推荐
玩篮球的柿子  ·  使用SXSSFWorkbook并发导出大批量 ...·  3 月前    · 
会搭讪的饭盒  ·  删掉Godot C#版本后出现的包引用问题 ...·  11 月前    · 
酷酷的扁豆  ·  【错误记录】Windows ...·  1 年前    · 
眉毛粗的跑步鞋  ·  c++ string和其他类型互转-CSDN博客·  1 年前    · 
酒量大的酸菜鱼  ·  鞠建东-清华大学五道口金融学院·  2 年前    · 
Code  ›  用VBA实现Excel函数01:VLOOKUP开发者社区
电子表格 vba vba数组 vlookup函数
https://cloud.tencent.com/developer/article/1669403
留胡子的打火机
2 年前
作者头像
xyj
0 篇文章

用VBA实现Excel函数01:VLOOKUP

前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > VBA 学习 > 正文

用VBA实现Excel函数01:VLOOKUP

发布 于 2020-07-28 10:28:24
3.8K 0
举报

很多学习VBA的应该都是在使用了一段时间的Excel之后,想弥补一些Excel本身的不足、或者是实现一些自动化操作。

函数是Excel里非常重要的一个功能,所以,我们结合Excel的函数,用VBA去实现一些常用的函数功能。

Excel的函数其实在底层肯定也是一段写好了的程序,只是我们看不到 它的实现过程,我们用VBA实现这些函数的功能,多半会比内置函数慢很多,而且考虑的情况也不够全面,但我们主要是学习一些思路。

1、实现简单的VLOOKUP

提到Excel的函数,VLOOKUP函数应该是最为常用的一个查找函数了,一般我们都是使用它的精确查找功能,也就是第4个参数设置为0或者false,所以我们也只实现一个精确查找的函数。

VLOOKUP函数有4个参数,我们也一样参照这个模式:

Function MyVlookup(lookup_value As Variant, table_array() As Variant, col_index_num As Long, Optional range_lookup As Long = 0) As Variant
End Function

参数:

  1. lookup_value:根据这个值去查找,这个值的类型可以是数值,也可以是String,所以我们把它定义为Variant
  2. table_array:一个Variant类型的数组,我们在 数组Array 里讲到过Range与数组之间的赋值,在Excel里这个参数就是1个Range的范围,而在VBA里虽然也可以用Range,但是为了提升一点速度,我们这里使用数组作为参数。
  3. col_index_num:要返回table_array里的第几列。
  4. range_lookup:请注意前面的修饰符Optional,我们在使用Excel的VLOOKUP函数时,细心的应该会注意到,函数的参数提示上,第4个参数是在“[]”里的,表示的意思是可以省略的参数。VBA里的参数修饰符Optional,和这个是同样的意思,可以省略的参数,如果省略了,就是用默认的值,在我们的定义里,默认等于0.
  5. 返回值:Variant,可以返回任意数据类型的值。

要实现这个功能,最简单的自然是用lookup_value与table_array里的第一列一个一个的比对,找到了相同的就返回col_index_num列的值,那显然这里需要用到 For循环 ,循环需要1个范围,也就是table_array数组的范围,数组范围的确定有内置函数:

  • UBound(table_array, 1):返回数组第1维的最大下标
  • LBound(table_array, 1):返回数组第1维的最小下标

举例看一下:

Dim arr(10) As Variant
UBound(arr, 1) = 10
LBound(arr, 1) = 0
UBound(arr, 2) '出错,因为arr是1维数组
LBound(arr, 2)  '出错,因为arr是1维数组
arr = Range("A1:A10")
UBound(arr, 1) = 10
LBound(arr, 1) = 1
UBound(arr, 2) = 1
LBound(arr, 2) = 1

其中1是可以省略的,也就是这个参数相当于是有Optional修饰符的。

那我们就先完成这个循环的代码:

    Dim arrRows As Long
    arrRows = UBound(table_array, 1) - LBound(table_array, 1) + 1
    Dim i As Long
    For i = 1 To arrRows
        If lookup_value = table_array(i, 1) Then
            MyVlookup = table_array(i, col_index_num)
            '一旦找到了需要的值,就可以返回并提前退出了
            Exit Function
        End If
    Next

其实完成这个循环代码后,如果一切输入正常的话,这个函数已经可以运行了,我们测试一下,测试数据:

测试代码:

Sub TestMyVlookup()
    Dim ret As Variant
    Dim table_array() As Variant
    table_array = Range("B1:C16").Value
    ret = MyVlookup("张三", table_array, 2, 0)
    Debug.Print "MyVlookup返回值", ret
    ret = Application.WorksheetFunction.VLookup("张三", table_array, 2, 0)
    Debug.Print "Excel Vlookup返回值", ret
End Sub
 
推荐文章
玩篮球的柿子  ·  使用SXSSFWorkbook并发导出大批量数据Excel - 脱缰的小马 - 简书
3 月前
会搭讪的饭盒  ·  删掉Godot C#版本后出现的包引用问题 - 哔哩哔哩
11 月前
酷酷的扁豆  ·  【错误记录】Windows 控制台程序编译报错 ( fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory )-阿里云开发
1 年前
眉毛粗的跑步鞋  ·  c++ string和其他类型互转-CSDN博客
1 年前
酒量大的酸菜鱼  ·  鞠建东-清华大学五道口金融学院
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号