【自定义函数】编码-查询-匹配

news2025/1/26 16:59:44

目录

    • 自定义编码匹配
      • 编码匹配改进
    • sheet来源汇总
      • 来源汇总改进
  • END

自定义编码匹配

在wps vb环境写一个新的excel函数名为编码匹配,第一个参数指定待匹配文本所在单元格(相对引用),第二个参数指定关键词区域(绝对引用,一行或者一列单元格),第三个参数指定一个自定义编码区域(绝对引用一行或者一列,但是要检查其长度是否与关键词区域相等,不等则显示错误),完成参数填写以后,将参数2中每个关键词依次在参数1中进行匹配,如果存在则记录其次序,返回值参数3中与改次序相同的自定义编码文本,如果存在多个匹配结果,用逗号间隔后返回
gpt错误是把关键词和编码定义为了String,应该是Variant
改进:跳过关键词的空值,这样引用区域可以预留空间

Function 编码匹配(待匹配文本 As Range, 关键词区域 As Range, 自定义编码区域 As Range) As String
    Dim 关键词() As Variant ' 关键词数组
    Dim 编码() As Variant ' 编码数组
    Dim 匹配结果 As String ' 最终匹配结果
    Dim i As Long ' 循环变量
    Dim 匹配次序 As Collection ' 用于存储匹配次序
    Dim 匹配项 As Variant ' 用于遍历匹配次序集合

    ' 检查关键词区域和自定义编码区域的长度是否相等
    If 关键词区域.Count <> 自定义编码区域.Count Then
        编码匹配 = "错误:关键词区域和自定义编码区域长度不匹配"
        Exit Function
    End If

    ' 将关键词区域和自定义编码区域的值存入数组
    关键词 = 关键词区域.Value
    编码 = 自定义编码区域.Value

    ' 检查待匹配文本是否为空
    If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then
        编码匹配 = ""
        Exit Function
    End If

    ' 初始化匹配次序集合
    Set 匹配次序 = New Collection

    ' 遍历关键词区域,检查关键词是否在待匹配文本中
    For i = LBound(关键词, 1) To UBound(关键词, 1)
        ' 检查关键词是否为空
        If Not IsEmpty(关键词(i, 1)) And Trim(关键词(i, 1)) <> "" Then
            ' 检查关键词是否在待匹配文本中
            If InStr(1, 待匹配文本.Value, 关键词(i, 1), vbTextCompare) > 0 Then
                匹配次序.Add i
            End If
        End If
    Next i

    ' 如果没有匹配结果,返回空字符串
    If 匹配次序.Count = 0 Then
        编码匹配 = ""
        Exit Function
    End If

    ' 根据匹配次序获取对应的自定义编码
    For Each 匹配项 In 匹配次序
        If 匹配结果 = "" Then
            匹配结果 = 编码(匹配项, 1)
        Else
            匹配结果 = 匹配结果 & "," & 编码(匹配项, 1)
        End If
    Next 匹配项

    ' 返回最终结果
    编码匹配 = 匹配结果
End Function

编码匹配改进

对以下代码进行修改和改进,以提供个性化的匹配,

做一些预处理,先用一个另外的’关键词排序数组’将’关键词’中的数列根据字符串长度升序排列,随后自上而下遍历,将较短的关键词在比它长的其他所有关键词中进行搜索,如果匹配成功,较短一方添加到’上级’数组,较长一方添加到’下级’数组,
在For i = LBound(关键词, 1) To UBound(关键词, 1)这个遍历关键词过程中,如果当前关键词在上级数组中且待匹配文本搜索成功,请将所有的下级数组中的关键词在待匹配文本中进行搜索,如果有一个下级数组关键词匹配成功,说明这个待匹配文本可能是对应下级数组关键词的编码,而不适用当前上级关键词对应的编码,所以不添加匹配次序

