Страницы: 1
RSS
VBA. Задание области печати переменными
 
Здравствуйте!
Надо задать область печати по последней заполненной ячейке. Приведенный ниже макрос корректно определяет последнюю строку и столбец. Ячейка в строке, по которой определяется последний столбец имеет длинный текст, который выходит за границу ячейки/столбца и не смотря на правильно определенный и заданный номер последнего столбца область печати задается не по указанному столбцу, а по краю длинного текста.
Что с этим делать, подскажите?
Код
Sub пример()
    Windows("пример.xlsx").Activate
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    LastClm = Cells(1, Columns.Count).End(xlToLeft).Column
    MsgBox LastRow
    MsgBox LastClm
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, LastClm))
        End Sub
Изменено: jfd - 29.01.2013 18:11:55
 
Не хватило самой малости
Код
ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, LastClm)).Address
 
Спасибо, все заработало как надо.
Но почему не работало если подставлялись правильные значения строк и столбцов диапазона?
 
Потому что свойство PrintArea принимает в качестве аргумента текст(т.е. адрес диапазона), а не сам диапазон как объект.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Добрый всем вечер.
Подскажите, пожалуйста, как изменить данный макрос, чтобы область печати задавать по последней не пустой строке (или ячейке) только определенного диапазона столбцов, например А:Н.
Использую режим разметки страницы, необходимо выводить на печать только первую страницу и те, которые расположены под ней (при их заполнении), без страниц, расположенных справа от первой.
Заранее всем большое спасибо!
 
Код
Sub PrintArea()
    LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub


8 - это номер столбца H
 
Выдает ошибку - переменная не определена(
 
Dim LastRow As Long
 
SerjVorotilov,  сорри, к Option Explicit я себя пока не приучил  :)
Можно обойтись без переменной
Код
Sub PrintArea()
    With ActiveSheet
        .PageSetup.PrintArea = Range(Cells(1, 1), Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 8)).Address
    End With
End Sub
 
Большое спасибо Вам, Sergei_A и Kuzmich
Чуть позже отпишусь.
 
Что-то не могу понять - область печати в обоих случаях - диапазон А1:Н1, несморя на наличие данных в ячейках, расположенных ниже (но в диапазоне А:Н)
Может что-то не так делаю?
Или не так объяснил?
Необходимо, чтобы область печати была от А1 до Нх, где х - номер строки, содержащей последнюю непустую ячейку в столбах А-Н.
Файл прилагаю
 
Не думал, что у Вас первый столбец пустой, по-этому всегда лучше сразу кидать пример

Код
Sub PrintArea()
Dim LastRow As Long
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub
 
Спасибо, Сергей, то что нужно.
 
Кажется самый простой вариант
Код
Sub PrintArea11()
PageSetup.PrintArea = Range(Cells(1, 1), Cells(Cells.SpecialCells(xlLastCell).Row, 8)).Address
End Sub
 
Сделал через Worksheet_SelectionChange:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LastRow As Long
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub
Еще раз огромное спасибо Вам, Сергей.
 
Сделал через Worksheet_SelectionChange:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LastRow As Long
    LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub

Еще раз огромное спасибо Вам, Сергей.

Блин, только при использовании Worksheet_SelectionChange макрос начинает реагировать на ввод данных в столбцы, выходящие за определенный мной диапазон А:Н, что не есть гуд.
 
Воспользуйтесь событием Workbook_BeforePrint
в модуль книги

Код
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim LastRow As Long
LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
ActiveSheet.PageSetup.PrintArea = ActiveSheet.Range(Cells(1, 1), Cells(LastRow, 8)).Address
End Sub
Изменено: Sergei_A - 13.03.2013 00:44:00
 
Здравствуйте!
Пожалуйста, помогите решить проблему:
Вышеуказанные примеры работают, НО
надо определить последнюю строку/столбец на листе БЕЗ учета форматов и формул - только по отображаемому значению в ячейке,
то есть:
есть на листе большая таблица и последние строки заполнены формулами, возвращающими пустую ячейку(=""), Ваши предыдущие варианты вернут строку/столбец ячейки с последней формулой, в то время как нужно вернуть адрес ячейки только в случае, если в ячейке реально отображается какое-то значение.
Ну а по этим значениям уже задать область печати.
Спасибо за ответ!
 
