Excel vba запрет печати

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

Нажмите сочетание Alt+F11, чтобы открыть редактор Visual Basic или воспользуйтесь кнопкой Visual Basic на вкладке Разработчик (Developer). Найдите в левом верхнем углу в окне Project модуль ЭтаКнига (ThisWorkbook) и откройте его двойным щелчком левой кнопки мыши:

print-taboo1.png

В открывшееся окно скопируйте и вставьте простой код макроса:

Private Sub Workbook_BeforePrint(Cancel As Boolean) 
    Cancel = True 
    MsgBox "Распечатка этой книги запрещена!", vbCritical
End Sub

Технически, этот код представляет собой обработчик события отправки документа на печать. Команда Cancel=True отменяет стандартную последовательность действий Excel в этом случае, т.е. распечатку, заменяя ее на вывод сообщения о блокировке:

print-taboo2.png

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

Ссылки по теме

  • Отслеживание входа пользователей в книгу Excel
  • 4 способа защиты данных в Excel
  • Как сделать лист суперскрытым

Как запретить пользователям печатать лист?

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

Запретить пользователям печатать один указанный рабочий лист с помощью VBA

Запретить пользователям печатать всю книгу с помощью VBA


стрелка синий правый пузырь Запретить пользователям печатать один указанный рабочий лист с помощью VBA

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

1. Активируйте свой рабочий лист, для которого вы хотите отключить функцию печати.

2. Удерживайте ALT + F11 , чтобы открыть Окно Microsoft Visual Basic для приложений.

3. А потом слева Обозреватель проекта, двойной щелчок Эта рабочая тетрадь чтобы открыть модуль, и вставьте в него следующий код:

Код VBA: запретить пользователям печатать один указанный рабочий лист

Private Sub Workbook_BeforePrint(Cancel As Boolean)
'Update 20140625
Dim WsName As String
WsName = "Sheet1"
For Each xWs In Application.ActiveWorkbook.Windows(1).SelectedSheets
    If xWs.Name = WsName Then
    MsgBox ("You can not print this worksheet")
        Cancel = True
    End If
Next
End Sub

doc-prevent-Printing-1

Примечание: В приведенном выше коде Sheet1 это активный рабочий лист, который вы не можете распечатать.

4. Затем сохраните и закройте этот код, и теперь, когда вы попытаетесь распечатать этот конкретный рабочий лист, вы получите следующее предупреждение.

doc-prevent-Printing-1

Внимание: С этим кодом не разрешается печатать единственный конкретный рабочий лист, но другие листы можно печатать как обычно.


стрелка синий правый пузырь Запретить пользователям печатать всю книгу с помощью VBA

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

1. Откройте книгу, которую вы не разрешаете распечатывать другим пользователям.

2. Удерживайте ALT + F11 , чтобы открыть Окно Microsoft Visual Basic для приложений.

3. А потом слева Обозреватель проекта, двойной щелчок Эта рабочая тетрадь чтобы открыть модуль, и вставьте в него следующий код:

Код VBA: запретить пользователям печатать один указанный рабочий лист

Private Sub Workbook_BeforePrint(Cancel As Boolean)
'Update 20140626
Cancel = True
MsgBox "You can't print this workbook"
End Sub

doc-prevent-Printing-1

4. Затем сохраните и закройте этот код и вернитесь к книге, и теперь, когда вы распечатываете один рабочий лист или всю книгу, их нельзя будет распечатать, и вы получите следующее предупреждение:

doc-prevent-Printing-1


Статьи по теме:

Как распечатать несколько книг в Excel?

Как распечатать диапазоны в Excel?

Как быстро распечатать текущую страницу в Excel?

Как распечатать длинную колонку на одной странице в Excel?


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Хотя в Excel реализована общая защита рабочих книг и листов, этот грубый инструмент не может предоставить пользователям ограниченные привилегии — если только вы не примените какие-то трюки. [1] Управлять действиями пользователей можно путем ответов на события. События — это действия, которые происходят по мере того, как вы работаете с книгами и листами. Наиболее часто происходящие события — это открытие рабочей книги, ее сохранение и закрытие после завершения работы. Вы можете заставить Excel автоматически выполнять некоторый код Visual Basic в момент, когда происходит одно из этих событий.

Отключение в рабочей книге команды Сохранить

