Страницы: 1
RSS
Программный запрет на использование буфера обмена
 
Добрый день!  
Задача такая. Нужно запретить пользователю выполнять операции копировать - вставить. Причем, пользователь может пытаться копировать информацию из другой книги, но вставить в текущую не должен. Подскажите, как?  
 
Заранее спасибо!
 
Т.е. с клавы можно, а из буфера нет? Может макросом по он тайм периодически (очень часто) очищать буфер обмена? Мала вероятность что успеет :-)
 
:)    
Спасибо, можно попробовать..  
То есть, есть лист Excel, в него можно вводить данные только с клавиатуры, нельзя использовать Copy-Past..
 
это практически единственный способ..  
но тоже не очень надежный, ибо стоит только войти в режим отладки и все рухнет
 
А если закрыть в меню опции копировать-вставить (сделать неактивными)+ запрет на использование Ctrl+C и Ctrl+V?
 
А может научить пользователя, что копи-паст не проходит, и он может потратить лишних 5 мин на ввод данных и не обрабатывать их потом как минимум сутки ручками?  
Или создать отдельный лист для ввода данных, и уже без разницы как туда они попали потому, что обработка на др. листе и вообще скрыта с глаз. Или организовать ввод только через форму с постановкой защиты на весь лист/книгу?
 
А правая мыша?
 
согласен, снять защиту от копирования очень просто, но если очень нужно, то вот макрос  
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2443450&SiteID=1  
 
лучше всего поставить на событие SelectionChange
 
Сделал с помощью OnTime.. Интервал 1 сек.. Если копировать ячейку целиком, то вставить не работает, но если войти в ячейку и скопировать ее часть, то все нормально вставляется (также при копировании информации из другого документа, вставка также доступна)..  
Этот вариант не подходит..  
 
to Igor67  
Научить пользователя очень сложно, так как их много и они все в разных местах.. Обработка на другом листе - да, это вариант.. Защита уже поставлена, оставлены отдельные ячейки для ввода информации с проверкой вводимых значений (при копировании эта защита как раз и не срабатывает)..  
 
to Артем    
Спасибо, изучаю..
 
Спасибо всем за обсуждение! Артем, вариант, который Вы предложили работает (то, что нужно), спасибо! На всякий случай привожу код, может кому пригодится:  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
   Call ClearClipboard  
End Sub  
Public Function ClearClipboard()  
   Application.CutCopyMode = False  
   OpenClipboard (0&)  
   EmptyClipboard  
   CloseClipboard  
End Function  
В Модуль 1 необходимо поместить код:  
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long  
Public Declare Function EmptyClipboard Lib "user32" () As Long  
Public Declare Function CloseClipboard Lib "user32" () As Long
 
как и предполагалось драг'н'дроп не исключает..
 
{quote}{login=слэн}{date=30.06.2008 03:05}{thema=}{post}как и предполагалось драг'н'дроп не исключает..{/post}{/quote}  
 
ну никто не мешает при прописать значения  
Application.CellDragAndDrop  
главное не забыть потом его включить)
 
{quote}{login=Дмитрий}{date=30.06.2008 01:54}{thema=}{post}Спасибо всем за обсуждение! Артем, вариант, который Вы предложили работает (то, что нужно), спасибо! На всякий случай привожу код, может кому пригодится:  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
   Call ClearClipboard  
End Sub  
Public Function ClearClipboard()  
   Application.CutCopyMode = False  
   OpenClipboard (0&)  
   EmptyClipboard  
   CloseClipboard  
End Function  
В Модуль 1 необходимо поместить код:  
Public Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long  
Public Declare Function EmptyClipboard Lib "user32" () As Long  
Public Declare Function CloseClipboard Lib "user32" () As Long{/post}{/quote}  
---  
В предложенном выше варианте есть уязвимость:  
Пусть есть 2 листа: Откуда и Куда (в смысле запретить копировать). Выбрать ячейку листа Куда, перейти на лист Откуда, скопировать, вернуться на лист Куда в выбранную заранее ячейку, и спокойно можно копировать, так как события смены ячейки нет.    
Т.е. нужно отслеживать еще и событие смены листа.  
 
Для блокировки / разблокировки копирования и вырезания можно еще (вдобавок?) использовать такой вариант:  
 
Sub Откл()  
 EnableControl 21, False   ' cut  
 EnableControl 19, False   ' copy  
 EnableControl 22, False   ' paste  
 EnableControl 755, False  ' pastespecial  
 Application.OnKey "^c", ""  
 Application.OnKey "^v", ""  
 Application.OnKey "^y", ""  
 Application.OnKey "{F4}", ""  
 Application.OnKey "+{DEL}", ""  
 Application.OnKey "+{INSERT}", ""  
 Application.CellDragAndDrop = False  
End Sub  
 
Sub Вкл()  
 EnableControl 21, True   ' cut  
 EnableControl 19, True   ' copy  
 EnableControl 22, True   ' paste  
 EnableControl 755, True  ' pastespecial  
 Application.OnKey "^c"  
 Application.OnKey "^v"  
 Application.OnKey "^y"  
 Application.OnKey "{F4}"  
 Application.OnKey "+{DEL}"  
 Application.OnKey "+{INSERT}"  
 Application.CellDragAndDrop = True  
End Sub  
 
---  
ZVI
Страницы: 1
Читают тему
Наверх