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)