2016-08-01 2 views
0

나는 현재의 능력을 뛰어 넘는 나의 프로젝트를위한 목표를 가지고 있지만 여기 누군가가 나를 올바른 길로 인도 할 수 있기를 바랍니다.깃발 표시된 셀을 개별적으로 걷기

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

나는 사양을 작성하고 VBA 전문가가 당신을 위해 업데이트를 할애하는데 돈을 쓰는 것이 좋겠지 만 가능한 일이지만 많은 일이 복잡 할 수 있습니다. 나는 당신이 각 오류에 대한 링크를 담고있는 새로운 시트가 필요하다고 생각한다. –

답변

3

다음은 요구 사항을 처리하는 데 사용할 수있는 방법입니다.

먼저 오류 수를 유지하는 대신 셀 위치에 대한 참조를 보유하는 Dictionary 개체를 보유 할 수 있습니다. 이 객체를 사용하여 오류, 위치 등 총 개수를 검사 할 수 있습니다.

아래에서 (상대적으로 간단한) 구현을 보여 드리겠습니다. (Dictionary 개체에 익숙하지 않은 경우 조사를 해보십시오 기본적으로 고유 키와 해당 값을 보유하고 있습니다). 필자의 경우 오류 셀의 주소를 키로 저장하기로 결정했으며 방금 빈 문자열을 값으로 저장했습니다.

먼저 오류를 포함하는 사전 개체를 반환하는 함수를 작성했습니다. 간단한 구현에서는 고정 범위가 있으며 'Abc'라는 텍스트가있는 셀의 주소에 저장했습니다.

다음으로 개체 수의 개수를 반환하는 도우미 함수를 작성했습니다.이 함수는 도우미 함수가 필요하지 않을 정도로 간단하지만 여러 번 호출하거나 추가 할 경우 단순화 할 수 있습니다. 보다 맞춤화 된 로직).

마지막으로 두 가지 서브 루틴은 최종 요구 사항을 수행합니다. 즉, 오류를 탐색합니다. 첫 번째 루틴 '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 
+0

와우! 이것은 엄청나게 복잡합니다! 적어도 내 눈에는. 좀 더 이해하고 다시 연락하도록하겠습니다. 나는 그것을 구현하려고 시도하고 그것이 어떻게되는지 알려줄 것이다. 고맙습니다! @ –

+0

@CodingNovice 문제 없습니다. 실제로보다 더 위압적 인 것처럼 보이므로 조각으로 나누면 꽤 괜찮은 것 같아요. 'Dictionary' 객체의 작동 방식을 공부하는 데 시간을 할애하면 도움이 될 것입니다. – user3561813

+0

그래서 나는 이것을 들여다 보았다. 나는 이것이 올바른 방법임을 확신한다. 사전 객체를 사용하면이 코드가 매우 강력해질 것입니다. 나는이 프로젝트를 두 부분으로 나누기로 결정했다. 먼저 하이퍼 링크를 다른 시트로 복사하여 빠른 솔루션을 얻은 다음 교육이 끝나면 사전 항목을 사용하여 개선하십시오. –