如何修改Excel宏:基于字符串匹配加特殊编号条件更新单元格值
修改Excel宏以添加特殊编号条件
当前宏功能
现有Excel宏实现的功能:当同一行的「描述」单元格与「在售物料列表」中的任意字符串存在部分匹配时,将「在售状态」列的值从“0”改为“1”。
原有示例表格
| 物料编号 | 描述 | 在售状态 |
|---|---|---|
| 123 | Apple | 1 |
| 456 | Orange (Sale) | 1 |
| 456 | Orange | 0 |
| 789 | Banana | 1 |
在售物料列表
| 在售物料列表 |
|---|
| Apple |
| Banana |
| Sale |
当前宏代码
Option Explicit Sub ChangeBool() Dim i As Long, j As Long Dim arrData, arrDataF, rngData As Range, rngDataF As Range Set rngData = ActiveSheet.Range("B2").CurrentRegion Set rngDataF = ActiveSheet.Range("F2").CurrentRegion arrData = rngData.Value arrDataF = rngDataF.Value For i = LBound(arrData) + 1 To UBound(arrData) arrData(i, 3) = 0 For j = LBound(arrDataF) + 1 To UBound(arrDataF) If InStr(1, arrData(i, 2), arrDataF(j, 1), vbTextCompare) > 0 Then arrData(i, 3) = 1 Exit For End If Next j Next i rngData.Value = arrData End Sub
新增需求
需要添加额外条件:若该行存在特殊编号(即「特殊编号」单元格不为空),则「描述」中必须包含“Sale”,才能将「在售状态」列设为“1”。
新增条件后的示例表格
| 物料编号 | 特殊编号 | 描述 | 在售状态 |
|---|---|---|---|
| 123 | Apple | 1 | |
| 456 | 111 | Special Apple | 0 |
| 789 | Orange | 0 | |
| 010 | 222 | Special Orange (Sale) | 1 |
| 011 | Banana | 1 |
在售物料列表(无变化)
| 在售物料列表 |
|---|
| Apple |
| Banana |
| Sale |
修改后的宏代码
Option Explicit Sub ChangeBool() Dim i As Long, j As Long Dim arrData, arrDataF, rngData As Range, rngDataF As Range Dim hasSpecialCode As Boolean Dim hasSaleMatch As Boolean ' 调整数据区域:现在包含物料编号、特殊编号、描述、在售状态列 Set rngData = ActiveSheet.Range("A2").CurrentRegion Set rngDataF = ActiveSheet.Range("F2").CurrentRegion arrData = rngData.Value arrDataF = rngDataF.Value For i = LBound(arrData) + 1 To UBound(arrData) arrData(i, 4) = 0 ' 在售状态列现在是第4列 hasSpecialCode = False hasSaleMatch = False ' 判断是否存在特殊编号 If Trim(arrData(i, 2)) <> "" Then hasSpecialCode = True End If ' 遍历在售物料列表,检查匹配 For j = LBound(arrDataF) + 1 To UBound(arrDataF) If InStr(1, arrData(i, 3), arrDataF(j, 1), vbTextCompare) > 0 Then ' 如果是特殊编号行,必须匹配到Sale才生效 If hasSpecialCode Then If arrDataF(j, 1) = "Sale" Then hasSaleMatch = True End If Else ' 非特殊编号行,匹配任意列表项即可设为1 arrData(i, 4) = 1 Exit For End If End If Next j ' 特殊编号行且匹配到Sale,设为1 If hasSpecialCode And hasSaleMatch Then arrData(i, 4) = 1 End If Next i rngData.Value = arrData End Sub
修改说明
- 数据区域调整:原宏从
B2开始,现在改为从A2开始,确保包含新增的「特殊编号」列。 - 列索引调整:「在售状态」从原来的第3列变为第4列,对应代码中
arrData(i, 4)。 - 新增状态变量:
hasSpecialCode标记当前行是否有特殊编号,hasSaleMatch标记特殊编号行是否匹配到“Sale”。 - 逻辑分支处理:
- 无特殊编号的行:保持原有逻辑,匹配任意在售列表项即设为1。
- 有特殊编号的行:只有当描述中包含“Sale”时,才将在售状态设为1,匹配其他列表项不生效。
内容的提问来源于stack exchange,提问作者Jacob Baker
相关产品推荐
相关产品推荐

