Вопрос или проблема
У меня есть 7 макросов, которые предотвращают копирование и вставку в рабочей книге.
Однако время от времени я хочу иметь возможность копировать и вставлять. Есть ли способ отключить эти макросы с помощью другого макроса?
Я могу найти информацию только о том, как отключить все макросы, и, похоже, это невозможно сделать с помощью самого макроса.
Я также хочу иметь возможность снова включать макросы и планирую запускать этот макрос при закрытии рабочей книги, чтобы следующий пользователь по умолчанию не мог копировать и вставлять.
Ниже приведены макросы, которые я использую для предотвращения копирования и вставки.
Private Sub Workbook_Activate()
Application.CutCopyMode = False
Application.OnKey "^c", ""
Application.CellDragAndDrop = False
End Sub
Private Sub Workbook_Deactivate()
Application.CellDragAndDrop = True
Application.OnKey "^c"
Application.CutCopyMode = False
End Sub
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
Application.CutCopyMode = False
Application.OnKey "^c", ""
Application.CellDragAndDrop = False
End Sub
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
Application.CellDragAndDrop = True
Application.OnKey "^c"
Application.CutCopyMode = False
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Application.CutCopyMode = False
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Application.OnKey "^c", ""
Application.CellDragAndDrop = False
Application.CutCopyMode = False
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Application.CutCopyMode = False
End Sub
К сожалению, передача статуса / информации между запуском макросов в VBA не проста, так как переменные не могут сохраняться между запусками. У вас есть два варианта:
-
изменить код с другого макроса
Более подробная информация: https://stackoverflow.com/questions/14811343/is-it-possible-in-excel-vba-to-change-the-source-code-of-module-in-another-modul -
хранить информацию о статусе в ячейке.
Вы можете использовать, например, правую нижнюю ячейку на листе, так как она не часто используется пользователями.
Вы можете изменить ваш код, например:
Private Sub Workbook_Activate()
If Sheets(1).Range("XFD1048576") = "paused" Then
Exit Sub
End If
Application.CutCopyMode = False
Application.OnKey "^c", ""
Application.CellDragAndDrop = False
End Sub
Ответ или решение
Вопрос о том, как отключить макросы, которые ограничивают функции копирования и вставки в Excel, и затем снова включить их, представляет собой интересную задачу, особенно с учетом необходимости управлять этим процессом с использованием другого макроса VBA. Давайте подробно рассмотрим решение этой задачи.
Теория
Чтобы управлять поведением макросов, которые предотвращают копирование и вставку, нам нужно создать систему переключения состояния данных макросов. Это переключение может включать и выключать заданные функции на основе определенных условий. Один из способов справиться с этой задачей — использовать некую форму хранения состояния, либо менять код других макросов программно, либо использовать ячейку или объект на листе в качестве средства хранения состояния.
Варианты решения:
-
Изменение кода макросов программно:
- Это более сложный подход, так как VBA не предоставляет прямого доступа к изменению самого себя, что подразумевает манипуляцию с кодом модулей через Visual Basic Editor (VBE). Более того, это требует наличия соответствующих разрешений безопасности.
-
Использование ячеек для хранения состояния:
- Этот подход более тривиальный и безопасный. Мы можем использовать конкретную ячейку в книге для хранения состояния макросов, например, "работает" или "отключено". Это состояние затем может использоваться для контроля выполнения или игнорирования кода, ответственного за ограничения копирования и вставки.
Пример
Давайте посмотрим, как можно применить второй метод с использованием ячеек.
-
Создание флага состояния:
Вы можете назначить крайнюю ячейку рабочего листа для хранения состояния макроса, например XFD1048576, и назвать её как, например, "paused" для отключения ограничений. -
Обновление существующих макросов:
Вы уже представили описания для нескольких макросов, которые выполняют различные задачи по ограничению действий. Они могут быть обновлены с проверкой состояния, сохраненного в обозначенной ячейке. Приведем пример для одного из макросов:Private Sub Workbook_Activate() If Sheets(1).Range("XFD1048576") = "paused" Then Exit Sub End If Application.CutCopyMode = False Application.OnKey "^c", "" Application.CellDragAndDrop = False End Sub
-
Создание макроса для переключения состояния:
Мы добавим макрос, который будет изменять статус этой ячейки между активным ("running") и неактивным ("paused") состоянием:
Sub ToggleCopyPasteRestrictions() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) ' Замените на соответствующий лист If ws.Range("XFD1048576").Value = "paused" Then ws.Range("XFD1048576").Value = "running" MsgBox "Ограничения на копирование и вставку включены.", vbInformation Else ws.Range("XFD1048576").Value = "paused" MsgBox "Ограничения на копирование и вставку отключены.", vbInformation End If End Sub
Применение
Теперь, имея макросы, вы можете их использовать, чтобы адаптировать функционал книги Excel под свои нужды. Код для проверки статуса в каждом событии гарантирует, что ограничения будут активированы или сняты в зависимости от значения в ячейке-флаге. Вы также можете вызывать ToggleCopyPasteRestrictions
из интерфейса, добавив кнопку на панели инструментов или используя сочетание клавиш.
По завершении работы, чтобы обеспечить безопасность данных, вы можете автоматически включать ограничения при закрытии книги. Для этого нужно установить макрос в событии Workbook_BeforeClose
, который инспектирует текущий статус и обновляет его, если необходимо.
Этот подход позволяет вам эффективно управлять функциями книги и обеспечивает гибкость при изменении или добавлении новых требований в будущем.