Function 编码匹配(待匹配文本 As Range, 关键词区域 As Range, 自定义编码区域 As Range) As String
    Dim 关键词() As Variant ' 关键词数组
    Dim 编码() As Variant ' 编码数组
    Dim 匹配结果 As String ' 最终匹配结果
    Dim i As Long, j As Long ' 循环变量
    Dim 匹配次序 As Collection ' 用于存储匹配次序
    Dim 匹配项 As Variant ' 用于遍历匹配次序集合
    Dim 上级数组() As Boolean ' 标记是否为上级关键词
    Dim 下级数组() As Collection ' 存储每个关键词的下级关键词

    ' 检查关键词区域和自定义编码区域的长度是否相等
    If 关键词区域.Count <> 自定义编码区域.Count Then
        编码匹配 = "错误:关键词区域和自定义编码区域长度不匹配"
        Exit Function
    End If

    ' 将关键词区域和自定义编码区域的值存入数组
    关键词 = 关键词区域.Value
    编码 = 自定义编码区域.Value

    ' 检查待匹配文本是否为空
    If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then
        编码匹配 = ""
        Exit Function
    End If

    ' 初始化匹配次序集合和上级/下级数组
    Set 匹配次序 = New Collection
    ReDim 上级数组(LBound(关键词, 1) To UBound(关键词, 1))
    ReDim 下级数组(LBound(关键词, 1) To UBound(关键词, 1))
    For i = LBound(关键词, 1) To UBound(关键词, 1)
        Set 下级数组(i) = New Collection
    Next i

    ' 按字符串长度对关键词进行排序
    Dim 排序数组() As Variant
    ReDim 排序数组(LBound(关键词, 1) To UBound(关键词, 1))
    For i = LBound(关键词, 1) To UBound(关键词, 1)
        排序数组(i) = Array(i, Len(Trim(关键词(i, 1))))
    Next i
    QuickSort 排序数组, LBound(排序数组), UBound(排序数组)

    ' 遍历排序后的关键词,构建上级和下级数组
    For i = LBound(排序数组) To UBound(排序数组)
        Dim 当前关键词索引 As Long
        当前关键词索引 = 排序数组(i)(0)
        For j = i + 1 To UBound(排序数组)
            Dim 比较关键词索引 As Long
            比较关键词索引 = 排序数组(j)(0)
            If InStr(1, 关键词(比较关键词索引, 1), 关键词(当前关键词索引, 1), vbTextCompare) > 0 Then
                上级数组(比较关键词索引) = True
                下级数组(当前关键词索引).Add 比较关键词索引
            End If
        Next j
    Next i

    ' 遍历关键词区域,检查关键词是否在待匹配文本中
    For i = LBound(关键词, 1) To UBound(关键词, 1)
        ' 检查关键词是否为空
        If Not IsEmpty(关键词(i, 1)) And Trim(关键词(i, 1)) <> "" Then
            ' 检查关键词是否在待匹配文本中
            If InStr(1, 待匹配文本.Value, 关键词(i, 1), vbTextCompare) > 0 Then
                ' 检查是否为上级关键词
                If Not 上级数组(i) Then
                    匹配次序.Add i
                Else
                    ' 检查下级关键词是否匹配成功
                    Dim 下级关键词匹配成功 As Boolean
                    下级关键词匹配成功 = False
                    Dim 下级关键词 As Variant
                    For Each 下级关键词 In 下级数组(i)
                        If InStr(1, 待匹配文本.Value, 关键词(下级关键词, 1), vbTextCompare) > 0 Then
                            下级关键词匹配成功 = True
                            Exit For
                        End If
                    Next 下级关键词
                    ' 如果没有下级关键词匹配成功,则添加当前上级关键词
                    If Not 下级关键词匹配成功 Then
                        匹配次序.Add i
                    End If
                End If
            End If
        End If
    Next i

    ' 如果没有匹配结果,返回空字符串
    If 匹配次序.Count = 0 Then
        编码匹配 = ""
        Exit Function
    End If

    ' 根据匹配次序获取对应的自定义编码
    For Each 匹配项 In 匹配次序
        If 匹配结果 = "" Then
            匹配结果 = 编码(匹配项, 1)
        Else
            匹配结果 = 匹配结果 & "," & 编码(匹配项, 1)
        End If
    Next 匹配项

    ' 返回最终结果
    编码匹配 = 匹配结果
End Function

