Jeff在C列中有一个包含大量文本的工作表。他想计算C列中特定字符串的出现次数,但只对数据中的奇数行(1、3、5等)进行计数。他要查找的字符串可能不是整个单元格的内容,并且可能在特定单元格中多次出现。 (如果它在一个单元格中发生2或3次,则应计为2或3次。)他想知道是否存在一种公式化的方式来执行此操作,而不求助于宏。

解决此问题的一种方法是使用帮助器列。例如,假设您可以将列D用作帮助列,并且包含数据的第一个单元格是单元格C2。 (也许单元格C1中有一个列标题。)您可以在单元格D2中使用以下公式:

=IF(MOD(ROW(),2)=1,(LEN(C2)-LEN(SUBSTITUTE(C2,"my text","")))/LEN("my text"),"")

您所需要做的就是用您要搜索的内容替换搜索字符串(“我的文字”)。两次使用LEN函数,首先查找单元格C2中所有元素的长度,然后从中减去所有“我的文本”实例被删除的文本的长度。然后,该值除以您要搜索的内容的长度,得出单元格中有多少个搜索文本实例。请注意,IF函数确保仅当该行是奇数行时才返回数字值。

您可以根据需要向下复制此公式,然后将其累加。结果是字符串出现在奇数行中的次数。

如果工作表的布局不允许您使用帮助器列,那么您可以依靠适用于数据数组的公式。

这是一个能解决问题的方法:

=SUMPRODUCT((LEN(C:C)-LEN(SUBSTITUTE(C:C,"my text","")))/LEN("my text")*ISODD(ROW(C:C)))

除了SUMPRODUCT函数在内部为C列中的每个单元格进行内部计算之外,此公式基本上与先前的公式相同。您应该意识到,由于该公式检查了所有C列,这意味着您的搜索文字(“我的文字”)出现在列中的任何非数据单元格(例如列标题)中,那么它也将包含在返回的总数中。

如果您确实决定使用宏,则可以轻松创建一个用户定义的函数,该函数检查单元格的范围并确定计数。以下是您可以使用的宏类型的示例:

Function CountInst(rSource As Range, sSearch As String, bCaseInsensitive As Boolean) As Integer     Dim c As Range     Dim iCount As Integer     Dim sTemp1 As String     Dim sTemp2 As String

sTemp2 = sSearch     If bCaseInsensitive Then sTemp2 = LCase(sTemp2)

iCount = 0

For Each c In rSource         If c.Row Mod 2 = 1 Then             sTemp1 = c.Text             If bCaseInsensitive Then sTemp1 = LCase(sTemp1)



iCount = iCount + (Len(sTemp1) - _               Len(Replace(sTemp1, sTemp2, ""))) / Len(sTemp2)

End If     Next c

CountInst = iCount End Function

要使用此功能,您所需要做的就是提供一个范围,要搜索的内容以及是否要使匹配不区分大小写。例如,如果要搜索“我的文字”而大小写无关紧要,则可以使用以下命令:

=CountInst(C2:C99,"my text",TRUE)

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(1514)适用于Microsoft Excel 2007、2010、2013和2016。