【问题标题】:End If without block If - double For Each loopEnd If 没有块 If - double For Each 循环
【发布时间】:2018-09-29 17:18:26
【问题描述】:

我正在尝试将一些代码放在一起进行一些简单的计算,但我很难通过 If 语句,它们对我来说似乎没有意义,但我的格式与我读过的解决方案相同类似的问题。

我在以下的最后一个 End If 上得到“End If without block 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  

“Next j”上的“Next without For”?这究竟是如何工作的?我的 Ifs 都有 End Ifs 或似乎都以某种方式关闭,我的 For Each 也都有 Next's。一切似乎都顺理成章,所以我真的很困惑我在这里缺少什么。谢谢!

【问题讨论】:

  • mmh不确定那些Next jNext i不应该只是Next吗?
  • Next &lt;iterated variable here&gt; 是 VBA 的良好语法。它更冗长,但有助于提高高度嵌套代码的可读性
  • @DavidColwell 对,今天学到的新东西,耶 o/
  • 非常感谢您的回复 - 我使用 Next i 和 Next j 因为它更易于阅读,但老实说我不知道​​它可能只是“Next”。我已经更新了我的问题,因为我在原来的下面遇到了一个不同的错误,现在已经排序。 :)

标签: vba for-loop each


【解决方案1】:

如果是这样,请在您的第一行拆分

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

VBA 脚本环境将您的第一个 if 语句视为内联 If,这意味着它会尝试将 else 语句评估为行中剩余的任何内容(无)。

【讨论】:

  • @FunThomas 100% 正确,它避免了箭头反模式,但我想我会详细说明它发生的原因,因为它是 VBA 脚本环境的一个怪癖,它让空的 else 语句悬空当它们是内联条件的一部分时
  • 感谢您抽出宝贵时间发表评论。我已经进行了此更改,编译器似乎很乐​​意继续本节,但我现在在下一部分遇到问题 - 我得到“没有 For 的下一个”,我不知道为什么!不确定 StackOverflow 的礼仪,但我会编辑我的问题以向您展示我的意思。
【解决方案2】:

在您更新的代码中,您在命令 Price = ... 之后缺少一个 End If

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

【讨论】:

    【解决方案3】:

    如下所示。

    请注意,我已更改您的声明语句,因此您不会将事物隐式声明为变体。例如:

    Dim i1, j1 As Range
    

    i1 是 Variant,只有 j1 是 Range。

    我还在单元格上使用了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
    

    【讨论】:

      猜你喜欢
      • 2021-07-26
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多