2013-01-13 66 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

相關問題