Вопрос к теме не относится.
КАК ОПРЕДЕЛИТЬ ПОСЛЕДНЮЮ ЯЧЕЙКУ НА ЛИСТЕ ЧЕРЕЗ VBA? СПОСОБ 4
Согласие есть продукт при полном непротивлении сторон
 
Доброго дня!

Почему не в тему? У меня похожая задача. Смотрите вложение
По вышеприведенному коду

Сделал через Worksheet_SelectionChange:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim LastRow As Long
   LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
   ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), Cells(LastRow, 4)).Address
End Sub

у меня работает, но только нужно реализовать выделение области БЕЗ учета форматов и формул - только по отображаемому значению в ячейке.

КАК ОПРЕДЕЛИТЬ ПОСЛЕДНЮЮ ЯЧЕЙКУ НА ЛИСТЕ ЧЕРЕЗ VBA? СПОСОБ 4
Да видел я этот пример - с реализацией туго    , помогите, пожалуйста, соединить этот код с кодом из способа 4
лист Главная - при выборе из выпадающего списка в колонке В динамически меняется информация (то 10 строк, то 40 строк и т.д.), которую и надо распечатать
Изменено: marchela - 18.01.2019 12:20:36
 
marchela, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.
 
И ещё:
Цитата
marchela написал:
а по этим значениям уже задать область печати
Т.е. Ваш вопрос лишь косвенно связан с этой темой - задание области печати.
Так что Sanja  прав: поиск последней заполненной ячейки - вопрос не для этой темы.
 
Получится задать разные области печати на нескольких листах книги, чтобы область печати менялась в зависимости от значения одной ячейки в другом листе?

Если Главный!R6="a" → область печати одна,
при всех других значениях Главный!R6 → область печати другая.
 
Antag  Доброго времени суток. Возможно я не понял вас правильно. Как понял. Вариант:
Код
Option Explicit

Sub Antag_Print()
    Dim i As Long, lRow As Long, lCol As Long, iRow As Long, iCol As Long

    For i = 1 To Sheets.Count

        If ThisWorkbook.Sheets(i).Name <> "Главный" Then

            If ThisWorkbook.Worksheets("Главный").Cells(6, 18) = "a" Then
                lRow = ThisWorkbook.Sheets(i).UsedRange.Row
                lCol = ThisWorkbook.Sheets(i).UsedRange.Column
                iRow = ThisWorkbook.Sheets(i).Cells(Rows.Count, lCol).End(xlUp).Row
                iCol = ThisWorkbook.Sheets(i).Cells(lRow, Columns.Count).End(xlToLeft).Column
                ThisWorkbook.Sheets(i).PageSetup.PrintArea = ThisWorkbook.Sheets(i).Range(ThisWorkbook.Sheets(i).Cells(lRow, lCol), _
                        ThisWorkbook.Sheets(i).Cells(iRow, iCol)).Address
            Else
                lRow = ThisWorkbook.Sheets(i).UsedRange.Row + ThisWorkbook.Sheets(i).UsedRange.Rows.Count - 1
                lCol = ThisWorkbook.Sheets(i).UsedRange.Column + ThisWorkbook.Sheets(i).UsedRange.Columns.Count - 1
                ThisWorkbook.Sheets(i).PageSetup.PrintArea = ThisWorkbook.Sheets(i).Range(ThisWorkbook.Sheets(i).Cells(1, 1), _
                        ThisWorkbook.Sheets(i).Cells(lRow, lCol)).Address
            End If

        End If

    Next i

End Sub
Изменено: MikeVol - 24.01.2023 09:23:29
 
Цитата
написал:
Возможно я не понял вас правильно
Если Главный!R6="a" → область печати на других (но не на всех) листах A1:G256,
при всех других значениях Главный!R6 → область печати на других (но не на всех) листах A1:M256.
Изменено: Antag - 24.01.2023 16:06:08
 
Antag,
Цитата
Antag написал:
Если Главный!R6="a" → область печати на других (но не на всех) листах A1:G256
вы этого не указали в своём стартовом посте #23
Думаю что при таких раскладах вам не составит большого труда подстроить под ваши нужды выше мной выложеный код. Необходимо изначально чётко ставить задачи, тут экстрасенсорными способностями никто не обладает. Удачи вам.
Изменено: MikeVol - 24.01.2023 18:16:32
 
Для листов 1 и 3. Без макросов. См. Диспетчер имен
Скажи мне, кудесник, любимец ба’гов...
Страницы: 1
Наверх