VBA需求:按物料编号、国家、供应商组合唯一标记X至AN列
解决VBA标记唯一组合的问题
你的原代码仅判断了F列(供应商)的重复,未结合C列(物料编号)和E列(国家)的组合逻辑,因此无法满足需求。以下是修改后的代码,可实现C、E、F三者组合首次出现时,在对应行AN列标记x,每个组合仅标记一次的功能,同时加入了指定国家的校验:
Sub mark_unique_combination() Dim lastRow As Long Dim comboColl As New Collection Dim currentCombo As String Dim validCountries As Variant Dim i As Long ' 定义需求中的有效国家列表 validCountries = Array("SK", "CZ", "RO", "PL", "HR", "BG", "DE") ' 改用C列获取最后一行,避免F列空值导致漏处理数据 lastRow = ActiveSheet.Cells(Rows.Count, "C").End(xlUp).Row For i = 2 To lastRow ' 先判断F列非空,且E列属于指定国家 If Not IsEmpty(Cells(i, "F").Value) And _ IsInArray(Cells(i, "E").Value, validCountries) Then ' 拼接C、E、F的值作为唯一组合键,用|分隔避免字符串重叠误判 currentCombo = Cells(i, "C").Value & "|" & Cells(i, "E").Value & "|" & Cells(i, "F").Value On Error Resume Next ' 尝试将组合添加到集合,键为组合本身确保唯一性 comboColl.Add currentCombo, Key:=currentCombo If Err.Number = 0 Then ' 添加成功=该组合首次出现,标记x Cells(i, "AN").Value = "x" Else ' 组合已存在,清空AN列(不需要可删除此行) Cells(i, "AN").Value = "" End If On Error GoTo 0 Else ' 不符合条件的行,清空AN列 Cells(i, "AN").Value = "" End If Next i End Sub ' 辅助函数:判断值是否在指定数组中 Function IsInArray(searchVal As String, arr As Variant) As Boolean Dim element As Variant For Each element In arr If element = searchVal Then IsInArray = True Exit Function End If Next element IsInArray = False End Function
关键改动说明:
- 组合键设计:用
C列值|E列值|F列值作为唯一标识,避免不同组合因字符串重叠导致误判 - 有效国家过滤:通过辅助函数校验E列是否属于指定国家,排除无关数据
- 标记逻辑修正:仅当组合首次出现(添加集合成功)时标记x,重复组合不标记
- 行范围优化:基于C列获取数据最后一行,避免F列空值遗漏数据
内容的提问来源于stack exchange,提问作者vollfik
相关产品推荐
相关产品推荐

