我的项目有一个超出我现有能力的伸展目标,但我希望有人可以让我走上正轨。我有以下代码:
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”的每个单元格。我的工作簿中有数千个单元要管理,因此能够在审核时跳转到错误会很棒。如果可以用键盘上的一个键完成它会更好,但按钮也可以工作。
关于如何执行此类操作的任何想法?还有,难度级别?有关此类功能的起点的任何资源?最后一个问题:我可以编写使用的任何本机功能都不需要硬编码吗?
答案 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