Erro de compilação: erro de sintaxe na macro do Excel

0

Eu tenho este código VBA, quando eu tento executá-lo, me dá "Erro de compilação: erro de sintaxe", como pode ser visto na imagem. Eu não sei o VBA, o que devo fazer para fazer esse código funcionar? obrigado.

 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

    
por Max 27.12.2016 / 15:40

1 resposta

1

Você tem quebras de linha indesejadas em vários lugares do seu código. A captura de tela que você postou mostra várias linhas destacadas em vermelho; estes são lugares onde você receberá um erro de sintaxe, porque a linha está incompleta.

A linha em que você está invadindo deve ser combinada com a próxima linha, para obter esse resultado:

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

Nesse caso, a linha estava tentando atribuir um valor à variável lRow2 usando a função MATCH incorporada do Excel, que procura um valor dentro de um intervalo e retorna o número da linha onde encontra a correspondência. . No entanto, desde que sua linha estava incompleta, tudo o que tinha que trabalhar era o argumento dizendo qual valor procurar. Você pode dizer que ele estava incompleto de várias maneiras - ele estava destacado em vermelho, havia apenas um argumento, e ele tinha um parêntese de abertura sem um parêntese de fechamento.

No VBA, cada instrução ou método individual deve estar contido em uma única linha. Se você precisar atravessar várias linhas para facilitar a leitura, poderá usar o sublinhado _ para unir duas linhas. Aqui está o seu código, modificado para evitar as quebras de linha:

EDITADO:

Eu assumi que as duas linhas restantes com erro estão mantendo uma contagem de quantos de um determinado valor são encontrados, então eles estão simplesmente incrementando o valor em uma célula em particular por 1 a cada vez. Dê uma corrida e deixe-me saber o que você tem.

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
    
por 27.12.2016 / 16:36