Excel VBA中的嵌套式如果编译问题

时间:2019-01-03 18:16:21

标签: excel vba

我正在尝试获取一个Excel工作簿,以根据某些单元格参数打印出Y页数的X份副本。我有“工作”代码,但是它将向打印机发送太多打印命令,所以我要尝试的是让它选择每个适用的工作表,然后仅发送一个批处理打印命令。

我尝试选择页面并将它们存储在数组中,但是运气不佳,所以我决定使用以下代码。注释中的代码是我从工作代码中更改的内容。每次我进行编译时,都会出现“ 编译错误:如果没有阻止,则结束> ”错误。我还添加了一条注释,其中调试器最终突出显示并抛出了编译错误。我查看了缩进,验证了“ If”和“ End If”的数量,确保我的代码中没有一行“ If ... THen ...”语句,并整理了论坛以查找相关内容。我发现所有接近的内容最终都无法解决这个问题。

我正在寻找有关此代码的指导和意见。我包括整个代码减去变量分配。我从来没有发布过Stack,因为我总是能够根据其他发布来弄清楚我需要什么,但是我还是把它扔了。任何帮助,将不胜感激!我希望这只是我自己的愚蠢错误,而不是严重错误。

Application.ScreenUpdating = False

If Not IsEmpty(copies) Then
    For j = 1 To copies
        If vShts = "0" Then
            Sheets("BLANK ORDER").PrintOut
        Else

        '####Beginning of changed code####
        With ActiveWorkbook
        ThisWorkbook.Sheets("GO BACK PAGE 1").Select
        If vShts > 1 Then
            For lShCnt = 2 To vShts
                ThisWorkbook.Sheets("GO BACK PAGE " & lShCnt).Select False
            Next lShCnt
        End If
        With ActiveWorkbook
            ActiveSheet.Range("A1:S39").Select
            Selection.PrintOut preview:=True
        End With
        ThisWorkbook.Sheets(Sheet1.Name).Select
        '####End of changed code####

    End If   '<- This "End If" is where the Debugger highlights it hanging up on
Next j
Else
    If vShts = "0" Then
        Sheets("BLANK ORDER").PrintOut
    Else
        With ActiveWorkbook
            For i = 1 To vShts
                Sheets("GO BACK PAGE " & i).PrintOut
            Next i
        End With
    End If
End If

ThisWorkbook.Sheets(Sheet1.Name).Select

Application.ScreenUpdating = True

1 个答案:

答案 0 :(得分:0)

这是许多初学者一天或一天​​碰到的常见问题,除了不是那么具有建设性的“好吧,只要正确遵循语言语法!”,实际上就有避免这种问题的真正方法。

最容易使用的是 indentation -或者更确切地说,是 consistency

缩进

问题从这里开始:

    If vShts = "0" Then
        Sheets("BLANK ORDER").PrintOut
    Else

    '####Beginning of changed code####
    With ActiveWorkbook

缩进应该在此处增加:

    If vShts = "0" Then
        Sheets("BLANK ORDER").PrintOut
    Else

        '####Beginning of changed code####
        With ActiveWorkbook

If...End If块-或任何块的简单正确配对的关键实际上是一致的缩进。

每当看到不缩进下一行代码的“ block opener”时,您都可以期望出现此问题。像这样的With块,它永远不会终止,并且会导致您得到编译错误-因为编译器到达End If但期望End With

    With ActiveWorkbook
    ThisWorkbook.Sheets("GO BACK PAGE 1").Select
    ...
End If

另一种技术很难付诸实践,但是从长远来看,当真正开始命名事物并构建脚本和程序时,它确实会有所收获。

更小程序

做很多事情的大型过程要“正确”比实际需要的要难得多。使大型过程更易于管理的一种方法是将其拆分为较小的过程,以减少工作量。所以代替这个:

If condition Then
   'do stuff
   'do more stuff
   'some more stuff
Else
   'do other stuff
End If

您可以将条件分支的内容放入其自己的更小,更专门的过程中:

If condition Then
    DoStuff
Else
    DoOtherStuff
End If

您可以通过在宏/过程之外引入新的Sub语句来做到这一点:

Private Sub DoStuff()
   'do stuff
   'do more stuff
   'some more stuff
End Sub

Private Sub DoOtherStuff()
   'do other stuff
End Sub

然后,您可以在过程之间传递 parameters ,然后使用Function过程来评估这些参数并相应地返回一个值,一旦掌握了这些构建基块,一切就会变得非常有趣。 。继续前进!