所以我有一个宏,旨在为工作表的打印区域中的每个分页符插入4个标题行。当我在调试模式中逐步运行它时,它将为每个分页插入正确的标题行,但是当它单独运行时,它似乎正在跳过部分。我已经添加了Sleeps和Debug.Prints,以便找出它出错的地方,但我仍然无法弄明白。
以下是代码:
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
非常感谢任何建议或帮助。
谢谢, 凯文
答案 0 :(得分:5)
插入Pagebreak
Excel后需要重新分页才能更新HPageBreaks
集合。
为了允许Excel在代码运行时执行此操作,请使用DoEvents
代替Sleep
的
答案 1 :(得分:-1)
我目前无法访问Excel,所以我无法准确回答您的问题,但如果我是您,我会做一些不同的事情,因为现在您的代码看起来非常容易出错。
首先,每次通过循环向表单添加或删除行时,都应该向后退一步。例如:
dim i as integer
for i = mySheet.usedrange.rows.count to 1 step -1
'Put your code here
next i
在这种情况下,您必须首先执行类似于遍历分页符的操作并识别行号,然后以相反的顺序遍历行号,但这可能有所帮助。
其次,将您将使用的任何工作表分配给变量,并引用它们而不是调用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,我可以做更多。对不起,我无法提供更多帮助,但祝你好运!