' 快速排序算法
Sub QuickSort(arr, ByVal first As Long, ByVal last As Long)
    Dim lower As Long, upper As Long, pivot As Variant, temp As Variant
    lower = first: upper = last
    pivot = arr((first + last) \ 2)(1)
    Do While lower <= upper
        Do While (arr(lower)(1) < pivot And lower < last)
            lower = lower + 1
        Loop
        Do While (pivot < arr(upper)(1) And upper > first)
            upper = upper - 1
        Loop
        If lower <= upper Then
            temp = arr(lower)
            arr(lower) = arr(upper)
            arr(upper) = temp
            lower = lower + 1
            upper = upper - 1
        End If
    Loop
    If first < upper Then QuickSort arr, first, upper
    If lower < last Then QuickSort arr, lower, last
End Sub

sheet来源汇总

在wps vb环境写一个新的excel函数名为来源汇总,第一个参数指定待匹配文本所在单元格(相对引用且不得为空),第二个参数开始指定sheet页(具体方式是选中任意区域,在处理时仅识别sheet名),当第二个参数不为空时增加第三个参数用来添加新的检索sheet页,遍历所有的检索区域,当待匹配文本包含在检索区域的某个单元格的文本值中,将该单元格所在sheet名+单元格位置如“A1”这样的字串添加到文返回值中
考虑检索区域是二维表格,且为该sheet中包含所有数据的最小矩形区域
注意在使用时填A1绝对引用

Function 来源汇总(待匹配文本 As Range, ParamArray 检索区域() As Variant) As String
    Dim 匹配结果 As String
    Dim 区域 As Variant
    Dim 工作表 As Worksheet
    Dim 单元格 As Range
    Dim 匹配地址 As String
    Dim 区域索引 As Long

    ' 检查待匹配文本是否为空
    If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then
        来源汇总 = "EmptyError"
        Exit Function
    End If

    ' 初始化匹配结果
    匹配结果 = ""

    ' 遍历所有指定的检索区域
    For 区域索引 = LBound(检索区域) To UBound(检索区域)
        ' 检查当前区域是否为空
        If Not IsEmpty(检索区域(区域索引)) Then
            ' 获取区域所在的工作表
            Set 工作表 = 检索区域(区域索引).Parent

            ' 遍历工作表中的每个单元格(仅在已使用的范围内)
            For Each 单元格 In 工作表.UsedRange
                ' 检查单元格是否包含待匹配文本
                If InStr(1, 单元格.Value, 待匹配文本.Value, vbTextCompare) > 0 Then
                    ' 构造匹配地址
                    匹配地址 = 工作表.Name & "!" & 单元格.Address(False, False)
                    ' 将匹配地址添加到结果中
                    If 匹配结果 = "" Then
                        匹配结果 = 匹配地址
                    Else
                        匹配结果 = 匹配结果 & "," & 匹配地址
                    End If
                End If
            Next 单元格
        End If
    Next 区域索引

    ' 返回最终结果
    来源汇总 = 匹配结果
End Function

来源汇总改进

进行来源汇总时也对关键词做一个上级和下级的区分,然后在搜索区域匹配时,上级关键词要剔除掉对应的下级关键词的匹配结果

