工作表循环用户定义的功能故障

Posted

技术标签:

【中文标题】工作表循环用户定义的功能故障【英文标题】:Worksheet Looping User-Defined Function Malfunction 【发布时间】:2018-03-09 19:54:02 【问题描述】:

我正在一个包含多个选项卡的工作簿上用 Excel 编写一些 VBA 代码,其中大部分都包含一个表格。我正在创建一个用户定义的函数来计算每个工作表上单个列中给定输入组合(两个输入)的所有实例。我意识到可能有一个非 vba 解决方法,但我希望在进行更新时尽可能少地手动操作此工作簿。目前它不包含很多单元格,但它可能会向前发展。

例如:给定“质量”和“立即到期”,我想计算在每个工作表的给定列中存在多少作为“质量:立即到期”的这种组合的实例。然后,应在特定单元格中调用函数的初始工作表(即摘要页面)上将总数作为整数输出。

我在一些事情上四处寻找帮助,但我的函数不断收到“#VALUE”错误,我目前无法弄清楚。我对 VBA 还是较新,所以如果我做了一些愚蠢的事情,请给我一些解释。我会很感激的!

这是我的模块:

Function StatusCounterByDepartment(Department As String, Status As String)
    Dim Counter As Integer: Counter = 0

    For i = 2 To ThisWorkbook.Sheets.Count
        ThisWorkbook.Sheets(i).Activate
        For j = 2 To ActiveSheet.ListObjects(1).Rows.Count
            If (ActiveSheet.Range("H" & j).Value = Department & ": " & Status) Then
                Counter = Counter + 1
            End If
        Next j
    Next i

    StatusCounterByDepartment = Counter
End Function

我的思考过程是循环浏览给定的列,直到该列的长度结束,评估它是否符合我的标准,为活动工作表中的每个实例添加 1 到我的计数器,然后循环浏览我的其余部分工作表,直到我得到最终计数。然后,将最终计数报告为我的函数的返回值。

感谢您提供的任何帮助!

【问题讨论】:

请同时发布您的数据样本 为什么不使用 countif()? 今天晚些时候我会尝试发布一个样本集。我意识到我可以使用“COUNTIFS()”作为我的问题的解决方案,但是如果工作簿发生更改,我将不得不返回并手动调整每个公式,我不想这样做。我试图通过允许在不编辑任何公式的情况下尽可能地添加和编辑工作表来使工作表尽可能地成为虚拟证明。 除了我之前的评论,我还想借此机会扩展我的 VBA 知识。 【参考方案1】:

这根本不可靠,但我只是在修复最初的东西。您可能希望添加适当的错误处理来处理不存在的表作为附加操作的示例。

Public Sub count()

MsgBox StatusCounterByDepartment("Quality", "Due Immediately")

End Sub

Public Function StatusCounterByDepartment(ByVal Department As String, ByVal Status As String) As Long
    Dim Counter As Long
    Counter = 0

    For i = 2 To ThisWorkbook.Sheets.count

       With ThisWorkbook.Sheets(i)

           On Error Resume Next

           For j = 2 To (1 + .ListObjects(1).DataBodyRange.Rows.count)

               If (.Range("H" & j).Value = Department & ": " & Status) Then
                   Counter = Counter + 1
               End If

           Next j

           On Error GoTo 0

        End With

    Next i

    StatusCounterByDepartment = Counter
End Function

【讨论】:

感谢您的回复。我还有几个后续问题:将顶部函数包含在 MsgBox 输出中的目的是什么?我希望函数的结果简单地返回调用函数的单元格中的数字,以便在输入新数据时自动更新它。我不需要将某些工作表等声明为“活动”吗?我看到您直接使用它们而不是声明它们处于活动状态。我确实喜欢您对 (1+ ListObjects(1).DataBodyRange.Rows.count) 的简化,我觉得这更优雅。此外,“With”似乎也有帮助。 你不需要***潜艇。这是出于演示目的。你可以直接作为 Udf 函数使用。一般不用说active;用名称完全限定您希望使用的工作表会更安全。 With 语句意味着您不需要激活。它更有效,因为您可以使用所需的工作表而无需激活它。 我最后做了你的调整,它解决了我的问题。我不确定我的 UDF 卡在哪里,但我终于得到了我应该得到的数字。感谢您的帮助和解释!

以上是关于工作表循环用户定义的功能故障的主要内容,如果未能解决你的问题,请参考以下文章

从同一工作簿中的另一个工作表读取数据的用户定义函数

Excel VBA:For循环扫描一组工作表

Excel VBA 用户定义函数:在工作表函数中获取单元格被调用

循环通过排除指定工作表的工作表

如何使用物联网低代码平台进行工作表管理?

允许用户打印受保护的工作表