本帖最后由 边缘码农 于 2024-7-11 12:56 编辑
在VBA中,经常会用InStr函数判断一个字符串是否包含在另外一个字符串中。 在解决“对匹配的风险物质进行汇总(涉及合并单元格)”这个帖子的问题编写的代码中使用了这个函数,楼主反馈: “同一个原料(多个组分对应多种风险物质)中有风险物质“苯”、“苯酚”,会将“苯”去重了,只剩下“苯酚”,请问要怎么样才可以精准去重?” 经测试楼主提供的附件,确实如此。分析代码运行中各变量的值,最终发现是使用InStr这个函数产生的问题。 例如: 在代码中,会进行这样的判断: - If InStr(ListYL, Now(X)) = 0 Then ListYL = ListYL & Now(X) & "、"
复制代码 运行过程中,实际的判断是这样: InStr("农药残留、苯酚、", "苯") 我们期望的结果是返回0,实际上返回的是6,从而造成运行结果有误。 在实际工作中出现这样的问题是难以避免的,也是防不胜防的,需要有更稳妥的解决办法。 经过思考,找到两个思路: 1、用特殊字符包裹每个“风险物质名称”,如: "#农药残留#、#苯酚#、" "#苯#" 上述判断代码可以改为: - If InStr(ListYL, "#" & Now(X) & "#") = 0 Then ListYL = ListYL & "#" & Now(X) & "#、"
复制代码 最终的运行结果中会出现特殊字符“#”,需要用Replace函数替换成空字符串,同时禁止“风险物质名称”中出现该特殊字符。 2、编制子函数模块。 在子函数模块中,使用split函数将“风险物质名称列表字符串”分隔到数据,逐个判断“当前风险物质名称”是否出现在“风险物质名称列表字符串”中。 函数代码如下: - Function StrExist(StrList As String, OneStr As String, StrSplit As String) As Boolean
- '-----------------------------------------------
- ' 判断字符OneStr是否在列表StrList中
- '
- ' 参数:
- ' StrList:字符列表,如:张三、李四、王五
- ' OneStr:某个字符,如:张三
- ' StrSplit:参数StrList的分割字符,如:、
- '-----------------------------------------------
- ' 边缘码农 at 2024-07-11
- '-----------------------------------------------
- Dim StrArr() As String
- Dim i As Integer
-
- StrExist = False '返回值赋初值
- If StrList <> "" Then
- ' 当字符列表StrList不为空时
- StrArr = Split(StrList, StrSplit)
- For i = 0 To UBound(StrArr)
- If OneStr = StrArr(i) Then
- StrExist = True
- Exit For
- End If
- Next
- End If
- End Function
复制代码 调用代码改为: - If Not StrExist(ListYL, Now(X), "、") Then
- ListYL = ListYL & Now(X) & "、"
- End If
复制代码 经过上述调整,解决了原帖子楼主提出的问题。 |