#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