Можно сделать так, чтобы рабочую книгу нельзя было сохранить, и она открывалась в режиме «только для чтения». Для этого в вашей книге выполните команду Сохранить как и в окне Сохранение документа кликните на стрелку вниз на кнопке Сервис (рис. 1). Выберите опцию Общие параметры.

Рис. 1. Доступ к меню Общие параметры при сохранении книги Excel

Рис. 1. Доступ к меню Общие параметры при сохранении книги Excel

Скачать заметку в формате Word или pdf, примеры в формате Excel (файл содержит макросы)

В открывшемся окне Общие параметры (рис. 2) задайте Пароль для изменения и кликните на Рекомендовать доступ только для чтения. Кликните Ok, повторите ввод пароля, и сохраните книгу. Если появится окно Книга с таким именем уже существует, заменить ее? Кликните Да.

Рис. 2. Задание пароля для изменения книги в окне Общие параметры

Рис. 2. Задание пароля для изменения книги в окне Общие параметры

Отключение в рабочей книге команды Сохранить как

В предыдущем разделе вы научились не давать возможность пользователям сохранить книгу поверх вашей, но хитрые пользователи могут сохранить копию книги в другом месте. 🙂 Чтобы отключить эту возможность, потребуется код VBA.

Событие Before Save, которое вы будете использовать в следующем коде, было впервые создано в Excel 97. Как предполагает его имя, это событие происходит перед сохранением рабочей книги, позволяя вам поймать действия пользователя еще перед этим фактом, выдать предупреждение и запретить Excel сохранять файл.

Перед тем как пытаться выполнить следующий трюк, обязательно сначала сохраните рабочую книгу в формате с поддержкой макросов *.xlsm. Если вы напишете этот код до того, как сохраните книгу, то не сможете более сохранять изменения.

Чтобы написать код, откройте рабочую книгу и пройдите по меню Разработчик –> Visual Basic. [2] В окне Microsoft Visual Basic for Applications перейдите в окно ProjectVBAProject. Если нужно раскройте строку VBAProject (Защита книги Excel от копирования и печати. Примеры) и правой кнопкой мыши щелкните на значке ЭтаКнига. Выберите опцию View Code (рис. 3). Откроется окно Защита книги Excel от копирования и печати. Примеры.xlsx — Эта книга (Code). Это окно частного модуля для объекта ЭтаКнига. Это важно, и вы не добьетесь цели, если запишите код в обычном модуле.

Рис. 3. Открыто окно частного модуля для объекта рабочей книги

Рис. 3. Открыто окно частного модуля для объекта ЭтаКнига

Введите следующий код (рис. 4) и нажмите сочетание клавиш Alt+Q, чтобы вернуться в Excel.

Option Explicit
Private Sub workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim lReply As Long
    If SaveAsUI = True Then
        lReply = MsgBox("Sorry, you are not allowed to save this workbook as another name. " _
                & "Do you wish to save this workbook.", vbQuestion + vbOKCancel)
        Cancel = (lReply = vbCancel)
    If Cancel = False Then Me.Save
        Cancel = True
    End If
End Sub

Рис. 4. Код в частном модуле ЭтаКнига

Рис. 4. Код в частном модуле ЭтаКнига (чтобы увеличить изображение, кликните на картинке правой кнопкой мыши и выберите опцию Открыть картинку в новой вкладке)

Проверьте, что получилось. Выберите команду Файл –> Сохранить как, вы увидите сообщение о том, что эту книгу запрещено сохранять под другим именем (рис. 5).

Рис. 5. Сообщение о запрете на сохранение книги под другим именем

Рис. 5. Сообщение о запрете на сохранение книги под другим именем

Очень хитрые пользователи могут открыть редактор VBA, удалить код, и сохранить книгу в другом месте или с другим именем.

Запрет печати рабочей книги

Итак, вы запретили сохранение книги, копирование книги в другое место, но пользователи всё еще могут распечатать данные. При помощи события Excel Before Print можно отследить и предупредить действия пользователя. Как и ранее, откройте окно частного модуля для объекта ЭтаКнига и введите код:

Option Explicit
Private Sub workbook_BeforePrint(Cancel As Boolean)
    Cancel = True
    MsgBox "Выводить эту рабочую книгу на печать нельзя", vbInformation
End Sub

