相关文章推荐
坏坏的甜瓜  ·  SQLFetchScroll ...·  昨天    · 
性感的枇杷  ·  Matplotlib ...·  1 年前    · 
风流的日记本  ·  适用于 Windows 的 ...·  1 年前    · 

大家好,我是海林,今天跟大家分享的VBA小代码主题是 数据精确查询与匹配

我们用王者荣耀的数据来举例,如下图所示。根据A:C列的数据源信息,查询E列英雄名相应的职业类型,如果查询无结果,则返回空白。
在这里插入图片描述
在这里插入图片描述

此类问题常用的解决办法有三种,一种是Find方法,另一种是If条件判断,以及Vlookup方法。

1.Find方法

Sub RngFind()
    Dim Rng1 As Range, Rng2 As Range
    Dim arr As Variant, i As Long
    Set Rng1 = Range("b1:c" & Cells(Rows.Count, 2).End(xlUp).Row)
    '数据源赋值Rng
    arr = Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
    '查询区域装入数组arr
    For i = 2 To UBound(arr) '遍历查询区域
        arr(i, 2) = ""
         '清空原结果
        Set Rng2 = Rng1.Find(arr(i, 1), lookat:=xlWhole)
        'xlwhole精确查找模式,xlpart模糊查找模式
        If Not Rng2 Is Nothing Then
        '如果有查找到相应单元格则Rng2必然非nothing,那么
            arr(i, 2) = Rng2.Offset(0, 1)
            '对查找到的单元格通过offset偏移取值
            arr(i, 2) = "" '否则返回空值
        End If
    With Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
        .NumberFormat = "@"
        '设置单元格文本格式,避免文本数值变形
        .Value = arr
        '将arr放回单元格区域
    End With
    MsgBox "OK"
End Sub

2.If条件判断

Sub IfDemo()
    Dim arr1 As Variant, arr2 As Variant, i As Long, j As Long
    arr1 = Range("a1:c" & Cells(Rows.Count, 2).End(xlUp).Row)
    '数据源装入数组arr1
    arr2 = Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
    '查询区域装入数组arr2
    For i = 2 To UBound(arr2)
    '遍历查询区域
        arr2(i, 2) = ""
        '清空原结果
        For j = 2 To UBound(arr1)
            If arr1(j, 2) = arr2(i, 1) Then
                '模糊查询可使用Instr函数和like语句,Instrd的vbTextCompare参数不区分字母大小写,like语句区分字母大小写
                arr2(i, 2) = arr1(j, 3)
                Exit For '找到结果后,退出遍历arr1
            End If
    With Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
        .NumberFormat = "@"
        '设置单元格文本格式,避免文本数值变形
        .Value = arr2
        '将arr2放回单元格区域
    End With
    MsgBox "OK"
End Sub

3.Vlookup方法

Sub RngVlookup()
    Dim arr As Variant, i As Long
    arr = Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
    '查询区域装入数组arr
    For i = 2 To UBound(arr) '遍历查询区域
        arr(i, 2) = ""
         '清空原结果
        arr(i, 2) = Application.VLookup(arr(i, 1), Range("B:C"), 2, 0)
         '若是模糊匹配,VLookup最后一个参数是1
    With Range("e1:f" & Cells(Rows.Count, 5).End(xlUp).Row)
        .NumberFormat = "@"
        '设置单元格文本格式,避免文本数值变形
        .Value = arr
        '将arr放回单元格区域
    End With
    Range("F" & Cells(Rows.Count, 5).End(xlUp).Row).Select
    Selection.Replace What:="#N/A", Replacement:="", LookAt:=xlPart
    '对于没有匹配上的错误值替换成空值
    MsgBox "OK"
End Sub

1.按笔者经验,数据量大时,Vlookup方法速度较快;
2.多条件查询匹配时,条件语句可以这样写:

If arr1(j, 1) & arr1(j, 2) =  arr2(i, 1) & arr2(i, 2) Then

希望以上内容对你有帮助。

