这似乎是一个相当常见的问题,但即使查看以前的答案,我也无法看到错误。请帮助编译错误:结束没有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
答案 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。以下是要查找的项目:
当然,
如果您检查确保每个都已正确关闭,您将在代码中找到问题。
至于为什么?
您可以考虑Russian nesting dolls这些结构中的每一种。在放入一个更大的娃娃之前你必须关闭每一个。同样地,你必须打开每个玩偶才能获得下一个小玩偶。
暂时进行这种心理锻炼。试着想象一下你会怎么做?换句话说,如果没有先关闭它,你会如何将娃娃放入下一个较大的娃娃?你可以放入基地并将所有头部留到最后,但这不是俄罗斯嵌套娃娃的工作方式。你不能把头放在不按顺序。
这就是你要求编译器依次关闭每个项目并且编译器只能接受明确的指令,因此无法确定你的意图。
对于视觉,请考虑这种结构。它是有序的,并且立即具有逻辑意义。有意义的是嵌套。每个结构都嵌套在另一个结构中。
--------+
--+ |
| |
--+ |
------+ |
----+ | |
| | |
----+ | |
------+ |
--------+
与此相比:
------+
--------+
--+ | |
--|-+ | |
--|-------+
| | | | |
--+ | | | |
| | | |
----|-+ | |
----+ | |
--------+ |
----------+
按照以下步骤尝试将这些嵌套玩偶重新组合在一起:
答案 2 :(得分:2)
你不能拥有:
With X
For Y
End With
Next Y
原因是当第一次迭代后Y循环时,当你关闭循环时没有X.
但是,您可以在With中设置多个for循环,或者在其中进行一些高级IF检查。
puzzlepiece87为你修复了代码,但我注意到你在其中一条评论中问过为什么会这样。