Закончив ввод кода, нажмите сочетание клавиш Alt+Q, чтобы вернуться в Excel. Теперь каждый раз, когда пользователи будут пытаться напечатать эту рабочую книгу, ничего не случится. Строка сообщения MsgBox не обязательна, но всегда полезно включать ее, хотя бы для того, чтобы проинформировать пользователя.

Если вы хотите, чтобы пользователи не могли печатать только определенные листы в книге, вместо предыдущего кода используйте следующий:

Option Explicit
Private Sub workbook_BeforePrint(Cancel As Boolean)
    Select Case ActiveSheet.Name
        Case "Sheet1", "Sheet2"
            Cancel = True
            MsgBox "Выводить этот рабочий лист на печать нельзя", vbInformation
    End Select
End Sub

Обратите внимание, что печать будет остановлена только для листов Sheet1 и Sheet2. Конечно, имена листов вашей рабочей книги могут быть любыми. Чтобы добавить их в список кода, запишите их в кавычках, разделяя запятыми. Если вы хотите запретить печать только одного листа, укажите только одно название в кавычках, не ставя запятую.

У хитрых пользователей всё еще останется возможность сделать скриншот экрана с вашей засекреченной книгой.

К сожалению, пользователи могут обойти эту защиту и иным путем. Им достаточно полностью отключить макросы. Для этого нужно пройти по меню Файл –> Параметры –> Центр управления безопасностью, и кликнуть на кнопке Параметры центра управления безопасностью. В открывшемся окне перейти на складку Параметры макросов и поставить переключатель в позицию Отключить все макросы без уведомления. С другой стороны, если в электронной таблице будут находиться и полезные для них макросы, пользователи, вероятно, включат использование макросов. Описанные трюки представляют собой просто удобную возможность и не обеспечивают мощной защиты данных.

[1] По материалам книги Д.Холи, Р.Холи. Excel 2007. Трюки, стр. 28–32

[2] Если вкладка Разработчик отсутствует, пройдите по меню Файл –> Параметры Excel –> Настроить ленту. Поставьте галочку напротив вкладки Разработчик.

Disable Printing Capabilities In Excel Spreadsheet File

Sometimes when you have models that are dealing with sensitive information, you want to take extra steps to prevent that data from getting passed around. In this article, you will be walked through different scenarios where you can prevent anyone from using the Print features to makes printouts of your Excel tabs.

A Couple Caveats To Disabling The Printing

First, I’ll state the obvious. While this solution might deter people from printing your worksheets, it will definitely not prevent people from taking screenshots and printing those. This solution is really just going to make it a hassle to print out your data and hopeful serves as a reminder to your audience that they shouldn’t be printing out the data stored in the workbook.

Secondly, the VBA you will be using is going to be triggered by the «Printing» action and therefore, it will only work if VBA Events are enabled in Excel. VBA Events are enabled by default and can only be turned off when macros are disabled or when your use VBA code to turn VBA Events off.

Most Excel users are not going to be advanced enough to know to turn off VBA Events, but it might be a good idea to create a physical button in your workbook that the user must click in order to use the file.  A common practice would be to hide all the worksheets with the xlVeryHidden property and leave a single worksheet with a button that is assigned to a macro. Once clicked, the button could execute code to unhide all the worksheets and ensure that VBA Events are active. This code could look something like this:

Sub FileStartup()

Dim sht As Worksheet

‘Optimize Code
  Application.ScreenUpdating = True

‘Loop Through Each Worksheet And Unhide
  For Each sht In ThisWorkbook.Worksheets
    sht.Visible = xlVisible
  Next sht

‘Ensure VBA Events Are Turned On
  Application.EnableEvents = True

End Sub

Where To Store These Macros

VBA ThisWorkbook Object Module

Unlike normal VBA macros and functions, event-triggered macros need to be stored in a Worksheet Object Module or in the case of this article, the Workbook Object Module. To get to this module, you will need to double-click on the ThisWorkbook Object name within the Microsoft Excel Objects folder in your Project Window (within the Visual Basic Editor). After you double-click, you will see a white sheet appear and you can proceed to store your event-triggered macros within the object. For further information on this subject, you can read my article discussing how to trigger your macros automatically with event handlers.

VBA Macro To Prevent Anything From Being Printed

I first going to start out with a VBA snippet that will disable printing for the entire workbook. It is going to be «triggered» on the BeforePrint event….which means the code will run before any printing can be had.

