【自定义函数】编码-查询-匹配
目录
- 自定义编码匹配
- 编码匹配改进
- sheet来源汇总
- 来源汇总改进
- END
自定义编码匹配
在wps vb环境写一个新的excel函数名为编码匹配,第一个参数指定待匹配文本所在单元格(相对引用),第二个参数指定关键词区域(绝对引用,一行或者一列单元格),第三个参数指定一个自定义编码区域(绝对引用一行或者一列,但是要检查其长度是否与关键词区域相等,不等则显示错误),完成参数填写以后,将参数2中每个关键词依次在参数1中进行匹配,如果存在则记录其次序,返回值参数3中与改次序相同的自定义编码文本,如果存在多个匹配结果,用逗号间隔后返回
gpt错误是把关键词和编码定义为了String,应该是Variant
改进:跳过关键词的空值,这样引用区域可以预留空间
Function 编码匹配(待匹配文本 As Range, 关键词区域 As Range, 自定义编码区域 As Range) As StringDim 关键词() As Variant ' 关键词数组Dim 编码() As Variant ' 编码数组Dim 匹配结果 As String ' 最终匹配结果Dim i As Long ' 循环变量Dim 匹配次序 As Collection ' 用于存储匹配次序Dim 匹配项 As Variant ' 用于遍历匹配次序集合' 检查关键词区域和自定义编码区域的长度是否相等If 关键词区域.Count <> 自定义编码区域.Count Then编码匹配 = "错误:关键词区域和自定义编码区域长度不匹配"Exit FunctionEnd If' 将关键词区域和自定义编码区域的值存入数组关键词 = 关键词区域.Value编码 = 自定义编码区域.Value' 检查待匹配文本是否为空If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then编码匹配 = ""Exit FunctionEnd 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 iEnd IfEnd IfNext i' 如果没有匹配结果,返回空字符串If 匹配次序.Count = 0 Then编码匹配 = ""Exit FunctionEnd If' 根据匹配次序获取对应的自定义编码For Each 匹配项 In 匹配次序If 匹配结果 = "" Then匹配结果 = 编码(匹配项, 1)Else匹配结果 = 匹配结果 & "," & 编码(匹配项, 1)End IfNext 匹配项' 返回最终结果编码匹配 = 匹配结果
End Function
编码匹配改进
对以下代码进行修改和改进,以提供个性化的匹配,
做一些预处理,先用一个另外的’关键词排序数组’将’关键词’中的数列根据字符串长度升序排列,随后自上而下遍历,将较短的关键词在比它长的其他所有关键词中进行搜索,如果匹配成功,较短一方添加到’上级’数组,较长一方添加到’下级’数组,
在For i = LBound(关键词, 1) To UBound(关键词, 1)这个遍历关键词过程中,如果当前关键词在上级数组中且待匹配文本搜索成功,请将所有的下级数组中的关键词在待匹配文本中进行搜索,如果有一个下级数组关键词匹配成功,说明这个待匹配文本可能是对应下级数组关键词的编码,而不适用当前上级关键词对应的编码,所以不添加匹配次序
Function 编码匹配(待匹配文本 As Range, 关键词区域 As Range, 自定义编码区域 As Range) As StringDim 关键词() 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 FunctionEnd If' 将关键词区域和自定义编码区域的值存入数组关键词 = 关键词区域.Value编码 = 自定义编码区域.Value' 检查待匹配文本是否为空If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then编码匹配 = ""Exit FunctionEnd If' 初始化匹配次序集合和上级/下级数组Set 匹配次序 = New CollectionReDim 上级数组(LBound(关键词, 1) To UBound(关键词, 1))ReDim 下级数组(LBound(关键词, 1) To UBound(关键词, 1))For i = LBound(关键词, 1) To UBound(关键词, 1)Set 下级数组(i) = New CollectionNext i' 按字符串长度对关键词进行排序Dim 排序数组() As VariantReDim 排序数组(LBound(关键词, 1) To UBound(关键词, 1))For i = LBound(关键词, 1) To UBound(关键词, 1)排序数组(i) = Array(i, Len(Trim(关键词(i, 1))))Next iQuickSort 排序数组, 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 IfNext jNext 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 iElse' 检查下级关键词是否匹配成功Dim 下级关键词匹配成功 As Boolean下级关键词匹配成功 = FalseDim 下级关键词 As VariantFor Each 下级关键词 In 下级数组(i)If InStr(1, 待匹配文本.Value, 关键词(下级关键词, 1), vbTextCompare) > 0 Then下级关键词匹配成功 = TrueExit ForEnd IfNext 下级关键词' 如果没有下级关键词匹配成功,则添加当前上级关键词If Not 下级关键词匹配成功 Then匹配次序.Add iEnd IfEnd IfEnd IfEnd IfNext i' 如果没有匹配结果,返回空字符串If 匹配次序.Count = 0 Then编码匹配 = ""Exit FunctionEnd If' 根据匹配次序获取对应的自定义编码For Each 匹配项 In 匹配次序If 匹配结果 = "" Then匹配结果 = 编码(匹配项, 1)Else匹配结果 = 匹配结果 & "," & 编码(匹配项, 1)End IfNext 匹配项' 返回最终结果编码匹配 = 匹配结果
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 Variantlower = first: upper = lastpivot = arr((first + last) \ 2)(1)Do While lower <= upperDo While (arr(lower)(1) < pivot And lower < last)lower = lower + 1LoopDo While (pivot < arr(upper)(1) And upper > first)upper = upper - 1LoopIf lower <= upper Thentemp = arr(lower)arr(lower) = arr(upper)arr(upper) = templower = lower + 1upper = upper - 1End IfLoopIf first < upper Then QuickSort arr, first, upperIf 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 StringDim 匹配结果 As StringDim 区域 As VariantDim 工作表 As WorksheetDim 单元格 As RangeDim 匹配地址 As StringDim 区域索引 As Long' 检查待匹配文本是否为空If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then来源汇总 = "EmptyError"Exit FunctionEnd 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 IfEnd IfNext 单元格End IfNext 区域索引' 返回最终结果来源汇总 = 匹配结果
End Function
来源汇总改进
进行来源汇总时也对关键词做一个上级和下级的区分,然后在搜索区域匹配时,上级关键词要剔除掉对应的下级关键词的匹配结果
Function 来源汇总(待匹配文本 As Range, ParamArray 检索区域() As Variant) As StringDim 匹配结果 As StringDim 区域 As VariantDim 工作表 As WorksheetDim 单元格 As RangeDim 匹配地址 As StringDim 区域索引 As LongDim 关键词() As VariantDim 上级数组() As BooleanDim 下级数组() As CollectionDim i As Long, j As Long' 检查待匹配文本是否为空If IsEmpty(待匹配文本.Value) Or Trim(待匹配文本.Value) = "" Then来源汇总 = "----"Exit FunctionEnd 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 IfElse' 检查下级关键词是否匹配成功Dim 下级关键词匹配成功 As Boolean下级关键词匹配成功 = FalseDim 下级关键词 As VariantFor Each 下级关键词 In 下级数组(i)If InStr(1, 单元格.Value, 下级关键词, vbTextCompare) > 0 Then下级关键词匹配成功 = TrueExit ForEnd IfNext 下级关键词' 如果没有下级关键词匹配成功,则添加当前上级关键词If Not 下级关键词匹配成功 ThenIf 匹配结果 = "" Then匹配结果 = 匹配地址Else匹配结果 = 匹配结果 & "," & 匹配地址End IfEnd IfEnd IfEnd IfNext 单元格End IfNext 区域索引' 返回最终结果来源汇总 = 匹配结果
End Function
END
相关文章:
【自定义函数】编码-查询-匹配
目录 自定义编码匹配编码匹配改进 sheet来源汇总来源汇总改进 END 自定义编码匹配 在wps vb环境写一个新的excel函数名为编码匹配,第一个参数指定待匹配文本所在单元格(相对引用),第二个参数指定关键词区域(绝对引用&…...
16 分布式session和无状态的会话
在我们传统的应用中session存储在服务端,减少服务端的查询压力。如果以集群的方式部署,用户登录的session存储在该次登录的服务器节点上,如果下次访问服务端的请求落到其他节点上就需要重新生成session,这样用户需要频繁的登录。 …...
git基础指令大全
版本控制 git管理文件夹 进入要管理的文件夹 — 进入 初始化(提名) git init 管理文件夹 生成版本 .git ---- git在管理文件夹时,版本控制的信息 生成版本 git status 检测当前文件夹下的文件状态 (检测,检测之后就要管理了…...
Android实训九 数据存储和访问
实训9 数据存储和访问 一、【实训目的】 1、 SharedPreferences存储数据; 2、 借助Java的I/O体系实现文件的存储, 3、使用Android内置的轻量级数据库SQLite存储数据; 二、【实训内容】 1、实现下图所示的界面,实现以下功能: 1ÿ…...
[STM32 标准库]定时器输出PWM配置流程 PWM模式解析
前言: 本文内容基本来自江协,整理起来方便日后开发使用。MCU:STM32F103C8T6。 一、配置流程 1、开启GPIO,TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…...
如何跨互联网adb连接到远程手机-蓝牙电话集中维护
如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机,安装一个App并简单设置一下,就可以跨互联网的ADB连接到这个手机,从而远程操控这个手机做各种操作。你敢相信吗?而这正是本篇想要描述的…...
【6】YOLOv8 训练自己的分割数据集
YOLOv8 训练自己的分割数据集:详细指南 引言 YOLOv8作为目标检测领域的佼佼者,其在实例分割任务上也表现出色。本文将详细介绍如何使用YOLOv8训练自己的分割数据集,从数据集准备、模型训练、评估到部署,全方位地进行阐述。 一、数据集准备 数据收集: 图像/视频来源: 与目…...
将 OneLake 数据索引到 Elasticsearch - 第二部分
作者:来自 Elastic Gustavo Llermaly 及 Jeffrey Rengifo 本文分为两部分,第二部分介绍如何使用自定义连接器将 OneLake 数据索引并搜索到 Elastic 中。 在本文中,我们将利用第 1 部分中学到的知识来创建 OneLake 自定义 Elasticsearch 连接器…...
Android Studio:视图绑定的岁月变迁(2/100)
一、博文导读 本文是基于Android Studio真实项目,通过解析源码了解真实应用场景,写文的视角和读者是同步的,想到看到写到,没有上帝视角。 前期回顾,本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…...
私有包上传maven私有仓库nexus-2.9.2
一、上传 二、获取相应文件 三、最后修改自己的pom文件...
Qt监控系统辅屏预览/可以同时打开4个屏幕预览/支持5x64通道预览/onvif和rtsp接入/性能好
一、前言说明 在监控系统中,一般主界面肯定带了多个通道比如16/64通道的画面预览,随着电脑性能的增强和多屏幕的发展,再加上现在监控摄像头数量的增加,越来越多的用户希望在不同的屏幕预览不同的实时画面,一个办法是打…...
Vue.js 路由懒加载
Vue.js 路由懒加载 在 Vue.js 开发中,随着应用规模的扩大,打包后的 JavaScript 文件可能会变得相当庞大,影响页面的加载速度和性能。为了解决这个问题,Vue Router 提供了路由懒加载功能,可以将不同路由对应的组件分割…...
HBase的原理
一、什么是HBase HBase是一个分布式,版本化,面向列的数据库,依赖Hadoop和Zookeeper (1)HBase的优点 提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统 (2) HBase 表的特性 Region包含多行 列族包含多…...
Python “字典” 实战案例:5个项目开发实例
Python “字典” 实战案例:5个项目开发实例 内容摘要 本文包括 5 个使用 Python 字典的综合应用实例。具体是: 电影推荐系统配置文件解析器选票统计与排序电话黄页管理系统缓存系统(LRU 缓存) 以上每一个实例均有完整的程序代…...
(DM)达梦数据库基本操作(持续更新)
1、连接达梦数据库 ./disql 用户明/"密码"IP端口或者域名 2、进入某个模式(数据库,因达梦数据库没有库的概念,只有模式,可以将模式等同于库) set schema 库名; 3、查表结构; SELECT COLUMN_NAM…...
LabVIEW心音心电同步采集与实时播放
开发了一个基于LabVIEW开发的心音心电同步采集与实时播放系统。该系统可以同时采集心音和心电信号,并通过LabVIEW的高级功能实现这些信号的实时显示和播放。系统提升心脏疾病诊断的准确性和效率,使医生能够在观察心音图的同时进行听诊。 项目背景 心…...
[创业之路-268]:《创业讨论会》- 个人思维 -> 团队思维 -> 管理思维 -> 领导者思维 -> 老板思维->企业家思维->政治家思维的演进路径
目录 一、演进路径 二、老板与企业家的区别 一、演进路径 这个演进路径描述了一个个体从个人思考模式逐渐发展到领导和管理整个组织或企业的思考模式的过程。下面是对每个阶段的简要解释: 这个演进路径并不是线性的,也不是每个人都会经历所有阶段。然…...
单片机基础模块学习——数码管(二)
一、数码管模块代码 这部分包括将数码管想要显示的字符转换成对应段码的函数,另外还包括数码管显示函数 值得注意的是对于小数点和不显示部分的处理方式 由于小数点没有单独占一位,所以这里用到了两个变量i,j用于跳过小数点导致的占据其他字符显示在数…...
深入解析ncnn::Net类——高效部署神经网络的核心组件
最近在学习ncnn推理框架,下面整理了ncnn::Net 的使用方法。 在移动端和嵌入式设备上进行高效的神经网络推理,要求框架具备轻量化、高性能以及灵活的扩展能力。作为腾讯开源的高性能神经网络推理框架,ncnn在这些方面表现出色。而在ncnn的核心…...
前端【8】HTML+CSS+javascript实战项目----实现一个简单的待办事项列表 (To-Do List)
目录 一、功能需求 二、 HTML 三、CSS 四、js 1、绑定事件与初始设置 2.、绑定事项 (1)添加操作: (2)完成操作 (3)删除操作 (4)修改操作 3、完整js代码 总结…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<1>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们来学习指针的相关知识,学习内存和地址,指针变量和地址,包…...
向量和矩阵算法笔记
向量和矩阵算法笔记 Ps:因为本人实力有限,有一部分可能不太详细,若有补充评论区回复,QWQ 向量 向量的定义 首先,因为我刚刚学到高中的向量,对向量的看法呢就是一条有长度和方向的线,不过这在数学上的定义其实是不对,甚至跟我看的差别其实有点大,真正的定义就是数域…...
Nginx配置中的常见错误:SSL参数解析
摘要 在高版本的Nginx中,用户可能会遇到unknown directive “ssl”的错误提示。这是因为旧版本中使用的ssl on参数已被弃用。正确的配置SSL加密的方法是在listen指令中添加ssl参数。这一改动简化了配置流程,提高了安全性。用户应更新配置文件以适应新版本…...
積分方程與簡單的泛函分析6.有連續對稱核的弗雷德霍姆積分算子的特徵值
1)def弗雷德霍姆算子的核函數定義 定义: 设 是定义在矩形区域 上的函数。 若满足以下条件,则称 为弗雷德霍姆算子的核函数: 实值性: 是实值函数,即对于任意的 ,。 这是因为在许多实际的物理和数学问题中,所涉及的量往往是实数值,例如在积分方程描述的物理模型中,…...
AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码
AI编程工具使用技巧:在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…...
Yii框架中的扩展:如何使用外部库
在Yii框架中,扩展功能的一种常见且有效的方式是使用外部库。这些外部库可以帮助开发者实现特定的功能,如调用第三方API、处理图片、生成PDF文件或发送邮件等。以下是使用外部库扩展Yii框架的详细步骤: 一、安装外部库 使用Composerÿ…...
kettle与Springboot的集成方法,完整支持大数据组件
目录 概要整体架构流程技术名词解释技术细节小结 概要 在现代数据处理和ETL(提取、转换、加载)流程中,Kettle(Pentaho Data Integration, PDI)作为一种强大的开源ETL工具,被广泛应用于各种数据处理场景。…...
GitHub Actions 使用需谨慎:深度剖析其痛点与替代方案
在持续集成与持续部署(CI/CD)领域,GitHub Actions 曾是众多开发者的热门选择,但如今,其弊端逐渐显现,让不少人在使用前不得不深思熟虑。 团队由大约 15 名工程师组成,采用基于主干的开发方式&am…...
<iframe>标签和定时调用函数setInterval
iframe 标签和定时调用函数 setInterval 问题描述:解决方法: 问题描述: 今天遇到一个前端问题,在浏览器页面上传Excel文件后,然后点击导入按钮,经后端Java类读取文件内容校验后,将校验结果返回…...
MYSQL学习笔记(六):聚合函数、sql语句执行原理简要分析
前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇是内容较少,主要讲解:聚合函数和简要介绍sql语句执行过…...
