2016-06-15 8 views
0

Ich versuche ein Makro zu erstellen, dass, wenn eine Informationszeile zu einem meiner Blätter hinzugefügt wird, diese Zeile automatisch zu einem anderen Blatt (in derselben Arbeitsmappe) hinzugefügt wird. Ich habe ausführlich Online recherchiert und fand diesen Code, den ich denke, das tut, was ich will, nachdem ich es ein wenig gezwickt:Wie behebt man Kompilierfehler: erwartet End Sub?

Sub addrow() 

Public Sub worksheet_change(ByVal target As Range) 

    Set sourcebook = ThisWorkbook 
    Set sourcesheet = sourcebook.Worksheets("sheet1") 

    Set targetbook = ThisWorkbook 
    Set targetsheet = targetbook.Worksheets("sheet10") 

    If sourcesheet.Cells(198, 16).Value = "Auto" Or _ 
     sourcesheet.Cells(198, 16).Value = "Connect" Or _ 
     sourcesheet.Cells(198, 16).Value = "Multiple*" Or _ 
     sourcesheet.Cells(198, 16).Value = "Property" Or _ 
     sourcesheet.Cells(198, 16).Value = "Umbrella" Or _ 
     sourcesheet.Cells(198, 16).Value = "WC" Then 
     GoTo link 
    Else 
     GoTo insertion 
    End If 

    insertion: targetsheet.Activate 
    ActiveSheet.Rows(198).EntireRow.Insert 

    sourcesheet.Activate 

link: 
    'targetsheet.Cells(194, targetsheet.Range("initial response").Column) = sourcesheet.Cells(198, 16).Value 
    targetsheet.Cells(194, 16) = sourcesheet.Cells(198, 16).Value 

    targetsheet.Cells(194, 16) = sourcesheet.Cells(198, 16).Value 

End Sub 

Wenn ich versuche, den Code auszuführen, erhalte ich die Fehlermeldung „Fehler beim Kompilieren: Expected End Sub "und es hebt die erste Codezeile hervor - Sub addrow(). Wenn ich versuche, diese Zeile herauszunehmen, verlangt VBA, dass ich ein neues Makro erstelle, wenn ich es versuche und ausführe, das dann diese Zeile wieder hinzufügt, und ich bin zurück auf Platz eins.

+1

Sie haben Sub addrow() und dann sofort Public Sub Worksheet_Change (ByVal Ziel als Strecke) - Subroutinen nicht überlappen können, und jedes Sub sollte ein passendes End Sub hat, damit diese Fehler. Entfernen Sie entweder Sub addrow() und vergewissern Sie sich, dass workhett_change() tatsächlich verwendbar ist, oder wenn Sie das Makro manuell ausführen, entfernen Sie die Zeile workheet_change(), behalten Sie aber sub addrow() bei. Ich hoffe, das hilft. S.S .: bitte keine ALL CAPS in Nachrichten. – Levon

Antwort

3

Konzentrieren Sie sich auf die ersten 3 Zeilen. Sie haben zwei Sub Erklärungen dort. Halte nur einen. Vielleicht Linie entfernen

Public Sub worksheet_change(ByVal target As Range) 

Ich denke, diese Zeile entfernen sollte und nicht das andere, weil es von einigen früheren Arbeiten vergessen zu sein scheint. Ihr Parameter target wird nicht im Code verwendet und Ihr Code passt besser zu Name addrow als mit worksheet_change.

Dies wird Ihr Code Refactoring:

  • Variablennamen halten VBA Namenskonvention
  • Codeblöcke neu angeordnet, so gotos und Etiketten

ausgeschlossen werden konnte.

Sub AddRow() 

    Set SourceBook = ThisWorkbook 
    Set SourceSheet = SourceBook.Worksheets("sheet1") 

    Set TargetBook = ThisWorkbook 
    Set TargetSheet = TargetBook.Worksheets("sheet10") 

    If Not (SourceSheet.Cells(198, 16).Value = "Auto" 
      Or SourceSheet.Cells(198, 16).Value = "Connect" 
      Or SourceSheet.Cells(198, 16).Value = "Multiple*" 
      Or SourceSheet.Cells(198, 16).Value = "Property" 
      Or SourceSheet.Cells(198, 16).Value = "Umbrella" 
      Or SourceSheet.Cells(198, 16).Value = "WC") Then 
     TargetSheet.Activate 
     ActiveSheet.Rows(198).EntireRow.Insert 
     SourceSheet.Activate 
    End If 

    'TargetSheet.Cells(194, TargetSheet.Range("initial response").Column) = SourceSheet.Cells(198, 16).Value 
    TargetSheet.Cells(194, 16) = SourceSheet.Cells(198, 16).Value 
    TargetSheet.Cells(194, 16) = SourceSheet.Cells(198, 16).Value 

End Sub 
+0

Gute Nachrichten - der Kompilierfehler wurde behoben, nachdem ich die öffentliche Sub-Leitung wie gesagt entfernt habe. Jetzt bekomme ich den Fehler "Laufzeitfehler '9': Index außerhalb des Bereichs". Ich habe gegoogelt und es scheint, dass ich mich nicht korrekt auf einen Bereich bezog? – mfrank7114

+0

@ mfrank7114 - In Ihrem Code sind viele Indizes enthalten. An welcher Stelle tritt der Fehler auf? Konzentriere dich darauf. Versuche das Debugging: (1) verschiebe Caret in die erste Zeile ('Sub ...') (2) Drücke ** F9 **, um einen Breakpoint zu setzen. (3) Führe dein Programm aus, es stoppt am Haltepunkt. (4) Halten Sie ** F8 ** gedrückt, um Schritt für Schritt durch das Programm zu gehen und die Schritte zu beobachten. Sie können auch Variablen usw. anzeigen. Siehe * Debug * Menü während des Schritts. – miroxlav