This code is actually quite simple in that it literally just changes the figurative Cancel button on (ie True) and then notifies the user that they cannot print any worksheet with this Excel file.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
‘PURPOSE: Prevent user from printing this workbook
‘NOTES: This Code Must Reside in the ThisWorkbook Object
‘SOURCE: www.TheSpreadsheetGuru.com/the-code-vault

‘Cancel the Print Request
  Cancel = True

‘Notify User They Cannot Print this workbook
  MsgBox «You do not have permission to print this file», vbOKOnly, «Cannot Print»

  End Sub

Prevent Printing Of A Specific Worksheet

Now let’s take the previous macro code one step further and assume you only really care about one worksheet being printed. Provide a name of the worksheet you want to disable and the code will go through and check to see if that particular worksheet is currently selected to print.

If someone wanted to be cute, they could just change the name of the worksheet and bypass this macro’s functionality. To strengthen this macro even more, I would recommend referencing the code name instead of the text name as most people don’t know how to change a worksheet’s code name.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
‘PURPOSE: Prevent user from printing A Specific Worksheet
‘NOTES: This Code Must Reside in the ThisWorkbook Object
‘SOURCE: www.TheSpreadsheetGuru.com/the-code-vault

Dim WorksheetName As String
Dim sht As Worksheet

WorksheetName = «Sheet1»

For Each sht In ThisWorkbook.Windows(1).SelectedSheets

    If sht.Name = WorksheetName Then
    ‘Cancel the Print Request
      Cancel = True
      Exit For
  End If
Next sht

‘Notify User They Cannot Print this workbook
  MsgBox «You do not have permission to print the [» _
   & WorksheetName & «] worksheet», vbOKOnly, «Cannot Print»

  End Sub

Disable Printing For Multiple Worksheets

Below is another variation that allows you to prevent the printing of multiple specifc worksheets within your Excel file. Again, you can strengthen this by using worksheet code name references instead of the worksheet name.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
‘PURPOSE: Prevent user from printing Specific Worksheets
‘NOTES: This Code Must Reside in the ThisWorkbook Object
‘SOURCE: www.TheSpreadsheetGuru.com/the-code-vault

Dim DoNotPrintList As String
Dim DisablePrint As Variant
Dim sht As Worksheet

‘Store Names of worksheets that can’t be printed
  DisablePrint = Array(«Sheet1», «Sheet3», «Sheet5»)

‘Create a list of all the sheets not allowed to be printed
  For x = LBound(DisablePrint) To UBound(DisablePrint)
    DoNotPrintList = DoNotPrintList & DisablePrint(x) & «;»
  Next x

‘Loop through each worksheet that is currently selected
  For Each sht In ThisWorkbook.Windows(1).SelectedSheets
    ‘Cancel the Print Request if Sheet Name Should not be printed
      If DoNotPrintList Like «*» & sht.Name & «;*» Then
        Cancel = True
        Exit For
      End If
  Next sht

‘Notify User They Cannot Print this worksheet
  MsgBox «You do not have permission to print the [» _
   & sht.Name & «] worksheet», vbOKOnly, «Cannot Print»

  End Sub

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!

— Chris
Founder, TheSpreadsheetGuru.com

Запретить печать можно с помощью обработчика события BeforePrint в модуле книги.

Код: Выделить всё

Private Sub Workbook_BeforePrint(Cancel As Boolean)
  Cancel = True
End Sub

Но это естественно не работает, если сакросы выключить.

Чтобы запретить печать конкретного листа, то в этом же обработчике можно пробежаться по коллекции ActiveWindow.SelectedSheets и посмотреть, не входит ли туда защищаемый лист.

Код: Выделить всё

Dim Sh as Sheet
.........

For Sh in ActiveWindow.SelectedSheets
   'Тут определяем, не является ли Sh защищаемым листом.
Next

Но вот вопрос, как оптеределить, что это именно тот самый защищаемый лист? Если по названию, то всегда можно будет переименовать лист и распечатать… Если как-то по-другому, то по-другому это можно будет обойти…

Короче все это от лукавого…

Понравилась статья? Поделить с друзьями:
  • Excel vba запрет на вставку
  • Excel vba если ячейка выделена
  • Excel vba заполнить диапазон ячеек в excel
  • Excel vba если файл открыт то закрыть
  • Excel vba заполнить двумерный массив