2016-11-13 1 views
1

У меня есть таблица Excel с листом «CR», где заполняются столбцы от A до K, причем первая строка является строкой заголовка.Excel VBA установил область печати в последнюю строку с данными

Строки 1-1000 отформатированы (границы), а столбец A содержит формулу для автоматического набора строк при вводе данных в столбце F.

Лист «CR» защищен, чтобы пользователи не могли вводить данные в столбце A (заблокировано).

Используя функцию Workbook_BeforePrint, я пытаюсь установить область печати в столбцы от A до K и в последнюю строку столбца A, содержащую номер.

Мой код (в объекте «ThisWorkbook») выглядит следующим образом:

Private Sub Workbook_BeforePrint(Cancel As Boolean) 
Dim ws As Worksheet 
Dim lastRow As Long 

Set ws = ThisWorkbook.Sheets("CR") 

' find the last row with data in column A 
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 

ws.PageSetup.PrintArea = ws.Range("A1:K" & lastRow).Address 
End Sub 

Однако, когда в меню Файл -> Печать, диапазон столбцов от А до K до грести 1000 отображается вместо только строки, которые имеют число в столбце A. Что я делаю неправильно?

ответ

0

Изменение:

lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 

To:

lastRow = [LOOKUP(2,1/(A1:A65536<>""),ROW(A1:A65536))] 
+0

Я обновил код с вашими изменениями, но он все еще показывает все. – Antoon

+0

Извините. Исправлено выше, если ваши данные не превышают 65536 строк. – David

+0

Спасибо, что работает (также при предварительном просмотре при нажатии «Файл» -> «Печать») – Antoon

0

.End(...) будет действовать как Ctrl + стрелка-ключа. если клетка имеет формулу (которая выглядит пустым из-за формулы, то он все равно будет останавливаться на достигнутом ... другой способ будет использование оценки (если вы не хотите, чтобы петли), как это:

lastRow = .Evaluate("MAX(IFERROR(MATCH(1E+100,A:A,1),0),IFERROR(MATCH(""zzz"",A:A,1),0))") 

Это даст последнюю строку (которая имеет значение в столбце A).

Также проверьте, есть ли скрытые значения (ищет пустой формат номера или символы, которые вы не можете видеть напрямую). Попробуйте пройти ниже строки 1000 в столбце A (выберите ячейку после A1000 в столбце A) и нажмите ctrl + до подтверждения, где она остановлена ​​(и почему).

EDIT:
(относительно вашего комментария)

"" еще приводит к "стоп" для .End(...) -команды. Поэтому либо используйте мою формулу, переводя формулу в vba, либо зацикливая ячейки, они получают последнее значение. Также Find - хороший инструмент (если не делать это снова и снова бесчисленное количество раз).

lastRow = .Cells.Find("*", .Range("B1"), xlValues, , xlByColumns, xlPrevious).Row 
+0

Действительно, если я выбираю ячейку A1010 и нажимаю Ctrl + up, выбирается ячейка A1000, которая содержит формулу: = IF (F1000 <> "", ROW() -1, ""), но в нем нет значения. Если я удалю формулу в ячейках A990 до A1000 и нажимаю Ctrl + up, выбирается ячейка A989 => она определенно связана с формулой в ячейках, а не с форматированием (границами). – Antoon

+0

@ Обратите внимание, что мое редактирование ... поиск чего-либо только по значениям также пропускает ячейки формулы, если они выводят '' "' –

+0

Когда я пытаюсь распечатать с кодом 'lastRow = .Evaluate ("MAX (IFERROR (MATCH (1E + 100, A: A, 1), 0), IFERROR (MATCH ("" zzz "", A: A, 1), 0)) ") 'он дает мне ошибку компиляции: недопустимая или неквалифицированная ссылка, и это Основные моменты. Оценка – Antoon

 Смежные вопросы

  • Нет связанных вопросов^_^