Kompilierungsfehler: Syntaxfehler in Excel-Makro

8970
Max

Ich habe diesen VBA-Code, wenn ich versuche, es auszuführen, gibt es "Kompilierfehler: Syntaxfehler", wie im Bild zu sehen ist. Ich kenne VBA nicht. Was soll ich tun, damit dieser Code funktioniert? Vielen Dank.

 Sub MostCommonPairAndTriplet() Dim rng As Range Dim c As Range Dim strPair As String Dim strTriplet As String Dim wsResult As Worksheet Dim lRow As Long Dim lRow2 As Long Dim i As Integer Dim j As Integer  Application.ScreenUpdating = False Application.DisplayAlerts = False  Set rng = Intersect(ActiveSheet.UsedRange, ActiveSheet.Range("A:F"))  If Not rng Is Nothing Then  'Get the result worksheet On Error Resume Next Set wsResult = ActiveWorkbook.Worksheets("Results") If wsResult Is Nothing Then Set wsResult = ActiveWorkbook.Worksheets.Add wsResult.Name = "Results" Else wsResult.UsedRange.Delete End If 'column labels With wsResult .Range("B1").Value = "Value1" .Range("C1").Value = "Value2" .Range("D1").Value = "Count" .Range("F1").Value = "Value1" .Range("G1").Value = "Value2" .Range("H1").Value = "Value3" .Range("I1").Value = "Count" End With On Error GoTo 0  'Find Pairs lRow = 2 For Each c In rng If c.Column <= 5 Then For i = 1 To 6 - c.Column strPair = c.Value & "_" & c.Offset(0, i).Value  On Error Resume Next lRow2 = Application.WorksheetFunction.Match(strPair, wsResult.Range("A:A"), False) If Err.Number > 0 Then wsResult.Range("A" & lRow).Value = strPair wsResult.Range("B" & lRow).Value = c.Value wsResult.Range("C" & lRow).Value = c.Offset(0, i).Value wsResult.Range("D" & lRow).Value = 1 lRow = lRow + 1 Else wsResult.Range("D" & lRow2).Value = wsResult.Range("D" & lRow2).Value 1 End If On Error GoTo 0 Next i End If Next c  'Find Triplets lRow = 2 For Each c In rng If c.Column <= 5 Then For i = 1 To 6 - c.Column For j = 1 To 6 - c.Offset(0, i).Column strTriplet = c.Value & "_" & c.Offset(0, i).Value & "_" & c.Offset(0, i + j).Value  On Error Resume Next lRow2 = Application.WorksheetFunction.Match(strTriplet, wsResult.Range("E:E"), False) If Err.Number > 0 Then wsResult.Range("E" & lRow).Value = strTriplet wsResult.Range("F" & lRow).Value = c.Value wsResult.Range("G" & lRow).Value = c.Offset(0, i).Value wsResult.Range("H" & lRow).Value = c.Offset(0, i + j).Value wsResult.Range("I" & lRow).Value = 1 lRow = lRow + 1 Else wsResult.Range("I" & lRow2).Value = wsResult.Range("I" & lRow2).Value 1 End If On Error GoTo 0 Next j Next i End If Next c End If  wsResult.Columns("E").Clear wsResult.Columns("A").Delete  'Sort the pairs With wsResult .Columns("A:C").Sort Key1:=.Range("C2"), Order1:=xlDescending .Columns("E:H").Sort Key1:=.Range("H2"), Order1:=xlDescending End With   Application.DisplayAlerts = True Application.ScreenUpdating = True  End Sub 

enter image description here

0

1 Antwort auf die Frage

1
Werrf

Sie haben in Ihrem Code an mehreren Stellen unerwünschte Zeilenumbrüche. Der von Ihnen gepostete Screenshot zeigt eine Reihe rot markierter Zeilen. Dies sind Orte, an denen Sie einen Syntaxfehler erhalten, weil die Zeile unvollständig ist.

Die Zeile, in der Sie brechen, sollte mit der nächsten Zeile kombiniert werden, um dieses Ergebnis zu erhalten:

lRow2 = Application.WorksheetFunction.Match(strPair,wsResult.Range("A:A"), False) 

In diesem Fall versuchte die Zeile, der Variablen lRow2mithilfe der integrierten MATCHFunktion von Excel einen Wert zuzuweisen. Diese Funktion sucht nach einem Wert innerhalb eines Bereichs und gibt die Zeilennummer zurück, an der die Übereinstimmung gefunden wird. Da Ihre Zeile jedoch unvollständig war, musste sie nur mit dem Argument arbeiten, nach welchem ​​Wert gesucht werden soll. Man kann sagen, dass es auf verschiedene Weise unvollständig war - es wurde rot hervorgehoben, es gab nur ein Argument und es gab eine öffnende Klammer ohne schließende Klammer.

