单独穿过标记的细胞

时间:2016-08-01 14:45:39

标签: excel vba excel-vba

我的项目有一个超出我现有能力的伸展目标,但我希望有人可以让我走上正轨。我有以下代码:

Public ErrorCount As Integer

Sub GeneralFormat()
    ErrorCount = 0
    VLookup
    MacroFillAreas
    color
    NonZeroCompare
    MustBe
    MsgBox ("Number of Errors" & CStr(ErrorCount))
End Sub

我还有以下代码部分:

Sub NonZeroCompare()
Dim i As Long
For i = 5 To 1000 Step 1
    If Range("AK" & i).Value = "On" Then
        If Range("AL" & i).Value = 0 And Range("AM" & i).Value = 0 Then
            Range("AL" & i, "AM" & i).Interior.ColorIndex = 6
            ErrorCount = ErrorCount + 1
        End If
    ElseIf Range("BC" & i).Value = 0 And Range("BD" & i).Value = 0 Then
        Range("BC" & i, "BD" & i).Interior.ColorIndex = 6
        ErrorCount = ErrorCount + 1
    ElseIf Range("EJ" & i).Value = "On" Then
        If Range("EK" & i).Value = 0 And Range("EL" & i).Value = 0 Then
            Range("EK" & i, "EL" & i).Interior.ColorIndex = 6
            ErrorCount = ErrorCount + 1
        End If
    ElseIf Range("ES" & i).Value = 0 And Range("ET" & i).Value = 0 Then
        Range("ES" & i, "ET" & i).Interior.ColorIndex = 6
        ErrorCount = ErrorCount + 1
    ElseIf Range("FG" & i).Value = 0 And Range("FH" & i).Value = 0 Then
        Range("FG" & i, "FH" & i).Interior.ColorIndex = 6
        ErrorCount = ErrorCount + 1
    End If
Next i
End Sub

我希望的效果是让用户能够跳转到有助于“ErrorCount”的每个单元格。我的工作簿中有数千个单元要管理,因此能够在审核时跳转到错误会很棒。如果可以用键盘上的一个键完成它会更好,但按钮也可以工作。

关于如何执行此类操作的任何想法?还有,难度级别?有关此类功能的起点的任何资源?最后一个问题:我可以编写使用的任何本机功能都不需要硬编码吗?

1 个答案:

答案 0 :(得分:3)

这是一种可以帮助您处理需求的方法。

首先,我们可以保留一个Dictionary对象来保存对单元格位置的引用,而不是只保留错误数量的计数。然后,我们可以使用此对象检查错误,位置等的总数。

我将在下面展示一个(相对简单的)实现。 (如果您不熟悉Dictionary个对象,请做一些研究。基本上,它拥有唯一的密钥和相应的值)。在我的例子中,我选择将错误单元格的地址存储为键,我只是存储了一个空白字符串作为值。

首先,我编写了一个函数来返回包含错误的字典对象。在简单的实现中,我有一个固定的范围,我存储在任何有文本' Abc'

的单元格的地址中。

接下来,我编写了一个辅助函数,它返回了一个对象数量的计数(这很简单,你不需要帮助函数,但是如果进行多次调用或者你会添加更多自定义逻辑。)

最后,两个子程序完成最终的req:遍历错误。第一个例程' TraverseErrors goes through the dictionary and "visits" each of the addresses. This then yields to a DoEvents call which allows the user to do what they need to. The JumpAhead`例程告诉系统用户已完成。

将键盘快捷键附加到JumpAhead方法很有帮助。为此,在Excel工作簿中,按ALT + F8打开宏窗口。选择JumpAhead例程,然后单击对话框中的Options按钮。这允许您输入一个字母,当与CTRL键一起按下时,运行宏。 (我选择了字母e,所以CTRL + e允许我在我做出更改后继续前进。)

需要考虑一些挑战。例如,我的单元格地址没有参考表。因此,如果此宏切换工作表,您可能会遇到一些麻烦。

让我知道任何问题。

Dim oDictCellsWithErrors As Object
Dim bContinue As Boolean

Private Function GetErrorsDict() As Object
    Dim rData As Range
    Dim rIterator As Range

    'This helper function returns the dictionary object containing the errors
    'If it's already been populated
    'If not, it creates then returns the object

    If Not oDictCellsWithErrors Is Nothing Then
        Set GetErrorsDict = oDictCellsWithErrors
        Exit Function
    End If

    'Some logic to create a dictionary of errors
    'In my case, I'm adding all cells that have the text "Abc"
    'Your logic should differ

    Set rData = Sheet1.Range("A2:A15")
    Set oDictCellsWithErrors = CreateObject("Scripting.Dictionary")

    For Each rIterator In rData
        If rIterator.Value = "Abc" Then
            If Not oDictCellsWithErrors.exists(rIterator.Address) Then
                oDictCellsWithErrors(rIterator.Address) = ""
            End If
        End If
    Next rIterator

    Set GetErrorsDict = oDictCellsWithErrors
End Function

Private Function CountErrors() As Integer
    'This function returns the number of errors in the document
    CountErrors = GetErrorsDict().Count
End Function

Sub TraverseErrors()
    Dim oDict As Object
    Dim sKey As Variant

    Set oDict = GetErrorsDict()

    For Each sKey In oDict.keys
        bContinue = False
        Sheet1.Range(sKey).Activate

        Do Until bContinue
            DoEvents
        Loop
    Next sKey

    MsgBox "No more errors"
End Sub

Sub JumpAhead()
    bContinue = True
End Sub