VB для Excel — Как вы контролируете количество пустых строк между наборами данных на листе?

#excel #vba #printing

Вопрос:

Я пытаюсь распечатать определенные столбцы с листа, на котором данные сгруппированы вдоль строк. Извините за размер, но в таблице ниже показано, как данные называются в первом столбце, а связанные данные-в столбцах 2 и 3. Я уже устранил ненужные столбцы до этого момента.

Важная часть заключается в том, как случайным образом изменяется количество строк в кластере и количество пустых строк между кластерами.

Заголовок Заголовок Заголовок
Линия данных 1 Линия данных 1 Линия данных 1
Линия данных2 Линия данных2
Линия данных3
Линия данных4
Линия данных 7 Линия данных 7 Линия данных 7
Линия данных8
Линия данных 9
Линия данных 10
Линия данных 12 Линия данных 12 Линия данных 12
Линия данных 13
Линия данных 14
Линия данных 19 Линия данных 19 Линия данных 19
Линия данных 20
Линия данных 21
Линия данных 22
Линия данных 24 Линия данных 24 Линия данных 24
Линия данных 25 Линия данных 25
Линия данных 26
Линия данных 27

Там сотни рядов этого хлама.

Это и плохо выглядит при печати, и мне будет сложно запрограммировать, куда идут разрывы страниц (сохраняя целостность кластеров на странице). Итак, я хочу программно отредактировать рабочий лист, чтобы сделать каждый промежуток между кластерами промежутком в три пустые строки. Это позволит мне установить разрывы страниц в середине промежутка в три строки, чтобы на распечатке они выглядели лучше.

Проблема в том, что я думаю, что я здесь не в своей тарелке. Я думаю, что мне нужно настроить три (более?) разных счетчика и перезапускать весь суб с каждым добавлением или удалением строки… Некоторые примеры делают это, но как я должен выполнить сброс, не тратя впустую много циклов проверки строк?

Если бы кто-нибудь мог указать мне правильное направление для примеров кода или четкого плана атаки, это было бы потрясающе.

(Или скажите мне, что я спятил, если подумаю о том, чтобы решить проблемы с разрывами страниц таким образом)

Ответ №1:

Отсканируйте лист, удалив несколько пустых строк, оставив одну. Затем отсканируйте лист, добавив разрывы страниц вручную в пустые строки по мере необходимости. Отрегулируйте максимальные размеры по размеру страницы.

 Option Explicit

Sub mymacro()

    Const MAXROWS = 40

    Dim ws As Worksheet
    Dim lastrow As Long, r As Long, n As Integer
    Dim break As Long, count As Long

    Set ws = Sheet1
    lastrow = ws.Cells(Rows.count, 3).End(xlUp).Row

    ' remove existing page breaks if any
    ws.Cells.PageBreak = xlPageBreakNone

    ' delete all except 1 empty row
    Application.ScreenUpdating = False
    For r = lastrow To 2 Step -1
        If Len(ws.Cells(r, 3)) = 0 And Len(ws.Cells(r - 1, 3)) = 0 Then
            ws.Rows(r).Delete
        End If
    Next

    ' add manual page breaks
    lastrow = ws.Cells(Rows.count, 3).End(xlUp).Row
    count = 0
    For r = 1 To lastrow
        count = count   1
        If Len(ws.Cells(r, 3)) = 0 Then
            break = r
        End If

        If count > MAXROWS Then
            ws.Rows(break   1).PageBreak = xlPageBreakManual
            count = r - break
            n = n   1
        End If

    Next
    Application.ScreenUpdating = True
    MsgBox n amp; " psge breaks inserted"
End Sub