In VBA sollte jede einzelne Anweisung oder Methode in einer einzelnen Zeile enthalten sein. Wenn Sie zur besseren Lesbarkeit auf mehrere Zeilen zugreifen müssen, können Sie den _Unterstrich verwenden, um zwei Zeilen miteinander zu verbinden. Hier ist Ihr Code, geändert, um die Zeilenumbrüche zu vermeiden:

BEARBEITET:

Ich bin davon ausgegangen, dass die beiden verbleibenden fehlerhaften Zeilen eine Zählung darüber enthalten, wie viele eines bestimmten Werts gefunden werden. Sie erhöhen also einfach den Wert in einer bestimmten Zelle jedes Mal um 1. Lass es laufen und lass mich wissen, was du bekommst.

Sub MostCommonPairAndTriplet() Dim rng As Range Dim c As Range Dim strPair As String Dim strTriplet As String Dim wsResult As Worksheet Dim lRow As Long Dim lRow2 As Long Dim i As Integer Dim j As Integer  Application.ScreenUpdating = False Application.DisplayAlerts = False  Set rng = Intersect(ActiveSheet.UsedRange, ActiveSheet.Range("A:F"))  If Not rng Is Nothing Then  'Get the result worksheet On Error Resume Next Set wsResult = ActiveWorkbook.Worksheets("Results") If wsResult Is Nothing Then Set wsResult = ActiveWorkbook.Worksheets.Add wsResult.Name = "Results" Else wsResult.UsedRange.Delete End If 'column labels With wsResult .Range("B1").Value = "Value1" .Range("C1").Value = "Value2" .Range("D1").Value = "Count" .Range("F1").Value = "Value1" .Range("G1").Value = "Value2" .Range("H1").Value = "Value3" .Range("I1").Value = "Count" End With On Error GoTo 0  'Find Pairs lRow = 2 For Each c In rng If c.Column <= 5 Then For i = 1 To 6 - c.Column strPair = c.Value & "_" & c.Offset(0, i).Value  On Error Resume Next lRow2 = Application.WorksheetFunction.Match(strPair, wsResult.Range("A:A"), False) If Err.Number > 0 Then wsResult.Range("A" & lRow).Value = strPair wsResult.Range("B" & lRow).Value = c.Value wsResult.Range("C" & lRow).Value = c.Offset(0, i).Value wsResult.Range("D" & lRow).Value = 1 lRow = lRow + 1 Else wsResult.Range("D" & lRow2).Value = wsResult.Range("D" & lRow2).Value + 1 End If On Error GoTo 0 Next i End If Next c  'Find Triplets lRow = 2 For Each c In rng If c.Column <= 5 Then For i = 1 To 6 - c.Column For j = 1 To 6 - c.Offset(0, i).Column strTriplet = c.Value & "_" & c.Offset(0, i).Value & "_" & c.Offset(0, i + j).Value  On Error Resume Next lRow2 = Application.WorksheetFunction.Match(strTriplet, wsResult.Range("E:E"), False) If Err.Number > 0 Then wsResult.Range("E" & lRow).Value = strTriplet wsResult.Range("F" & lRow).Value = c.Value wsResult.Range("G" & lRow).Value = c.Offset(0, i).Value wsResult.Range("H" & lRow).Value = c.Offset(0, i + j).Value wsResult.Range("I" & lRow).Value = 1 lRow = lRow + 1 Else wsResult.Range("I" & lRow2).Value = wsResult.Range("I" & lRow2).Value + 1 End If On Error GoTo 0 Next j Next i End If Next c End If  wsResult.Columns("E").Clear wsResult.Columns("A").Delete  'Sort the pairs With wsResult .Columns("A:C").Sort Key1:=.Range("C2"), Order1:=xlDescending .Columns("E:H").Sort Key1:=.Range("H2"), Order1:=xlDescending End With   Application.DisplayAlerts = True Application.ScreenUpdating = True  End Sub 
Ich habe diesen Code ausprobiert, aber leider immer noch die gleiche Fehlermeldung. Max vor 7 Jahren 0
Wir haben immer noch die beiden Zeilen, die ich am Ende hervorgehoben habe, mit ihren baumelnden "1". Es ist nicht klar, was diese Zeilen tun sollen. Können Sie erläutern, was das Makro erwartet? Werrf vor 7 Jahren 0
Es sucht nach gemeinsamen Paaren und Triolen aus einer gegebenen Anzahl von Zahlen und extrahiert diese. Ich bin nicht mit vba vertraut, daher kann ich leider nicht über "1s" nachdenken. Max vor 7 Jahren 0
Okay - Ich habe angenommen, dass diese beiden Zeilen eine laufende Summe der Anzahl der gefundenen Instanzen eines bestimmten Werts enthalten sollen. Wenn also eine Übereinstimmung gefunden wird, erhöhen sie den Wert in einer Zelle um +1. Gib dem einen Versuch und lass es mich wissen. Werrf vor 7 Jahren 0
Es wirkt wie ein Zauber! Danke vielmals! Max vor 7 Jahren 0