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

时间:2018-03-09 19:54:02

标签: excel vba excel-vba for-loop user-defined-functions

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

Ex:鉴于“质量”和“立即到期”,我想计算在每个工作表的表的给定列中,此组合的实例有多少“质量:立即到期”。然后,总计应该在初始工作表(这是一个摘要页面)上以整数形式输出,其中函数在特定单元格中被调用。

我在一些事情上四处寻求帮助,但我的功能上一直出现“#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,然后循环我的其余部分工作表,直到我得到最终计数。然后,将最终计数报告为我的函数的返回值。

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

这根本不健全,但我只是修复了最初的事情。您可能希望添加适当的错误处理来处理不存在的表作为其他事项的示例。

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