Консультация № 177995
23.04.2010, 12:16
0.00 руб.
0 6 3
Как сделать модуль(макрос) в экселе, чтобы при нажатии на него печатался заданный лист. И можно ли как-нибудь сделать, чтобы перед печатью, можно было выбирать ячейки для печати?

Обсуждение

Неизвестный
23.04.2010, 12:50
общий
это ответ
Здравствуйте, Azarov88.
печать выбранного диапазона данных:
Range("C3:E12").Select
Selection.PrintOut Copies:=1, Collate:=True

печать активного листа:
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True

Вообще, все это и многое другое узнается с помощью записи макросов в Екселе (панель инстументов "Visual Basic" - красный шарик "Записать макрос". Выполняете нужные вам действия и после этого жмете "Остановить запись"-синий квадратик. Затем жмете зеленый треугольнки "Выполнить макрос" и выбираете только что записанный макрос , жмете кнопку изменить. Вуаля - все что вы делали на экране с помощью мышки, клавиатуры и меню записано в виде программы VBA. Очень удобный инструмент - всегда им пользуюсь
Неизвестный
23.04.2010, 19:59
общий
это ответ
Здравствуйте, Azarov88.

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

Sub ПечатьЛиста()
Dim wsName As String
wsName = Application.InputBox("Введите имя листа, который нужно распечатать" & vbCr & _
"ВНИМАНИЕ!!! Вводите полное и точное имя, в противном случае ничего распечатано не будет", "Печать листа", _
ActiveSheet.Name)
If Not wsName = "False" And wsName <> "" Then ' если нажата кнопка "отмена" либо не введено название - выход
On Error Resume Next ' при ошибке (введено имя несуществующего листа) - переход к следующему оператору
ThisWorkbook.Worksheets(wsName).PrintOut
End If
End Sub

Sub ПечатьДиапазона()
Dim cName As String
cName = Application.InputBox("Введите диапазон ячеек в формате ""A1:C2"", который нужно распечатать" & vbCr & _
"КАВЫЧКИ ВВОДИТЬ НЕ НУЖНО", "Печать диапазона ячеек", "A1:A1")
If Not cName = "False" And cName <> "" Then ' если нажата кнопка "Отмена" или ничего не введено - выход
On Error Resume Next ' при ошибке (неправильно введеный дипазон) - переход к следующему оператору
ActiveSheet.Range(cName).PrintOut
End If
End Sub
давно
Модератор
137394
1850
23.04.2010, 20:09
общий
...чтобы при нажатии на него печатался заданный лист...
...чтобы перед печатью, можно было выбирать ячейки для печати...
- каким образом Вы хотите выбирать лист и диапазон? Неужели руками писать с громадной вероятностью ошибиться, как в первых двух ответах? Не легче ли лист и диапазон выбрать мышкой, а затем нажать на кнопку макроса для печати? Это и многократно удобнее, и макрос в 2 строки (или в 3, в зависимости от того, хотите ли Вы отменить заданный диапазон печати)
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
23.04.2010, 20:29
общий
Megaloman:
а зачем тогда нужен макрос для печати? С этими обязанностями в полной мере справляется кнопка "печать" на панели инструментов. Именно это меня и смутило.
давно
Модератор
137394
1850
23.04.2010, 20:37
общий
Измалков Эдуард Леонидович:
С Вами трудно не согласиться Разве что макросом сэкономить на выборе в стандартном меню Задать диапазон печати а затем его отмену.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Модератор
137394
1850
23.04.2010, 21:40
общий
это ответ
Здравствуйте, Azarov88. Вот вариант ответа. Сделано в предположении, что у Вас в книге множество листов, но Вам надо попасть именно на заданный лист, на котором выбрать диапазон ячеек и распечатать его. Текст макроса:
Код:
Sub PrintList()

List = "Лист1" ' Имя листа, на который должен перейти макрос
Sheets(List).Select

Dim UserRange As Range
Application.ScreenUpdating = True

Prompt = "Отметьте диапазон мышкой"
Title = "Выбор диапазона печати"

On Error Resume Next

Set UserRange = Application.InputBox(Prompt:=Prompt, Title:=Title, Default:=Selection.Address, Type:=8)

On Error GoTo 0

If Not (UserRange Is Nothing) Then
' UserRange.Select ' Если надо выделить после работы макроса отмеченный диапазон, убрать ' (комментарий)

ActiveSheet.PageSetup.PrintArea = UserRange.Address

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
ActiveSheet.PageSetup.PrintArea = ""
End If

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

При запуске макроса он выбирает заданный лист, останавливается для ввода диапазона ячеек для печати (выбор производится мышкой), печатает указанный диапазон, отменяет диапазон печати.

Вроде бы ответил на вопрос в точности, как он поставлен
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа