VBA countif语句仅返回0

时间:2014-07-07 17:14:53

标签: excel vba excel-vba

我正在研究一个宏,它应该计算术语“GM”出现在一列中的次数。我决定使用countif语句,就像我以前一样,它运作良好。但是,出于某种原因,当我运行我的代码时,它每次输出0,这肯定是不正确的。我已经使用其他列和字符串运行相同的代码并且它运行良好,但出于某种原因,如果我在某个列中搜索术语“GM”,则会失败。我唯一能想到的是,countif只有在你搜索的字符串是单元格中唯一的字符串时才有效,因为在所有情况下这都是真的,代码工作正常。在这种特殊情况下,我正在寻找的字符串不是单元格中唯一的字符串,代码失败。我试图找到更多关于这是否属实的信息,但我在网上找不到任何东西。这是代码,如果有人想看看:

Function OemRequest() As Long 

Sheets("CS-CRM Raw Data").Select
Sheets("CS-CRM Raw Data").Unprotect

    Dim oem As Long
    Dim LastRow As Long
    Dim LastColumn As Long

        'Determines size of table in document
        LastRow = Range("A" & Rows.Count).End(xlUp).row
        LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column

        oem = Application.WorksheetFunction.CountIf(Range(2 & "2:" & 2 & LastRow), "gm") 

OemRequest = oem

End Function

3 个答案:

答案 0 :(得分:3)

你说的COUNTIF只会匹配整个内容为" gm"的单元格。 COUNTIF函数中的条件也会接受通配符,因此要匹配包含" gm"做:

.CountIf(Range(2 & "2:" & 2 & LastRow), "*gm*") 

<强>更新

如您所述,您的Range电话也存在问题。实际上,parens中的表达式将评估为"22:2<LastRow>"(其中<LastRow>LastRow变量的值)。

2中应该有一个包含您感兴趣的列名的变量。例如:

Dim col as String
col = "B"
... Range(col & "2:" & col & LastRow) ...

这将评估为"B2:B<LastRow>",这是您想要的。

答案 1 :(得分:0)

另一种可能性:

oem = WorksheetFunction.CountIf(Columns(LastColumn).Cells(2).Resize(rowsize:=LastRow - 1), "gm")

这将计算包含"gm"的单元格(如果需要,使用wilcards)在表格的最后一列中,第一行除外。 (它假设表左上角位于单元格"A1"

当然,如果您想计算任何其他列,您可以创建一个变量:

Dim lngCol as Long
lngCol = ...
oem = WorksheetFunction.CountIf(Columns(lngCol).Cells(2).Resize(rowsize:=LastRow - 1), "gm")

答案 2 :(得分:0)

我想这样

Sub Main()
    Application.ScreenUpdating = 0
    Dim Count As Double
    Range("C1").Activate 'Firs row in the column
    Do While ActiveCell.Value <> ""
        If InStr(ActiveCell.Value, "MyText") Then
            Count = Count + 1
        End If
        ActiveCell.Offset(1, 0).Activate
    Loop
    Application.ScreenUpdating = 1
End Sub

只有当数据单元格不为空时才会有效,如果工作表中间有空格,请执行以下操作:

Sub Main()
    Application.ScreenUpdating = 0
    Dim Count As Double
    Range("C1").Activate
    Do While ActiveCell.Row <> Rows.Count ' This wil evaluate all the rows in the 'C' Column
        If InStr(ActiveCell.Value, "MyText") Then
            Count = Count + 1
        End If
        ActiveCell.Offset(1, 0).Activate
    Loop
    Application.ScreenUpdating = 1
End Sub

希望它对你有用。