2017-04-12 2 views
1

Ich habe einen Code, der nach etwas aus dem Masterblatt in Spalte D wie "1x täglich" oder "2x Monat" (sowie andere) sucht. Wenn die Zelle mit einem Blattnamen übereinstimmt, wird sie in dieses Blatt eingefügt. Das Problem ist, dass jede Zeile vom Masterblatt eindeutig ist und daher nicht auf jedem Blatt wiederholt werden kann. Jedes Mal, wenn ich den Code ausführen, fügt es die Zeilen wieder, so dass ich am Ende mit so etwas wie dieseKompilierfehler: Etikett nicht definiert

Coubourn, Stephen | A | 201 | Q4hours Eudy, Donna | A | 202 | Q4hours Pott, Betty | A | 203 | Q4hours Coubourn, Stephen | A | 201 | Q4hours Eudy, Donna | A | 202 | Q4hours Potts, Betty | A | 203 | Q4hours Coubourn, Stephen | A | 201 | Q4hours Eudy, Donna | A | 202 | Q4hours Potts, Betty | A | 203 | Q4hours

Unten ist, was ich bisher für diesen Code habe ich versuche zu machen, aber es funktioniert nicht. Im Empfang die Fehlermeldung "Fehler Kompilieren, Label nicht definiert" auf der Linie, die "On Error GoTo SetFirst", sagt

Dim cell As Range 
    Dim cmt As Comment 
    Dim bolFound As Boolean 
    Dim sheetNames() As String 
    Dim lngItem As Long, lngLastRow As Long 
    Dim sht As Worksheet, shtMaster As Worksheet 
    Dim MatchRow As Variant 

    Set shtMaster = ThisWorkbook.Worksheets("Master Vitals Data") 

    ReDim sheetNames(0) 
    For Each sht In ThisWorkbook.Worksheets 
     If sht.Name <> shtMaster.Name Then 
      sheetNames(UBound(sheetNames)) = sht.Name 
      ReDim Preserve sheetNames(UBound(sheetNames) + 1) 
     End If 
    Next sht 
    ReDim Preserve sheetNames(UBound(sheetNames) - 1) 

    For Each cell In shtMaster.Range("D1:D" & shtMaster.Cells(shtMaster.Rows.Count, "D").End(xlUp).Row) 
    bolFound = False 
     MatchRow = Application.Match(cell.Offset(, -3).Value, sht.Range("A:A"), 0) 
     If Not IsError(MatchRow) Then 
      shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(MatchRow, 1) 
     Else 
      On Error GoTo SetFirst 
      lngLastRow = sht.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 1 
      On Error GoTo 0 
      shtMaster.Rows(cell.Row).EntireRow.Copy Destination:=sht.Cells(lngLastRow, 1) 
     End If 

     If bolFound = False Then 
      For Each cmt In shtMaster.Comments 
       If cmt.Parent.Address = cell.Address Then cmt.Delete 
      Next cmt 
      cell.AddComment "no sheet found for this row" 
      ActiveSheet.EnableCalculation = False 
    ActiveSheet.EnableCalculation = True 
     End If 

    Set sht = Nothing 
    Next 
End Sub 
+1

Kompilierung schlägt fehl, da offensichtlich keine Bezeichnung SetFirst vorhanden ist. Wohin soll die Ausführung gehen, wenn der Fehler in der Zeile zwischen "On Error GoToFirst" und "On Error Go Too" auftritt? – Alexey

+0

Ich bin mir nicht sicher, ich bin brandneu. Hast du einen Vorschlag? –

+0

Ich werde wahrscheinlich vorschlagen, wenn Sie erklären könnten, was genau Ihr Code tun sollte. Was ist der Zweck all dieser Subroutine? Außerdem ist Ihr Code nicht vollständig, er beginnt mit "Dim ..." sollte aber mit 'Sub beginnen ...' – Alexey

Antwort

0
On Error GoTo SetFirst 

Dieser Befehl teilt die VBA-Laufzeit im Fall eines Fehlers, gerade zu springen an die Unterroutine SetFirst, um den Fehler zu behandeln.

Wenn Sie den Code kompilieren, erkennt VBA, dass es einen bedingten Sprung zu diesem SetFirst-Label gibt, aber es gibt kein solches Label zu springen, damit VBA SetFirst nicht auflösen kann und Kompilierung fehlschlägt.

nicht sicher, was Ihre Absicht ist, aber die Dinge würde in der Regel in etwa so aussehen:

Exit Sub 

SetFirst: '<<<<<<<< that's your line label 
    Debug.Print "Error " & Err.Number & ": " & Err.Description 
    Err.Clear 
    'comment-out or remove before distributing: 
    Stop 
    Resume 'step through (F8) here to jump back to error-causing instruction 
End Sub 

Linie Labels/Subroutinen lokal scoped sind, das heißt, Sie können nicht GoTo -jump auf eine Linie Label, das in idealer Lage ein anderes Verfahren. Wenn Sie SetFirst in einem anderen Verfahren haben und beabsichtigen, im Falle eines Fehlers dorthin zu springen, haben Sie eine ernsthafte Spaghettierung im Prozess.