结束与没有

时间:2015-08-12 21:38:07

标签: vba excel-vba excel

这似乎是一个相当常见的问题,但即使查看以前的答案,我也无法看到错误。请帮助编译错误:结束没有With,我得到了。该错误发生在" End With"的第一个实例上。请参阅下面的代码插图(简单易于查看):

CB = Left(ActiveSheet.Range("D10").Value, 3)
RT = Left(ActiveSheet.Range("B" & Application.WorksheetFunction.Match("HBR", ActiveSheet.Range("D1:D100"), 0)).Value, 3)
If RT = "P" Then
    ShtName = CB & "_TR"
Else
    ShtName = CB & "_ATR"
End If
RScenarios = FindCase(CB, "abc")
Arraysize = UBound(RScenarios) - LBound(RScenarios) + 1
ThisWorkbook.Sheets(CB & "_Summary").Rows(5 & ":" & Rows.Count).Delete
With ThisWorkbook.Worksheets(ShtName)
    For scenario_index = LBound(RScenarios) To UBound(RScenarios)
        If RT = "P" Then
            pTableName = "PivotTable" & CB & "abc"
            RName = CB & "_Rrt_"
        Else
            pTableName = "PivotTable" & CB & "def"
            RName = CB & "_Rdt_"
        End If
        Dsweepcases = .Range("Z34").Value
        Tsweepcases = .Range("Y34").Value
        .Range("Q59").Value = RScenarios(scenario_index)
        .Calculate
        Set pt = Sheets(CB & "Results_PivotTable").PivotTables(pTableName)
        pt.RefreshTable
        ThisWorkbook.Worksheets(CB & "Results_PivotTable").Range(CB & "_RxPivotTable").Copy
End With
With ThisWorkbook.Sheets(CB & "_Summary")
    If scenario_index = 0 Then
        LastRow = 6
    Else
        LastRow = .Range("Q" & Rows.Count).End(xlUp).Row + 3
    End If
    Set Destination = .Range("A" & LastRow)
    With Destination
        .PasteSpecial xlPasteValues
        .PasteSpecial xlPasteFormats
        With ThisWorkbook.Worksheets(CB & "_TR")
            CaseName = .Range("R59").Value & " + " & .Range("U59").Value & " (AM" & .Range("Y59").Value & ")"
        End With
        .Value = CaseName
    End With
    TempLastRow = .Range("A" & Rows.Count).End(xlUp).Row + 1
    HeaderRow = TempLastRow - 1 - Dsweepcases
    .Range("A" & TempLastRow).Value = blah blah
    .Range("C" & TempLastRow).Value = blah blah
    Set DVal = Worksheets("B").Range(RName & Left(.Range("A" & HeaderRow).Value, InStr(.Range("A" & HeaderRow).Value, " +") - 1))
    If IsError(Application.Match(DVal, .Range("A" & HeaderRow + 1 & ":A" & TempLastRow - 1), 0)) = False Then
        DValRow = blah blah
    Else
        DValRow = blah blah
    End If
    .Range("A" & HeaderRow + DValRow).Resize(, Tsweepcases + 1).BorderAround Weight:=xlThick
End With
Next scenario_index

3 个答案:

答案 0 :(得分:2)

对不起,我错过了你底部的Next scenario_index。我编辑了答案,而不是颠倒With块和For循环的顺序。

仅供参考,如果同一行可以被多个With引用限定,则在彼此内部使用多个With块可能会导致问题。根据我的经验,这种情况不会经常发生,也不会停止这样做,但请记住以备日后调试。如果您怀疑它导致问题,请尝试在该行中添加适当的引用,并查看您的问题是否已修复。

CB = Left(ActiveSheet.Range("D10").Value, 3)
RT = Left(ActiveSheet.Range("B" & Application.WorksheetFunction.Match("HBR", ActiveSheet.Range("D1:D100"), 0)).Value, 3)
If RT = "P" Then
    ShtName = CB & "_TR"
Else
    ShtName = CB & "_ATR"
