如何在VBA中按列S条件计数并排除列R含PC的行
VBA统计指定关键词并排除特定行的解决方案
原代码仅通过CountIf累加S列含指定关键词的单元格数量,未过滤对应R列为"PC"的行,导致统计结果包含不符合要求的行。以下是两种修正方案:
方案一:循环遍历逐行检查(逻辑直观)
通过遍历目标区域的每个单元格,先判断对应R列是否不为"PC",再检查S列是否包含任一关键词,符合条件则计数:
Dim ws As Worksheet Dim cell As Range Dim result As Long Dim keywords As Variant Set ws = ThisWorkbook.Worksheets("mapa_cargas") keywords = Array("PO", "DESCARREGA", "VAZIOS", "VASILHAME HNK") result = 0 For Each cell In ws.Range("S2:S200") ' 排除R列为"PC"的行 If ws.Cells(cell.Row, "R").Value <> "PC" Then ' 检查当前单元格是否包含任一关键词 Dim key As Variant For Each key In keywords ' vbTextCompare 忽略大小写,若需严格区分可改为vbBinaryCompare If InStr(1, cell.Value, key, vbTextCompare) > 0 Then result = result + 1 Exit For ' 找到匹配关键词即跳出内层循环,避免重复计数 End If Next key End If Next cell ThisWorkbook.Worksheets("indicadores").Cells(4, 4).Value = result
方案二:使用SUMPRODUCT函数(代码简洁高效)
利用Excel的SUMPRODUCT函数同时处理多条件过滤,无需循环,执行效率更高:
Dim ws As Worksheet Dim result As Long Set ws = ThisWorkbook.Worksheets("mapa_cargas") result = WorksheetFunction.SumProduct( _ --(ws.Range("R2:R200").Value <> "PC"), _ --( _ InStr(ws.Range("S2:S200").Value, "PO") > 0 _ Or InStr(ws.Range("S2:S200").Value, "DESCARREGA") > 0 _ Or InStr(ws.Range("S2:S200").Value, "VAZIOS") > 0 _ Or InStr(ws.Range("S2:S200").Value, "VASILHAME HNK") > 0 _ ) _ ) ThisWorkbook.Worksheets("indicadores").Cells(4, 4).Value = result
原代码问题说明
原代码仅统计了S列包含指定关键词的单元格总数,未对R列的"PC"行做过滤,因此结果中包含了4条不符合要求的记录(10-6=4),修正后即可得到期望的6条统计结果。
内容的提问来源于stack exchange,提问作者André Lopes
相关产品推荐
相关产品推荐

