You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:45:32