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
Конечная функция
Другая активируемая субмарина не имела более очевидного смысла.