计算列

时间:2017-08-11 12:44:29

标签: excel count offset

我有一个包含多个工作表的工作簿:

(a)有一个工作表列出了一系列文件名(称为“摘要”)。此工作表还包括一年中每个月的列(JAN,FEB,MAR等),以记录该月份访问文件名的次数。

(b)每年的都有一个工作表(JAN,FEB,MAR等)。这些工作表包含一个数据转储,该数据转储是指当月访问工作表(a)中的文件名的次数。它们包括文件名用户名访问日期列。每次访问文件名时都会创建一个新行。

目标:我想计算工作表(a)上文件名出现在工作表(b)上的次数。因此,如果FilenameX在1月份被访问了20次,我想返回该月的20个计数。

我还想要计算工作表(a)上的文件名出现在工作表(b)上的公式/自定义函数是通用的,这样它就可以计算所有日历月而无需更新。

问题:如果Joe Bloggs和他的妹妹Jenny Bloggs在本月的同一天,即1月1日和1月31日访问FilenameX,则会在工作表b上显示四条记录:

- Joe Bloggs, FilenameX, 1st January 2017
- Jenny Bloggs, FilenameX, 1st January 2017
- Joe Bloggs, FilenameX, 31st January 2017
- Jenny Bloggs, FilenameX, 31st January 2017

但是我只想计算当月访问FilenameX的唯一日期。因此,在2017年1月1日和2017年1月31日,即2。

尝试解决方案:我可以使用COUNTIF正确返回工作表(b)上工作表(a)上的FilenameX出现的次数。这是一个通用公式,无需更新即可计算所有月份,但不会处理重复项:

=COUNTIF(OFFSET(INDIRECT("'"&I$1&"'!$A$1"),0,0,COUNTA(INDIRECT("'"&I$1&"'!$D:$D")),1),'Summary'!$F5)

尝试更新(尝试使用的解决方案):在尝试计算唯一日期值时,我尝试通过合并示例公式来调整上述公式我在exceljet.com上找到了:

=SUMPRODUCT(1/COUNTIF(data,data&""))

然而,不幸的是,这会崩溃Excel!

灯泡时刻(感谢Scott!):我想要的可能需要VBA自定义功能,因此在搜索后我遇到了以下代码:user2362937 @ Function to count distinct values in a column range

Option Explicit

Public Function CountDistinct(r As Range) As Long

  Dim col As Collection
  Dim arr As Variant
  Dim x As Long
  Dim y As Long

  Set col = New Collection

  arr = r

  On Error Resume Next

    For x = 1 To UBound(arr, 1)
      For y = 1 To UBound(arr, 2)
        col.Add 0, CStr(arr(x, y))
      Next
    Next

  On Error GoTo 0

  CountDistinct = col.Count

  Set col = Nothing
  Set arr = Nothing
  Set r = Nothing
End Function

此函数将计算我传递给它的任何范围内的不同值。例如,如果我想计算工作表 JAN 日期访问(D列)中的唯一值,我可以按如下方式调用该函数:

=CountDistinct(INDIRECT("'"&I$1&"'!$D$1:$D$55"))

它将返回正确的值。

然而(2的第1部分):为了使它工作,我需要硬编码传递给函数的范围,在本例中为D1:D55。相反,我需要动态增加或减少范围(即 $ D:$ D 尝试的解决方案上面)。

但是(2的第2部分):我还想返回一个计数,其中工作表(a)上的文件名与工作表(b)上的文件名匹配,否则我想表示“在工作表(a)的单元格中找不到“或”N / A“通知。我不知道如果在工作表(b)上找到匹配的文件名,如何调用该函数并执行count

0 个答案:

没有答案