End If без блока If - удваивается для каждого цикла

Я пытаюсь соединить некоторый код для выполнения простых вычислений, но изо всех сил пытаюсь обойти операторы If, они, кажется, не имеют смысла для меня, но мое форматирование такое же, как и решения, которые я читал для подобных проблем.

Я получаю "End If без блока If" в последнем End If из следующего:

Sub SAP1C()

Dim i1, j1 As Range
Dim Material, Customer, Price As String
Dim MaterialStart, CustomerStart, PriceStart As Object
Dim Counter As Integer

Set i1 = Sheets("Invoice Prices").Range("B1:RL1")
Set j1 = Sheets("Invoice Prices").Range("A6:A500")

Set PriceStart = Sheets("SAP 1C").Range("A3")
Set MaterialStart = Sheets("SAP 1C").Range("J3")
Set CustomerStart = Sheets("SAP 1C").Range("I3")

Counter = 0

For Each i In i1

    If i = "" Then Exit Sub Else

        For Each j In j1

            If j <> "" Then

                Price = Cells(Application.WorksheetFunction.Row(j), Application.WorksheetFunction.Column(i)).Value
                Material = Application.WorksheetFunction.VLookup(j, Sheets("BTS").Range("F:G"), 2, 0)
                Customer = Application.WorksheetFunction.Text(Application.WorksheetFunction.VLookup(i, Sheets("Customer Hub").Range("A:G"), 7, 0), "0000000000")

                PriceStart.Offset(Counter, 0) = Price
                MaterialStart.Offset(Counter, 0) = Material
                CustomerStart.Offset(Counter, 0) = Customer

                Counter = Counter + 1

            End If

        Next j

    End If

Next i

End Sub  

Я немного поиграл с кодом и не могу понять - есть идеи?
Спасибо!

РЕДАКТИРОВАТЬ: Ответ ниже - большое спасибо!

Я немного изменил код и поиграл с ним, чтобы попытаться заставить его работать дальше первоначальной проблемы, но я сталкиваюсь с ошибками. Не могли бы вы взглянуть на ниже?

Sub SAP1C()

Dim i1, j1 As Range
Dim Material, Customer, Price As String
Dim MaterialStart, CustomerStart, PriceStart As Object
Dim Counter As Integer

Set i1 = Sheets("Invoice Prices").Range("B1:RL1")
Set j1 = Sheets("Invoice Prices").Range("A6:A300")

Set PriceStart = Sheets("SAP 1C").Range("A3")
Set MaterialStart = Sheets("SAP 1C").Range("J3")
Set CustomerStart = Sheets("SAP 1C").Range("I3")

Counter = 0

For Each i In i1

    If i = "" Then
        Exit Sub
    Else

        For Each j In j1

            If j <> "" Then

                If Application.WorksheetFunction.IsText(Sheets("Invoice Prices").Cells(j.Row, i.Column)) Then
                    Price = "POA"
                ElseIf Application.WorksheetFunction.IsErr(Sheets("Invoice Prices").Cells(j.Row, i.Column)) Then
                    Price = "POA"
                Else
                    Price = Round(Sheets("Invoice Prices").Cells(j.Row, i.Column).Value, 1)

                Material = Application.WorksheetFunction.VLookup(j, Sheets("BTS").Range("F:G"), 2, 0)
                Customer = "00" & Application.WorksheetFunction.VLookup(i, Sheets("Customer Hub").Range("A:G"), 7, 0)

                PriceStart.Offset(Counter, 0) = Price
                MaterialStart.Offset(Counter, 0) = Material
                CustomerStart.Offset(Counter, 0) = Customer

                Counter = Counter + 1

            End If

        Next j

    End If

Next i

End Sub  

"Следующий без For" на "Следующий J"? Как это работает точно? Все мои Ifs имеют End End или, кажется, все закрываются в некотором роде, также мои For For's имеют Next. Кажется, все течет логически, поэтому я действительно не понимаю, что мне здесь не хватает. Спасибо!

3 ответа

В вашем обновленном коде вы пропускаете End If после команды Price = ...

Синтаксис If является:

  • Либо используйте однострочное утверждение
  • или вы должны использовать End If

Примеры:

If i = "" Then Exit Sub    ' no end if needed

Это эквивалентно

If i = "" Then
    Exit Sub 
End if

То же самое верно при использовании Else (а также ElseIf)

If i = "" Then Debug.print "empty" Else Debug.print i    

If i = "" Then
    Debug.print "empty"
Else
    Debug.print i 
End if

Нечто подобное, как показано ниже.

Обратите внимание, что я изменил ваши операторы объявления, чтобы вы не объявляли вещи как варианты неявно. Например:

Dim i1, j1 As Range

i1 - вариант, и только j1 - диапазон.

Я также использовал IsEmpty тест на камеру и и использовал Worksheets коллекция, а не Sheets,

Сделать:

Поместите некоторую обработку ошибок в Application.WorksheetFunction.VLookup не вернул матч.

Option Explicit

Public Sub SAP1C()

    Dim i1 As Range, j1 As Range, i As Range, j As Range
    Dim Material As String, Customer As String, Price As String
    Dim MaterialStart As Object, CustomerStart As Object, PriceStart As Object
    Dim Counter As Long

    Set i1 = Sheets("Invoice Prices").Range("B1:RL1")
    Set j1 = Sheets("Invoice Prices").Range("A6:A300")

    Set PriceStart = Sheets("SAP 1C").Range("A3")
    Set MaterialStart = Sheets("SAP 1C").Range("J3")
    Set CustomerStart = Sheets("SAP 1C").Range("I3")

    Counter = 0

    For Each i In i1

        If IsEmpty(i) Then
            Exit Sub
        Else

            For Each j In j1

                If Not IsEmpty(j) Then

                    If Application.WorksheetFunction.IsText(Worksheets("Invoice Prices").Cells(j.Row, i.Column)) Then
                        Price = "POA"
                    ElseIf Application.WorksheetFunction.IsErr(Worksheets("Invoice Prices").Cells(j.Row, i.Column)) Then
                        Price = "POA"
                    Else
                        Price = Round(Worksheets("Invoice Prices").Cells(j.Row, i.Column).Value, 1)

                        Material = Application.WorksheetFunction.VLookup(j, Worksheets("BTS").Range("F:G"), 2, 0)
                        Customer = "00" & Application.WorksheetFunction.VLookup(i, Worksheets("Customer Hub").Range("A:G"), 7, 0)

                        PriceStart.Offset(Counter, 0) = Price
                        MaterialStart.Offset(Counter, 0) = Material
                        CustomerStart.Offset(Counter, 0) = Customer

                        Counter = Counter + 1
                    End If
                End If
            Next j
        End If
    Next i
End Sub

Разделите линии на вашем первом, если это так

    If i = "" Then
      Exit Sub
    Else
    'other code

Среда сценария VBA обрабатывает ваш первый оператор if как встроенный оператор If, что означает, что он пытается оценить оператор else как то, что осталось в строке (ничего).

Другие вопросы по тегам