2017-05-08 4 views
1

다음과 같은 Sub가 있습니다. 범위가 88 셀 미만인 경우 제대로 작동합니다. 그렇지 않으면 88 번째 반복이 실패합니다.VBA 루프가 88 번째 반복에서 실패합니다.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

If Target.Count = 1 And Target.Row >= 3 And Target.Row <= 30 And Target.Column >= 17 And Target.Column < 22 Then 

    i = Target.Row 

    Dim MergeGroups As Range 
    Dim GroupTable As Range 
    Dim rngStart As Range 
    Dim rngEnd As Range 
    Dim rngToCount As Range 
    Dim CurrentGrp As Range 
    Dim NextGrp As Range 
    Dim NumVals As Integer 

    Set MergeGroups = Range("A1:O1") 
    Set GroupTable = Range("Q2:V2") 
    Set CurrentGrp = Range(Cells(GroupTable.Row, ActiveCell.Column).Address) 
    Set NextGrp = Range(Cells(GroupTable.Row, ActiveCell.Column + 1).Address) 
    Set rngStart = MergeGroups.Find(CurrentGrp.Value) 
    Set rngEnd = MergeGroups.Find(NextGrp.Value) 

    Set rngToCount = Range(Cells(ActiveCell.Row, rngStart.Column), Cells(ActiveCell.Row, rngEnd.Column - 1)) 
    ' rngToCount.Font.Bold = True 

    NumVals = Application.WorksheetFunction.CountA(rngToCount) 

    Cells(i, ActiveCell.Column).Value = NumVals 
    ActiveCell.Offset(1, 0).Select 
    Do While ActiveCell.Column < 21 
     ActiveCell.Offset(-28, 1).Select 
    Loop  

End If 

End Sub 

IT는 SelectionChange 이벤트를 활용, 하나의 특정 워크 시트의 개체입니다. 실패하면 다음과 같은 오류 메시지가 나타납니다.

런타임 오류 '-2147417848 (80010108)': 'Range'개체의 '찾기'메서드가 실패했습니다.

문제는 라인이다 :

Set rngStart = MergeGroups.Find(CurrentGrp.Value) 

사람이 하위 특정 반복 주위에 실패, 그렇지 않으면 작은 범위에 대해 잘 실행,하지만 왜 내가 운동 도와 드릴까요?

+4

루프에서 다른 셀을 선택할 때마다 동일한 하위가 호출됩니다. 선택을 사용하지 않고이 작업을 수행하는 방법을 파악하거나 루프를 수행하는 동안 이벤트를 사용하지 않도록 설정하고 하위를 종료하기 전에 사용하도록 설정해야합니다. –

+0

@ Mat'sMug에 많은 감사를드립니다! 나는 그 대답을 완전히 이해하지 못했다고 고백해야하지만, 그것은 올바른 방향으로 나를 설정했다 - [이 링크] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in- excel-vba-macros)는 도움이되었습니다. 왜냐하면'.Select'에 대해 무엇이 그렇게 악한지 이해할 수 없었기 때문입니다. 이제는 제대로 작동한다고 생각합니다. 제대로 테스트 한 즉시 여기에 새 코드를 게시 할 것입니다. – rngeta453

답변

0

무엇이 잘못되었는지를 알려주는 @ Mat 's 머그잔에 신용하고, 내게 올바르게 맞추어 줄 수 있도록 this Q&A을 제공합니다. 이것은 수정 된 코드입니다.

Sub PleaseWorkThisTime() 

Dim MergeGroups As Range 
Dim GroupTable As Range 
Dim GrpCounts As Range 
Dim rngStart As Range 
Dim rngEnd As Range 
Dim rngToCount As Range 
Dim CurrentGrp As Range 
Dim NextGrp As Range 
Dim NumVals As Integer 

Set MergeGroups = Range("A1:O1") 
Set GroupTable = Range("Q2:V2") 
Set GrpCounts = Range("Q3:U23") 

Dim GrpCount As Range 
For Each GrpCount In GrpCounts 

Set CurrentGrp = Range(Cells(GroupTable.Row, GrpCount.Column).Address) 
Set NextGrp = Range(Cells(GroupTable.Row, GrpCount.Column + 1).Address) 
Set rngStart = MergeGroups.Find(CurrentGrp.Value) 
Set rngEnd = MergeGroups.Find(NextGrp.Value) 
Set rngToCount = Range(Cells(GrpCount.Row, rngStart.Column), Cells(GrpCount.Row, rngEnd.Column - 1)) 

NumVals = Application.WorksheetFunction.CountA(rngToCount) 

GrpCount.Value = NumVals 

Next GrpCount 

End Sub