【问题标题】:Search errors, populate an array and present a pivot like view搜索错误,填充数组并呈现类似于视图的枢轴
【发布时间】:2019-12-25 11:20:36
【问题描述】:

我的代码可以在工作表中搜索错误并将单元格地址和错误放在单独的工作表中。

Set RErrors = Nothing
On Error Resume Next
Set RErrors = Sheets("Sheet1").ListObjects("Table").Range.SpecialCells(xlCellTypeFormulas, 16)
On Error GoTo 0
Counter = 0
If Not RErrors Is Nothing Then
    Workbooks(Different_Workbook).Sheets(Different_Sheet).Activate
    For Each x In RErrors
        ActiveSheet.Range("A1").Offset(Counter, 0).Formula = x.Address
        ActiveSheet.Range("B1").Offset(Counter, 0) = x
        x.ClearContents
        Counter = Counter + 1
    Next x
End If

代码正在运行,但我打算将所有错误单元格地址和相应的错误填充到一个二维数组中,并为每种错误类型和单元格数量呈现一个透视视图。

我面临两个问题--

  1. 当我不知道错误的数量时如何初始化数组(并且没有 Dim,我无法填充)?也许这意味着运行一个循环首先找到所有错误然后得到错误的总和然后 Dim 然后再次循环来填充错误数组,所以两个循环一件事?

  2. 如何操作错误(和位置)填充数组以获得显示每种错误类型有多少个单元格的结果(如枢轴)?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    对于数组的初始化,你不知道其中的项目数,使用RedimRedim MS Documentation.

    但是,阅读问题的目的似乎是对错误数量进行某种总结。让我们考虑以下错误:

    来自以下代码:

    Sub PopulateErrors()
    
        Dim myCell As Range
        With Worksheets(1)
            For Each myCell In .Range("A1:A5")
                myCell.Formula = "=0 / 0"
            Next myCell
    
            For Each myCell In .Range("B1:B2")
                myCell.Formula = "=nonexistingformula()"
            Next myCell
    
            For Each myCell In .Range("C1:C3")
                myCell.Formula = "=4+""ky"""
            Next myCell
        End With
    
    End Sub
    

    这些可以用dictionary object 总结如下:

    Sub ErrorDataSummary()
    
        Dim myCell As Range
        Dim myDict As Object
    
        Set myDict = CreateObject("Scripting.Dictionary")
    
    
        For Each myCell In Worksheets(1).Range("A1:C5")
            If IsError(myCell) Then
                If myDict.exists(myCell.Text) Then
                    myDict(myCell.Text) = myDict(myCell.Text) + 1
                Else
                    myDict(myCell.Text) = 1
                End If
            End If
        Next myCell
    
        Dim myKey As Variant
        For Each myKey In myDict.keys
            Debug.Print myKey; myDict(myKey)
        Next
    
    End Sub
    

    运行代码,得到如下总结:

    【讨论】:

    • 感谢 Vityata 用字典展示解决方案...尚未用我的代码尝试过,但也许它肯定会起作用,只是一个问题,使用 ReDim 时,数组的填充也必须下降在我们 Redimmed 之后,我的意思是首先 Dim,然后是一个循环来计算所有错误,然后是 ReDim,然后是一个循环来填充数组。 ReDim 必须在填充数组之前出现。所以 ReDim 无济于事。如有错误请指正。当然,您展示的方法不需要这些。
    • @Repairer - 欢迎您。考虑到 redim,它应该在一个循环中(但这通常不是最佳的)。 stackoverflow.com/questions/39827849/redim-preserve-in-for-loop
    • 另一个建议是通过特殊单元格并避免可能不包含错误的单元格上的循环。不过答案很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2018-06-05
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多