Function 来源汇总(待匹配文本 As Range, ParamArray 检索区域() As Variant) As String
    Dim 匹配结果 As String
    Dim 区域 As Variant
    Dim 工作表 As Worksheet
    Dim 单元格 As Range
    Dim 匹配地址 As String
    Dim 区域索引 As Long
    Dim 关键词() As Variant
    Dim 上级数组() As Boolean
    Dim 下级数组() As Collection
    Dim i As Long, j As Long

    ' 检查待匹配文本是否为空
    If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then
        来源汇总 = "----"
        Exit Function
    End If

    ' 初始化匹配结果
    匹配结果 = ""

    ' 获取所有关键词并初始化上级和下级数组
    ReDim 关键词(1 To 1)
    ReDim 上级数组(1 To 1)
    ReDim 下级数组(1 To 1)
    Set 下级数组(1) = New Collection

    ' 遍历所有指定的检索区域
    For 区域索引 = LBound(检索区域) To UBound(检索区域)
        ' 检查当前区域是否为空
        If Not IsEmpty(检索区域(区域索引)) Then
            ' 获取区域所在的工作表
            Set 工作表 = 检索区域(区域索引).Parent

            ' 遍历工作表中的每个单元格(仅在已使用的范围内)
            For Each 单元格 In 工作表.UsedRange
                ' 检查单元格是否包含待匹配文本
                If InStr(1, 单元格.Value, 待匹配文本.Value, vbTextCompare) > 0 Then
                    ' 构造匹配地址
                    匹配地址 = 工作表.Name & "!" & 单元格.Address(False, False)

                    ' 检查是否为上级关键词
                    If Not 上级数组(i) Then
                        ' 添加匹配地址到结果
                        If 匹配结果 = "" Then
                            匹配结果 = 匹配地址
                        Else
                            匹配结果 = 匹配结果 & "," & 匹配地址
                        End If
                    Else
                        ' 检查下级关键词是否匹配成功
                        Dim 下级关键词匹配成功 As Boolean
                        下级关键词匹配成功 = False
                        Dim 下级关键词 As Variant
                        For Each 下级关键词 In 下级数组(i)
                            If InStr(1, 单元格.Value, 下级关键词, vbTextCompare) > 0 Then
                                下级关键词匹配成功 = True
                                Exit For
                            End If
                        Next 下级关键词
                        ' 如果没有下级关键词匹配成功,则添加当前上级关键词
                        If Not 下级关键词匹配成功 Then
                            If 匹配结果 = "" Then
                                匹配结果 = 匹配地址
                            Else
                                匹配结果 = 匹配结果 & "," & 匹配地址
                            End If
                        End If
                    End If
                End If
            Next 单元格
        End If
    Next 区域索引

    ' 返回最终结果
    来源汇总 = 匹配结果
End Function

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git基础指令大全

版本控制 git管理文件夹 进入要管理的文件夹 — 进入 初始化&#xff08;提名&#xff09; git init 管理文件夹 生成版本 .git ---- git在管理文件夹时&#xff0c;版本控制的信息 生成版本 git status 检测当前文件夹下的文件状态 (检测&#xff0c;检测之后就要管理了…

Android实训九 数据存储和访问

实训9 数据存储和访问 一、【实训目的】 1、 SharedPreferences存储数据; 2、 借助Java的I/O体系实现文件的存储&#xff0c; 3、使用Android内置的轻量级数据库SQLite存储数据; 二、【实训内容】 1、实现下图所示的界面&#xff0c;实现以下功能&#xff1a; 1&#xff…

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言&#xff1a; 本文内容基本来自江协&#xff0c;整理起来方便日后开发使用。MCU&#xff1a;STM32F103C8T6。 一、配置流程 1、开启GPIO&#xff0c;TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

如何跨互联网adb连接到远程手机-蓝牙电话集中维护

如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机&#xff0c;安装一个App并简单设置一下&#xff0c;就可以跨互联网的ADB连接到这个手机&#xff0c;从而远程操控这个手机做各种操作。你敢相信吗&#xff1f;而这正是本篇想要描述的…

将 OneLake 数据索引到 Elasticsearch - 第二部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 及 Jeffrey Rengifo 本文分为两部分&#xff0c;第二部分介绍如何使用自定义连接器将 OneLake 数据索引并搜索到 Elastic 中。 在本文中&#xff0c;我们将利用第 1 部分中学到的知识来创建 OneLake 自定义 Elasticsearch 连接器…

Android Studio:视图绑定的岁月变迁(2/100)

一、博文导读 本文是基于Android Studio真实项目&#xff0c;通过解析源码了解真实应用场景&#xff0c;写文的视角和读者是同步的&#xff0c;想到看到写到&#xff0c;没有上帝视角。 前期回顾&#xff0c;本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件

Qt监控系统辅屏预览/可以同时打开4个屏幕预览/支持5x64通道预览/onvif和rtsp接入/性能好

一、前言说明 在监控系统中&#xff0c;一般主界面肯定带了多个通道比如16/64通道的画面预览&#xff0c;随着电脑性能的增强和多屏幕的发展&#xff0c;再加上现在监控摄像头数量的增加&#xff0c;越来越多的用户希望在不同的屏幕预览不同的实时画面&#xff0c;一个办法是打…

LabVIEW心音心电同步采集与实时播放

