2

そのため、シートの印刷領域のページ分割ごとに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

任意の提案や助けをいただければ幸いです。

ありがとう、ケビン

4

2 に答える 2

5

挿入後、コレクションPagebreakを更新するためにExcelを再生成する必要があります。HPageBreaks

コードの実行中にExcelでこれを実行できるようにするには、のDoEvents代わりにを使用しますSleep

于 2013-01-13T03:22:45.483 に答える
-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

私が言ったように、これはあなたの質問に正確に答えないことを知っています、そしてそれがそれほど長くなければコメントに入れていただろうが、これは将来のエラーを大幅に減らし、あなたの全体的なコードに役立つと本当に思いますにおい。今Excelを持っていれば、もっと多くのことができます。申し訳ありませんが、これ以上のお手伝いはできませんが、頑張ってください!

于 2013-01-13T03:01:49.630 に答える