大家好,我是海林,今天跟大家分享的VBA小代码主题是数据精确查询与匹配。我们用王者荣耀的数据来举例,如下图所示。根据A:C列的数据源信息,查询E列英雄名相应的职业类型,如果查询无结果,则返回空白。此类问题常用的解决办法有两种,一种是Find方法,另一种是If等于条件判断。1.Find方法Sub RngFind() Dim Rng1 As Range, Rng2 As Range... Range.Find(What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat]); <单元格区域>.Find (要查找的数据,开始查找的位置,查找的范围类型,完全匹配还是部分匹配,行列方式查找,向前向后查找,区分大小写,全角或半角,查找格式)。 名称:What 必选 Varia Public Sub DoFilter2() ' 按照发票号码做匹配,重新生成一个明细的表格,本例子的模板是Sheet9 和 Sheet13 'Sheet9  是明细,Sheet13 是汇总的, 需要从这个两个Sheet里重新提取数据到一个新的Sheet14里     'If Workbooks(1).Worksheets("sheet1") Is Nothing Then 匹配sheet页:在A/B列粘贴需要打标的源数据,然后在词库页面配置好关键词,最后在H列选择匹配模式,即可在C列得到达标结果 词库sheet页:按识别逻辑,在B/(F&G)/(K&L)列设置需识别的关键词,然后在C/H/M列匹配上想标记的词句,即完成词库配置 二、代码详情 1. 单列匹配 Sub 单列匹配() Dim tiaojian1 As Range Dim tiaojian2 As Range Dim neirong1 As Range Dim neiro
1. 什么是VBA? Visual Basic for Applications(简称VBA)是新一代标准宏语言,是基于Visual Basic for Windows 发展而来的。它与传统的宏语言不同,传统的宏语言不具有高级语言的特征,没有面向对象的程序设计概念和方法。而VBA 提供了面向对象的程序设计方法,提供了相当完整的程序设计语言。VBA 易于学习掌握,可以使用宏记录器记录用户的各种操作并将其转换为VBA 程序代码。这样用户可以容易地将日常工作转换为VBA 程序代码,使工作自动化。 VBA百度百科 Columns("A:M").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "P1:X2"), CopyToRange:=Range("P11:AB41"), Unique:=False End Sub 2、图片显示: (1)源数据图片: (2)单条件查询: (3)多条件查询: 3、总结: excel表...
这是一个仿api调用方式的文件查找代码,在office 2010验证通过。 调用时,查到的文件直接在调用函数的参数中返回,调用时给出参数名称,函数自动返回数组结果。可以返回文件名,文件大小,创建日期,修改日期。 是在别人的代码上重建的。
从上一篇文章我们可以获取到指定单元格的数据,并判断出类型。 这次要做的就是,如果这个单元格数据类型是字符串,我们就去进行子字符串的匹配,说的简单点就是判断指定单元格有没有我们需要找的字符串。 例如:判断单元格J6有没有‘√’,代码如下: Sub aa() Set a = Range("J6") If InStr(a, "√") Then MsgBox (a)
对前一篇文章进行更新升级,有时候需要给正则表达式进行分类,当匹配到某个正则表达式时,则在相应的位置展示出该正在表达式属于哪一类,这样的话,我们就可以很方面的对自己所要处理的很多数据进行分类了 实现上面功能,可以在sheet2中的B列加上对应的正则表达式属于哪一类 sheet1中A列数据与上一篇文章一样 运行下面代码,则出现了想要的效果如下: 然后修改相应的代码如...
最朴树的find例子:Range("G4") = Range("B:B").Find(Range("G3")).Row解释: Range(“B:B”)表示要查找的位置在第B列 Find(Range(“G3”))表示要查找G3单元格中的值 Row返回查找到的位置的行数工作表函数Match例子Range("A1") = application.WorksheetFunction.Match(Ran
如图所示,该工作簿中建立“数据表”和“数据查询”表分别用于存储客户信息以及客户信息的查询。现希望在数据查询表的关键字栏中输入某个关键字,并在“数据表”中的各列对该关键字进行查找,然后希望能随着按钮“查找下一个”的单击不断显示下一条满足条件的记录。如何用VBA完成? 石家庄伊克塞尔有限公司 石家庄市中山路52号 XXX-XXXXXXXX