2013-01-13 68 views
2

因此,我有一个宏,用于在工作表的打印区域中为每个分页符插入4个标题行。当我在调试模式下逐步运行它时,它会为每个分页符插入正确的标题行,但是当它本身运行时,它似乎在跳过部件。我已经添加了Sleeps和Debug.Prints,以便找出它出错的地方,我仍然无法弄清楚。Excel宏在调试中工作,但不能全面运行

下面是代码:

Sub InsertRowPageBreak() 

    Dim WS As Worksheet 
    Dim rng As Range 
    Dim pb As Variant 
    Dim Row As Integer 
    Dim OffSet As Integer 
    Dim InsertRow As Integer 

    Set WS = ThisWorkbook.Worksheets(1) 
    WS.Activate 
    Rows("1:1").Select 
    Selection.Delete Shift:=xlUp 
    Dim i As Integer 
    i = 1 

    For Each pb In WS.HPageBreaks 
     Debug.Print "Iteration: " & i 
     i = i + 1 

     Row = pb.Location.Row 
     Range("A" & Row).Select 
     Debug.Print "Page Break at Row: " & Row 

     If (Range("A" & Row - 2).Value Like "*Date*") Then 
      InsertRow = Row - 4 
      Range("A" & InsertRow).Select 
      ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell 
      Debug.Print "Inserting Page Break @ Row: " & InsertRow 
     Else 
      Sleep 150 
      InsertRow = Row - 1 
      Debug.Print "Inserting Row " & InsertRow 
      If (Range("D" & InsertRow).Value Like "*Compliment*") Then 
       Sleep 150 
       Sheets(2).Activate 
       Rows("1:4").Select 
       Selection.Copy 
       Sheets(1).Activate 
       Range("A" & InsertRow).Select 
       Selection.Insert Shift:=xlDown 
       ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell 
       Debug.Print "Inserted Header 1" 
      ElseIf (Range("D" & InsertRow).Value Like "*Complaint*") Then 
       Sleep 150 
       Sheets(2).Activate 
       Rows("5:8").Select 
       Selection.Copy 
       Sheets(1).Activate 
       Range("A" & InsertRow).Select 
       Selection.Insert Shift:=xlDown 
       ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell 
       Debug.Print "Inserted Header 2" 
      ElseIf (Range("D" & InsertRow).Value Like "*Question*") Then 
       Sleep 150 
       Sheets(2).Activate 
       Rows("9:12").Select 
       Selection.Copy 
       Sheets(1).Activate 
       Range("A" & InsertRow).Select 
       Selection.Insert Shift:=xlDown 
       ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell 
       Debug.Print "Inserted Header 3" 
      End If 
      Sleep 250 
     End If 
     Sleep 250 
    Next pb 

End Sub

当我运行在调试模式下Debug.Print打印出

Iteration: 1 
Page Break at Row: 33 
Inserting Row 32 
Inserted Header 1 

Iteration: 2 
Page Break at Row: 66 
Inserting Row 65 
Inserted Header 1 

Iteration: 3 
Page Break at Row: 94 
Inserting Row 93 
Inserted Header 2 

Iteration: 4 
Page Break at Row: 119 
Inserting Row 118 
Inserted Header 3

当它运行由它的自我

Iteration: 1 
Page Break at Row: 33 
Inserting Row 32 
Inserted Header 1 

Iteration: 2 
Page Break at Row: 35 
Inserting Row 34 

Iteration: 3 
Page Break at Row: 92 
Inserting Row 91 
Inserted Header 2 

Iteration: 4 
Page Break at Row: 94 
Inserting Row 93 

任何建议或帮助将不胜感激。

感谢, 凯文

回答

5

插入Pagebreak后Excel需要重新分页以更新HPageBreaks集合。

为了让Excel中的代码运行时做到这一点,使用DoEvents到位您Sleep的的

+0

我花了几个小时试图弄清楚如何完成这一切,所花的一切都是那么一点点一段代码。哇。谢谢!!!这不是我曾经使用过的一段代码。每天学些新东西。再次感谢。 “DoEvenets”为 – Peage1475

+0

+ 1 –

-1

我没有在目前访问Excel中,所以我不能准确地回答你的问题,但如果我是你,我会做一些事情不同,因为现在你代码看起来非常容易出错。

首先,任何时候通过循环向行中添加或删除行时,都应该使其向后退一步。例如:

dim i as integer 

for i = mySheet.usedrange.rows.count to 1 step -1 

    'Put your code here 

next i 

在这种情况下,你将不得不通过pagebreaks第一次做类似循环,并通过以相反的顺序行号标识的行号,然后循环,但它可能的帮助。其次,将您将要使用的任何工作表分配给一个变量,并引用这些工作表而不是调用activate方法。我也曾经使用过activate,但后来知道这是一个新手的错误,我真的不记得我为什么首先使用它。例如,而不是这样做:

Sheets(2).Activate 
Rows("1:4").Select 
Selection.Copy 
Sheets(1).Activate 
Range("A" & InsertRow).Select 

做这样的事情:

dim myBook as workbook, a as worksheet, b as worksheet 

set myBook = Excel.ActiveWorkbook 
set a = myBook.Sheets(1) 
set b = myBook.Sheets(2) 

b.rows("1:4").Select 
Selection.Copy 
a.Range("A" & InsertRow).Select 

就像我说的,我知道这并不完全回答你的问题,我就会把它放在一个如果它不是这么长时间,请发表评论,但我真的认为这将大大减少未来的错误,并有助于您的整体code smell。 如果我现在有Excel,我可以做更多。对不起,我不能多帮忙,但祝你好运!

+0

-1很好的建议,以避免'Activate'但对如何避免它非常糟糕的建议! –

+0

感谢您的帖子。我插入的大部分循环都是从下往上做的。但是,由于我每次在分页符处插入4个新行,所以我不得不自上而下,否则我已经插入的行在完成时可能不会在分页符处。 – Peage1475

+0

@chrisneilsen好吧,我现在很感兴趣。你什么意思? – Lopsided

相关问题