2017-05-08 6 views
1

Ich habe die folgende Sub, die gut funktioniert, wenn der Bereich, den es umfasst, weniger als 88 Zellen ist, sonst scheitert es um die 88. Iteration.VBA-Schleife fehlgeschlagen um 88. Iteration

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 

Es ist ein Objekt in einem bestimmten Arbeitsblatt, die Verwendung des Ereignisses SelectionChange machen. Wenn es fehlschlägt, erhalte ich die Fehlermeldung:

Laufzeitfehler '-2147417848 (80010108)': Methode 'Find' des Objekts 'Bereich' fehlgeschlagen.

Das Problem ist mit der Zeile:

Set rngStart = MergeGroups.Find(CurrentGrp.Value) 

Kann mir jemand helfen, arbeiten, warum die Sub für kleine Bereiche fein läuft, aber ansonsten nicht um eine bestimmte Iteration?

+4

Sie rufen dasselbe Sub-Register jedes Mal, wenn Sie eine andere Zelle in der Schleife auswählen. Sie müssen entweder herausfinden, wie Sie dies tun, ohne Auswahl zu verwenden, oder die Ereignisse deaktivieren, während Sie die Schleife ausführen, und sie aktivieren, bevor Sie das Subsystem verlassen. –

+0

Vielen Dank an @ Mat'sMug! Ich muss gestehen, dass ich die Antwort nicht vollständig verstanden habe, aber es hat mich in die richtige Richtung gebracht - [this link] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-use-in- Excel-VBA-Makros) war hilfreich, weil ich nicht verstehen konnte, was an '.Select' so böse war. Ich denke, ich habe es jetzt funktioniert, ich werde meinen neuen Code hier posten, sobald ich es richtig getestet habe. – rngeta453

Antwort

0

Dankeschön an @ Mat's Tasse für die Erzählung, was falsch war, und this Q&A für die Hilfe, um es richtig zu machen. Dies ist der geänderte Code:

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