相关文章推荐
含蓄的枇杷  ·  C# WinForm ...·  4 天前    · 
听话的煎饼  ·  用star ...·  1 年前    · 
坚强的四季豆  ·  Rstudio ...·  2 年前    · 

模糊查询的高阶玩法 数组完胜单元格遍历

模糊查找的高级玩法 代码少更易理解

在不久之前,我们学习了利用 range.find 的方法来实现单元格内容的模糊查找,并且将数据单独放到一个区域展示,相对于传统的 CTRL+F 的数据查找方法,效率是提高了很多,但是这个方法还不是最好的方法,因为之后有小伙伴们就碰到这样的情况了。

利用 range.find 方式进行大批量数据查找, Excel 卡到。。。。

这里我们来说下, range.find 方法,终究还是利用单元格的方法,即 range 的附属方法,在面对大数据的时候,遍历所有的单元格去循环查找,并不是一个明智的选择。

那么如果数据量过大的情况,我们要如何来实现数据的查找呢?

这是我们今天构造的一个数据源,量不算很大,大概有 1500 行数据,同时总共有 5 列,那么总共有 1500*5=7500 左右各数据

这个量并不算大,那么我们现在 执行下之前我们的代码

利用 range.find 方法的代码来看看

这里我们就不展示代码了,直接看看获取结果所需要的时间

1500 行的数据,就需要大概 12s 左右的时间,虽然不算很慢,但是毕竟数据量也不算很大,并且我们这里也是减少了数据量,只针对 A 列进行 查找,因为数据量再多点,我 怕电脑 会卡死(家里电脑太差 ....

所以我们需要一个高阶查询

Sub test4()

t = Now()

Dim arr, arr1

arr = Range("a2:a1509")

arr = WorksheetFunction.Transpose(arr)

arr1 = Filter(arr, "A1", True)

Range(Cells(17, 8), Cells(UBound(arr1) + 1, 8)) = WorksheetFunction.Transpose(arr1)

t1 = Now() - t

MsgBox t1

End Sub

说是高阶查找,但是代码反而越来越少

既然我们已经知道用 range.find 方法行不通,那么我们肯定要换种方法来使用了。

这里就是我们的数组方法,搭配一个数组函数, filter

可以看到原来需要 12s 的数据,现在瞬间完成,所以这里展示的是 0

代码量减少了,自然说明方法也是更加的简单啦。

首先我们声明两个变量,用来承接数组

arr , arr1

首先将 A 列的数据装入数组中

arr = Range("a2:a1509")

然后我们上面说过,搭配一个数组函数 Filter

那么现在需要让她出场了。

arr1 = Filter( arr , "A1", True)

来说下 Filter 的用法。

Filter (数组,匹配的内容,布尔值)

1. 数组,就是我们要判断的内容

这里需要注意,这里必须是一个数组。不能是一个文本或者其他的

2. 匹配的内容,就是我们要配置的数据

这里需要注意的是,这里并不需要搭配任何通配符,因为 Filter 本身就是用模糊匹配的。

3. 布尔值

熟悉编程的小伙伴都知道,布尔值只有两个, TRUE FALSE, 这里我们来讲解下

TRUE ,包含,即我们所谓的正向查找

比方说这个结果都是包含 A1 的,如果我选择 FALSE 呢?

瞬间可以将所有不包含 A1 的数据提取出来,非常的方便,快捷。

有了结果,那么我们直接写入单元格就可以了。数组的写入是一个个写入的嘛?

很明显不是,是批量直接一次性写入的,这样效率更高

那么代码要如何体现呢?

Range( Cells(17, 8), Cells( UBound (arr1) + 1, 8)) = WorksheetFunction.Transpose (arr1)

arr = WorksheetFunction.Transpose ( arr )

这里我们将第二行的代码也一起展示出来

我们可以看到代码中都包含了一个相同的部分

WorksheetFunction.Transpose

这是 Filter 的特性决定的。

因为 Filter 只能针对一维数组,一维数组是什么概念呢?

看下案例,一行我们可以简单理解为就是一维数组,因为我们这里选择的是 A 列,所以我们需要用 WorksheetFunction.Transpose ,将一列转置为一行,形成一个一维数组

而最后单元格的写入的时候,就反过来了

因为 arr1 是一个一维数组,那么我们要写入一列,所有要将一维数组,在转换成为多维数组

所以这里也要使用一次 WorksheetFunction.Transpose

GET 了吗? 返回搜狐,查看更多

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。