1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

帖子
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: niushiping

用VBA实现在A列单元格内容里批量查找B列的多个关键词

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-1-27 17:11 | 显示全部楼层
本帖最后由 quqiyuan 于 2025-1-27 17:13 编辑

macos没有字典,使用数组循环,仅供参考。。。
image.png
image.png

示例.xlsm.zip

18.99 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2025-1-27 17:13 | 显示全部楼层
代码如下。。。
Sub test()
    Set wb = ThisWorkbook
    Set sht = wb.Sheets("sheet1")
    r = sht.Cells(Rows.Count, 1).End(3).Row
    arr = sht.[a2].Resize(r - 1)
    r = sht.Cells(Rows.Count, 2).End(3).Row
    brr = sht.[b2].Resize(r - 1)
    ReDim crr(1 To UBound(arr), 0)
    For i = 1 To UBound(arr)
        s = Split(arr(i, 1), ",")
        ss = Empty
        For j = 0 To UBound(s)
            For k = 1 To UBound(brr)
                If brr(k, 1) = s(j) Then
                    ss = ss & "/" & brr(k, 1)
                End If
            Next
        Next
        crr(i, 0) = Mid(ss, 2)
    Next
    sht.[d2].Resize(UBound(crr)) = crr
    Beep
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-1-27 17:48 来自手机 | 显示全部楼层
中药方剂的药材名称可不能胡乱提取,示例中第二行第一项为“川贝母”,显然应提取“川贝”而非“贝母”。
通常,这种关键字有相互包含的情况,必须按关键字的长度进行排序,然后以正则的“|”运算符将关键字并连起来进行匹配提取,这样可以避免把被包含的短关键字重复提取。
比如,“姜半夏”,提取之后,不宜再提取“半夏”,正则表达式提取时会消耗字符,可以避免重复提取。如果不用正则,可以用InStr函数判断关键字是否存在,如果存在,提取后应当用replace函数去掉已提取的关键字,达到“消耗字符”的效果。

总之,注意两点,一,关键字按长度降序排序,二,提取了的关键字应当消耗掉。

TA的精华主题

TA的得分主题

发表于 2025-1-27 17:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

模拟到1万多,没问题
image.jpg

TA的精华主题

TA的得分主题

发表于 2025-1-27 17:53 来自手机 | 显示全部楼层
Sub CompareAndMatchWithoutDictionary()
    Dim ws As Worksheet
    Dim lastRowA As Long, lastRowB As Long
    Dim AData As Variant, BData As Variant, result As Variant
    Dim i As Long, j As Long
    Dim wordsArray() As String
    Dim singleItem As String
    Dim results As String

    ' 获取当前工作表
    Set ws = ThisWorkbook.Sheets(1)

    ' 获取A列和B列的最后一行行号
    lastRowA = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    lastRowB = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    ' 读取A列和B列数据到内存
    AData = ws.Range("A1:A" & lastRowA).Value
    BData = ws.Range("B1:B" & lastRowB).Value

    ' 准备一个数组存储C列的结果
    ReDim result(1 To lastRowA, 1 To 1)

    ' 遍历A列数据
    For i = 1 To lastRowA
        If Not IsEmpty(AData(i, 1)) Then
            wordsArray = Split(AData(i, 1), ",") ' 按逗号分隔
            results = ""

            ' 遍历A单元格分割的中药名称,并与B列关键字逐一匹配
            For Each singleItem In wordsArray
                singleItem = Trim(singleItem) ' 去除空格
                For j = 1 To lastRowB
                    If singleItem = Trim(BData(j, 1)) Then
                        If results = "" Then
                            results = singleItem
                        Else
                            results = results & "/" & singleItem
                        End If
                        Exit For
                    End If
                Next j
            Next singleItem

            ' 将结果存入结果数组
            result(i, 1) = results
        Else
            result(i, 1) = "" ' 如果A单元格为空,则C单元格也为空
        End If
    Next i

    ' 将结果一次性写回C列
    ws.Range("C1:C" & lastRowA).Value = result

    ' 提示完成
    MsgBox "操作完成!结果已写入C列!", vbInformation
End Sub

TA的精华主题

TA的得分主题

发表于 2025-1-27 18:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Option Explicit
Sub TEST2()
    Dim ar, br, cr, i&, j&, r&, strJoin$
   
    Application.ScreenUpdating = False
   
    r = Cells(Rows.Count, "B").End(xlUp).Row
    strJoin = "," & Join(Application.Transpose(Range("B1:B" & r).Value), ",") & ","
    ar = [A1].CurrentRegion.Value
    ReDim br(1 To UBound(ar), 0)
    For i = 2 To UBound(ar)
        cr = Split(ar(i, 1), ",")
        For j = 0 To UBound(cr)
            If InStr(strJoin, "," & cr(j) & ",") Then
                If Len(br(i, 0)) = 0 Then br(i, 0) = cr(j) Else br(i, 0) = br(i, 0) & "/" & cr(j)
            End If
        Next j
    Next i
   
    [C1].Resize(UBound(br)) = br
    Application.ScreenUpdating = True
    Beep
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-1-27 18:59 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-3-8 03:13 , Processed in 0.021419 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表