【问题标题】:MS Excel: Count frequency of similar values in between blank cellsMS Excel:计算空白单元格之间相似值的频率
【发布时间】:2014-09-02 21:49:47
【问题描述】:

我想计算连续相同值的频率。该值必须至少占据两个单元格,并且必须彼此相邻。

我想在这里发布图片,但我没有足够的声誉。无论如何,截图可以在这里找到:https://www.dropbox.com/s/1em9ltssc1ruw0u/stackOverflow_excelIssue_Countfrequencyofsimilarvaluesinbetweenblankcells.jpg?dl=0

J7:BE7 是人们输入值的地方 - 它对应于时间,以 30 分钟为增量。

在同一张表的不同部分,在这种情况下,DD7:EY7 是我运行公式的地方。

这个公式在(第一列)DD7 -- COUNTIF(J7:$BE7,J7)

这个公式在(最后一列)EY7 -- COUNTIF(BE7:$BE7,BE7)

DD7 上的公式计算 J7 上的值出现在第 7 行从 J 列到 BE 的次数。

场景 1:如果“橙色”仅出现一次,则此公式非常有效。以我的 K7:L7 为例。

场景 2:问题是当“橙色”再次出现在非连续单元格上时。我的意思是,“橙色”出现在 K7:L7 上,然后又出现在 P7:Q7 上。

在场景 1 中,公式检查 K7:L7 的结果是 2,这是期望的值。

在场景 2 中,公式检查 K7:L7 的结果是 4,因为它还会计算出现在 K7:L7 上的“橙色”。

我希望如果 M7 具有不同的值,计数将停止。 K7:L7 包含“橙色”,M7:N7 包含“苹果”。或者如果中间有一个空单元格,则计数将停止,例如 U7:V7 包含“guava”,而 T7 为空,则 X7:Y7 再次包含“guava”。

水果可能占据每行两到四十八列。

我知道这很罗嗦,但我找不到其他方式来解释它,英语不是我的母语。

先谢谢你了。

~标记

【问题讨论】:

  • 您需要提供更好的数据输入和所需输出示例。由于您的屏幕截图上没有单元格引用,也没有指示所需的结果,您将依赖人们猜测您真正想要的内容。请阅读帮助主题,了解如何提出好问题以及如何提供示例。

标签: excel frequency countif


【解决方案1】:

我同意这个问题的措辞可以更好一些,但我想我明白你在寻找什么。我想不出使用内置 Excel 函数的好方法,但是如果您愿意稍微使用 VBA,您可以制作一个可以像普通函数一样使用的自定义函数在 Excel 中。你只需要在一个新模块中添加这样的东西:

Public Function NumInARow(r As Range) As Variant
Dim i As Integer
If r.Value = "" Or r.Value = Empty Then
    NumInARow = ""
    Exit Function
End If
If r.Column > 1 Then
    If r.Offset(0, -1).Value = r.Value Then
        NumInARow = ""
        Exit Function
    End If
End If
i = 1
Do While r.Offset(0, i).Value = r.Value
    i = i + 1
Loop
NumInARow = i
End Function

此函数查看您作为参数传递的单元格,并查看右侧的单元格,直到找到不同的单元格并计算遇到的相同单元格的数量。例如,如果单元格 A1-C1 都显示“Bob”,而 D1 为空白或具有不同的值,那么如果您在单元格 A2 中输入 =NumInARow(A1),则 A2 将显示值 3。您可以将该公式沿整个细胞。如果它正在查看的单元格不是序列中的第一个单元格,或者它正在查看的单元格是空白的,则该公式将单元格留空。例如,如果您在上述场景中将=NumInARow(B1) 放入单元格 B2,则 B2 将显示为空白,因为第二个“Bob”不是序列中的第一个。我希望其他人可以想出一种使用内置 Excel 函数的方法,但这可能是您的一个选择。这是一篇 WikiHow 文章,向您展示如何制作/在何处放置用户定义的函数。如果你已经有代码,那就很简单了。

http://www.wikihow.com/Create-a-User-Defined-Function-in-Microsoft-Excel

【讨论】:

  • 谢谢。我今天晚些时候会试试这个。我希望有一个非 VBA 解决方案,但如果没有别的,那就是 VBA。 =) 我会告诉你进展如何。
  • 这正是我想要的结果。非常感谢你!你很有帮助。我你住在菲律宾马尼拉附​​近,我给你买啤酒。
  • 一个大问题,如果第 1 行更改(添加或删除值),第 2 行(numinarow 公式)不会更新 - 除非我再次复制并粘贴公式。如果对第 1 行执行任何更新,我需要更新第 2 行。在我的项目中,用户将从 J:BE 列中输入值,而 numinarow(您的公式)在同一行,但 DD:EY 列不同。
  • 是的,这是个问题。抱歉,但我认为您将不得不再次使用一点 VBA 来修复它。这是您可以解决的方法。打开 Visual Basic 编辑器。如果您为自定义公式插入了一个新模块,您将在左侧看到工作表对象、工作簿对象以及可能的 Module1 对象。下一步将取决于您是否希望整个工作簿在每次发生变化时重新计算所有内容,或者您​​是否只有一个工作表需要重新计算。
  • 假设您希望在任何更改后更新整个工作簿。双击“ThisWorkbook”对象。您会在顶部看到 2 个下拉菜单。左边的应该说“(General)”,右边的应该说“(Declarations)”。单击“(常规)”下拉菜单并选择“工作簿”。可能会出现 Private Sub 声明。现在单击“(声明)”下拉菜单并选择“SheetChange”。现在一个新的声明应该出现在编辑器中,如下所示:`Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) ... End Sub.
【解决方案2】:

我接受的答案 - 使用公式 - 来自 superuser.com 的 G-Man

可以在此链接上找到该线程:

MS Excel:计算空白单元格之间相似值的频率 https://superuser.com/questions/806427/ms-excel-count-frequency-of-similar-values-in-between-blank-cells


这是他的话的逐字记录:


如果我正确理解您的要求,以下公式将有效。我的解决方案需要一个虚拟列和一个辅助行,但它们可以被隐藏。此外,您可以通过一些工作来消除虚拟列,并且可以将辅助行放在任何地方。

我假设您的客户姓名在第 2 行。我将使用 A 列作为虚拟列,因此约会数据从 B 列开始。第 3 行将是辅助行。在 B3 单元格中,输入公式:

=IF(B2="", "", IF(B2C2, 1, C3+1))

意思:

如果 B2="",则此时隙的客户端名称为空白,因此这是一个空闲时隙,因此显示为空白。 否则,如果 B2C2,这个时间段和下一个时间段有不同的客户(C2 可能是也可能不是空白),所以这是这次约会的最后一个时间段。将其表示为 1。否则,倒数,因此该约会的倒数第二个时隙为 2,倒数第三个时隙为 3,以此类推。 在单元格 B4 中,输入:

=IF(A2B2, B3, "")

如果A2B2,这个时间段和前一个时间段有不同的客户(A2可能是也可能不是空白),所以这是这次约会的第一个时间段。显示 B3,显示此约会中有多少个时隙(半小时)。否则,显示空白。

你可以在我提供的链接上找到更多他的答案。

感谢大家的帮助。

最好的问候,

~标记

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多