开发了一个基于LabVIEW开发的心音心电同步采集与实时播放系统。该系统可以同时采集心音和心电信号&#xff0c;并通过LabVIEW的高级功能实现这些信号的实时显示和播放。系统提升心脏疾病诊断的准确性和效率&#xff0c;使医生能够在观察心音图的同时进行听诊。 ​ 项目背景 心…

深入解析ncnn::Net类——高效部署神经网络的核心组件

最近在学习ncnn推理框架&#xff0c;下面整理了ncnn::Net 的使用方法。 在移动端和嵌入式设备上进行高效的神经网络推理&#xff0c;要求框架具备轻量化、高性能以及灵活的扩展能力。作为腾讯开源的高性能神经网络推理框架&#xff0c;ncnn在这些方面表现出色。而在ncnn的核心…

前端【8】HTML+CSS+javascript实战项目----实现一个简单的待办事项列表 (To-Do List)

目录 一、功能需求 二、 HTML 三、CSS 四、js 1、绑定事件与初始设置 2.、绑定事项 &#xff08;1&#xff09;添加操作&#xff1a; &#xff08;2&#xff09;完成操作 &#xff08;3&#xff09;删除操作 &#xff08;4&#xff09;修改操作 3、完整js代码 总结…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<1>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 这一节我们来学习指针的相关知识&#xff0c;学习内存和地址&#xff0c;指针变量和地址&#xff0c;包…

積分方程與簡單的泛函分析6.有連續對稱核的弗雷德霍姆積分算子的特徵值

1)def弗雷德霍姆算子的核函數定義 定义: 设 是定义在矩形区域 上的函数。 若满足以下条件,则称 为弗雷德霍姆算子的核函数: 实值性: 是实值函数,即对于任意的 ,。 这是因为在许多实际的物理和数学问题中,所涉及的量往往是实数值,例如在积分方程描述的物理模型中,…

AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码

AI编程工具使用技巧&#xff1a;在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…

kettle与Springboot的集成方法,完整支持大数据组件

目录 概要整体架构流程技术名词解释技术细节小结 概要 在现代数据处理和ETL&#xff08;提取、转换、加载&#xff09;流程中&#xff0c;Kettle&#xff08;Pentaho Data Integration, PDI&#xff09;作为一种强大的开源ETL工具&#xff0c;被广泛应用于各种数据处理场景。…

GitHub Actions 使用需谨慎:深度剖析其痛点与替代方案

在持续集成与持续部署&#xff08;CI/CD&#xff09;领域&#xff0c;GitHub Actions 曾是众多开发者的热门选择&#xff0c;但如今&#xff0c;其弊端逐渐显现&#xff0c;让不少人在使用前不得不深思熟虑。 团队由大约 15 名工程师组成&#xff0c;采用基于主干的开发方式&am…

<iframe>标签和定时调用函数setInterval

iframe 标签和定时调用函数 setInterval 问题描述&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 今天遇到一个前端问题&#xff0c;在浏览器页面上传Excel文件后&#xff0c;然后点击导入按钮&#xff0c;经后端Java类读取文件内容校验后&#xff0c;将校验结果返回…

Qt——界面优化

一.QSS 1.背景 在网页前端开发领域中&#xff0c; CSS 是⼀个至关重要的部分。 描述了⼀个网页的 "样式"。 从而起到对网页美化的作用。 所谓样式&#xff0c;包括不限于大小&#xff0c;位置&#xff0c;颜色&#xff0c;背景&#xff0c;间距&#xff0c;字体等等…

java基础学习——jdbc基础知识详细介绍

引言 数据的存储 我们在开发 java 程序时&#xff0c;数据都是存储在内存中的&#xff0c;属于临时存储&#xff0c;当程序停止或重启时&#xff0c;内存中的数据就会丢失&#xff0c;我们为了解决数据的长期存储问题&#xff0c;有以下解决方案&#xff1a; 通过 IO流书记&…

CukeTest使用 | 1 CukeTest是什么?如何下载安装?

CukeTest使用 | 1 CukeTest是什么&#xff1f;如何下载安装&#xff1f; 1 CukeTest是什么&#xff1f;2 关于开发者3 CukeTest有哪些特性&#xff1f;4 都支持哪些自动化技术类型&#xff1f;5 版本区别6 下载安装 特殊说明&#xff1a;学习内容主要来自官网的教程、以及网上公…