End If
RScenarios = FindCase(CB, "abc")
Arraysize = UBound(RScenarios) - LBound(RScenarios) + 1
ThisWorkbook.Sheets(CB & "_Summary").Rows(5 & ":" & Rows.Count).Delete
For scenario_index = LBound(RScenarios) To UBound(RScenarios)
    With ThisWorkbook.Worksheets(ShtName)
        If RT = "P" Then
            pTableName = "PivotTable" & CB & "abc"
            RName = CB & "_Rrt_"
        Else
            pTableName = "PivotTable" & CB & "def"
            RName = CB & "_Rdt_"
        End If
        Dsweepcases = .Range("Z34").Value
        Tsweepcases = .Range("Y34").Value
        .Range("Q59").Value = RScenarios(scenario_index)
        .Calculate
        Set pt = Sheets(CB & "Results_PivotTable").PivotTables(pTableName)
        pt.RefreshTable
        ThisWorkbook.Worksheets(CB & "Results_PivotTable").Range(CB & "_RxPivotTable").Copy
    End With
    With ThisWorkbook.Sheets(CB & "_Summary")
        If scenario_index = 0 Then
            LastRow = 6
        Else
            LastRow = .Range("Q" & Rows.Count).End(xlUp).Row + 3
        End If
        Set Destination = .Range("A" & LastRow)
        With Destination
            .PasteSpecial xlPasteValues
            .PasteSpecial xlPasteFormats
            With ThisWorkbook.Worksheets(CB & "_TR")
                CaseName = .Range("R59").Value & " + " & .Range("U59").Value & " (AM" & .Range("Y59").Value & ")"
            End With
            .Value = CaseName
        End With
        TempLastRow = .Range("A" & Rows.Count).End(xlUp).Row + 1
        HeaderRow = TempLastRow - 1 - Dsweepcases
        .Range("A" & TempLastRow).Value = blah blah
        .Range("C" & TempLastRow).Value = blah blah
        Set DVal = Worksheets("B").Range(RName & Left(.Range("A" & HeaderRow).Value, InStr(.Range("A" & HeaderRow).Value, " +") - 1))
        If IsError(Application.Match(DVal, .Range("A" & HeaderRow + 1 & ":A" & TempLastRow - 1), 0)) = False Then
            DValRow = blah blah
        Else
            DValRow = blah blah
        End If
        .Range("A" & HeaderRow + DValRow).Resize(, Tsweepcases + 1).BorderAround Weight:=xlThick
    End With
Next scenario_index

答案 1 :(得分:2)

这实际上可能是因为没有关闭其他控制结构。编译器可能会感到困惑并将其报告为缺少End With。以下是要查找的项目:

  • If / End If
  • 选择/结束选择
  • 对于/下一步
  • DO /循环
  • 虽然/ WEND

当然,

  • 使用/结束

如果您检查确保每个都已正确关闭,您将在代码中找到问题。

至于为什么

您可以考虑Russian nesting dolls这些结构中的每一种。在放入一个更大的娃娃之前你必须关闭每一个。同样地,你必须打开每个玩偶才能获得下一个小玩偶。

暂时进行这种心理锻炼。试着想象一下你会怎么做?换句话说,如果没有先关闭它,你会如何将娃娃放入下一个较大的娃娃?你可以放入基地并将所有头部留到最后,但这不是俄罗斯嵌套娃娃的工作方式。你不能把头放在不按顺序。

这就是你要求编译器依次关闭每个项目并且编译器只能接受明确的指令,因此无法确定你的意图。

对于视觉,请考虑这种结构。它是有序的,并且立即具有逻辑意义。有意义的是嵌套。每个结构都嵌套在另一个结构中。

--------+
--+     |
  |     |
--+     |
------+ |
----+ | |
    | | |
----+ | |
------+ |
--------+

与此相比:

------+
--------+
--+   | |
--|-+ | |
--|-------+
  | | | | |
--+ | | | |
    | | | |
----|-+ | |
----+   | |
--------+ |
----------+

按照以下步骤尝试将这些嵌套玩偶重新组合在一起:

  1. 采取最小的身体
  2. 用一个或多个随机头关闭它
  3. 把它放在下一个更大的身体里面
  4. 重复
  5. Ironman的头撞在Nick Fury的身上,然后用绿巨人的脑袋将它放入美国队长,然后将所有这些放入Thor的身体,与Nick Fury的头一起。然后将它放入Hulk的身体。祝你好运!

    上面只有一步使这个过程无效。

    enter image description here

答案 2 :(得分:2)

你不能拥有:

With X
    For Y
End With
    Next Y

原因是当第一次迭代后Y循环时,当你关闭循环时没有X.

但是,您可以在With中设置多个for循环,或者在其中进行一些高级IF检查。

puzzlepiece87为你修复了代码,但我注意到你在其中一条评论中问过为什么会这样。