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 как то, что осталось в строке (ничего).