我有一个包含多个工作表的工作簿:
(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 。