Макрос Excel - динамически устанавливаемая область печати - PullRequest
2 голосов
/ 16 марта 2011

У меня есть таблица с фиксированным количеством столбцов, но количество строк меняется неделя за неделей.

Можно ли создать макрос для автоматической установки области печати этой таблицы?

Ответы [ 6 ]

3 голосов
/ 16 марта 2011

Я бы объединил динамически изменяемый именованный диапазон с методом VBA.

Сначала создайте именованный диапазон, MyNamedRange: (при условии, что ваша таблица начинается с $ A $, а в вашей таблице есть заголовки)

=OFFSET(A1,0,0,COUNTA(A:A)-1,COUNTA(1:1))

Тогда просто выполните строку VBA:

ActiveSheet.PageSetup.PrintArea = "MyNamedRange"
1 голос
/ 09 апреля 2014

Просто используйте этот простой код:

 Private Sub prnt()
 On Error Resume Next

  Cells(1, 1).Select
  With ActiveSheet.PageSetup
    .PrintArea = Range(ActiveCell, ActiveCell.SpecialCells(xlCellTypeLastCell)).Select.Address
    .Orientation = xlLandscape
    .LeftHeader = "&p/&N"
    .LeftFooter = ActiveWorkbook.FullName 'to show address
    .PrintTitleRows = "$1:$5" 'repeat at top
    .Zoom = False
    .Orientation = xlLandscape
    .FitToPagesWide = 1 'to print in 01 page
    .FitToPagesTall = False 'to print in 01 page
  End With
End Sub
0 голосов
/ 19 февраля 2019

ActiveSheet.PageSetup.PrintArea = "MyNamedRange", как предложено выше Стивеном Коллинзом, не работает для меня.

Но если бы я напечатал слегка измененную версию: ActiveSheet.PageSetup.PrintArea = MyNamedRange.Address, тогда он отлично работает в моем контексте.

У меня был Application.ReferenceStyle = xlR1C1, а не xlA1.

Примечание: ActiveSheet.PageSetup.PrintArea = MyNamedRange.Address (ReferenceStyle: = xlR1C1) не будет работать для меня.

Аналогично, ActiveSheet.PageSetup.PrintArea = StartColumn & StartRow & ":" & EndColumn & EndRow, как предложено выше Bhanu Pratap, действительно работает очень хорошо, с первого раза. Бу не так просто управлять программно (буквы столбцов).

Но использование "R" и StartRow & "C" & StartColumn & ":" & "R" & EndRow & "C" & EndColumn --- также не работает для меня. Итак, последовательный.

Глядя на https://docs.microsoft.com/en-us/office/vba/api/excel.pagesetup.printarea в нем говорится, что « вы используете свойство Address для возврата адреса в стиле A1. »

Таким образом, ожидается, что поведение VBA не будет использовать xlR1C1, хотя его было бы намного проще использовать программно.

Мой простой способ обойти это:

Установить MyNamedRange = Worksheets (i_sheet_idx) .Range (Cells (StartRow, StartColumn), Cells (EndRow, EndColumn)) - используя те же переменные, которые были предложены выше Bhanu Pratap.

Тогда ActiveSheet.PageSetup.PrintArea = MyNameRange.Address ', который выполняет эту работу за меня.

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

NB: возможно, не связано, я столкнулся на этапе отладки - просто в строке PageSetup.PrintArea - как показано выше, странное явление, когда даже если нет ошибки (поэтому код, следующий позже после повторного запуска полностью ожидаемого и управляемого пути), мой иногда код переходит на совершенно другую подпрограмму или функцию в другой книге без причины (у меня есть другая личная книга, в которой хранится несколько рабочих макросов в нескольких модулях). Это бывает 4 раза в тестах. Я пытался найти события, которые могли бы вызвать это, но не смог найти. Иногда это была одна и та же суб-функция, вызываемая, иногда это была другая, без логической связи. Но я заметил, что раньше видел ту же функцию в другой ситуации (см. Ее основной код ниже) без веской причины. Итак, что-то должно произойти на уровне приложения. В этом «коротком куске кода», только что написанном для проверки вышеизложенного, позже я представил обработчик ошибок для перехвата err.number в случае возникновения проблемы, но, конечно, она не повторялась.

Я полагаю, что закрытие и перезапуск Excel (2013 здесь) должен исправить эту ошибку. Это случалось со мной раньше в Excel 2010. Указатель сходит с ума, но с некоторой настойчивостью, повторяющейся глупостью, которая предполагает некоторую логику. Weird.
Вот функция, чаще всего запускаемая в другом модуле в другой книге (я повторяю, что она вообще не активируется программным способом): для меня это не имеет логического смысла, но так оно и есть:

Функция HLink (rng As Range) как строка извлечь URL из гиперссылки If rng (1) .Hyperlinks.Count Then HLink = rng.Hyperlinks (1) .Address Конечная функция

Другая активируемая субмарина не имела более очевидного смысла.

0 голосов
/ 20 ноября 2017

Я попробовал это, и это сработало для меня.

StartColumn="A"
StartRow=1
EndColumn="B"
EndRow=10

ActiveSheet.PageSetup.PrintArea = StartColumn & StartRow & ":" & EndColumn & EndRow
ActiveSheet.PageSetup.PrintArea = "A1:B10"

Or 
ActiveSheet.PageSetup.PrintArea = "$" & StartColumn & "$" & StartRow & ":" & "$"  & EndColumn & "$" & EndRow
ActiveSheet.PageSetup.PrintArea = "$A$1:$B$10"
0 голосов
/ 20 сентября 2016

Полагаю, это довольно поздний ответ ... Приведенное выше решение не помогло мне в Excel 2007, поэтому я использовал

begin_column = 1
end_column = 5

begin_row = 1
end_row = 30

'converting the numbers to uppercase letters
temp_begin_column = Chr(first_column + 64)
temp_end_column = Chr(second_column + 64)

ActiveSheet.PageSetup.PrintArea = "$" & temp_begin_column & "$" & begin_row & ":$" & temp_end_column & "$" & end_row

Это может показаться сложным решением, но это единственноечто у меня надежно сработало

0 голосов
/ 17 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...