Страницы: 1
RSS
CopyPaste в VBA
 
Добрый день всем!

Облазил весь форум с похожими темами, но советы, к сожалению, не помогли.
В общем, мне нужно запретить вставку в таблицу, так как при "CopyPaste" изменяется формат, шрифт и т.д.
В макросах я вообще букварь, поэтому прошу объяснить как можно проще.
 
А, научить пользоваться "Вставка - только значения" не получится?
Скрытый текст

Вообще поиск обнадеживает в части перехвата  сочетаний
Изменено: Grr - 06.11.2015 06:42:26
 
Как вариант, по событию изменения ячейки/ек восстанавливать формат таблицы
 
Научить не вариант, т.к. все равно делают как попало.

Вставил код, чет не работает. Файл приложил.
 
Tae, в любом случае в xlsx
макросы не могут существовать. по таблице не понятно что и куда копипастится.
может умную таблицу вставить?
 
Tae, это был пример для Word.
 
Необходимо сделать так, чтобы никто в таблицу не мог ничего вставить (скопировать).
 
Цитата
Tae написал:не мог ничего вставить (скопировать)
а вручную внести что бы можно было? правильно понял?
 
Да, чтобы ТОЛЬКО вручную данные вносились или выбирались из списка.
 
Посмотрите в этой теме
 
Что то файл это не работает, вставка все равно разрешена.
 
Tae, у Вас макросы включены?

Хотя там немного не то (это моя невнимательность :()
Изменено: Catboyun - 06.11.2015 07:45:18
 
Макросы включены, но все равно не работает(
 
Код
Private Sub Worksheet_Activate()
    Application.CutCopyMode = False
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.CutCopyMode = False
End Sub

:)
 
Хитро.  
 
RAN, Тогда ещё и очистку буфера обмена надо добавить - а то вдруг из другого приложения чего-то непотребного вставить захотят.
Как вариант добавить в модуль листа ещё и такой код (для Excel с 2010)
Код
Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long

Private Sub ClearClipborad()
    OpenClipboard 0
    EmptyClipboard
    CloseClipboard
End Sub

Private Sub Worksheet_Activate()
    ClearClipborad
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ClearClipborad
End Sub

Хотя, если скопировали что-то в другом приложении, а затем сразу сделают вставку - то это не поможет.
Изменено: Андрей VG - 06.11.2015 10:38:17
 
И опять что то не то :cry:
 
http://www.excel-vba.ru/chto-umeet-excel/chto-takoe-modul-kakie-byvayut-moduli/
 
Цитата
Андрей VG написал:
а то вдруг из другого приложения чего-то непотребного вставить захотят
Хочу огорчить: если с активного листа перейдут сразу в другое приложение, там скопируют, перейдут обратно в окно Excel и вставят - код этот не спасет, т.к. ни активации листа, ни смены активной ячейки может не быть.
Поэтому лучше все же событие Change использовать и Application.Undo. Мое мнение.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А как Change привязать? Чтой-то туго...
 
Так в ссылке из сообщения #10 как раз мой файл это и делает, помимо деактивации кнопок меню. За это отвечает код в модуле книги:
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name <> sSHEET_NAME Then Exit Sub
    If Not Intersect(Target, Range(sPROTECT_RANGE)) Is Nothing Then
        Application.EnableEvents = False: Application.Undo: Application.EnableEvents = True
        Call Alert
    End If
End Sub
где sPROTECT_RANGE является константой, в которой задается текстом адрес диапазона, в который запрещено вставлять данные. И изменять тоже.
sSHEET_NAME - имя листа, на который запрещена вставка.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Так этот код запрещает все. И макросом, и ручками, и копипастом. Нет?
Изменено: RAN - 06.11.2015 21:12:41
 
RAN, тем же макросом можно запретить отслеживание событий :-) Тогда можно и вставку делать. Но вот согласен - ручками тоже ничего не изменить при таком раскладе.
А только от CopyPaste идеального варианта нет. Вот здесь ZVI предлагал вариант вставки только значений(сообщение #2) - без затирания форматов: http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=67174
Полагаю, именно это нужно автору.
Нужно только добавить проверку на нужный диапазон при необходимости и все.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
Хочу огорчить: если с активного листа перейдут сразу в другое приложение, там скопируют, перейдут обратно в окно Excel и вставят - код этот не спасет
А я о чём-то другом писал?
Цитата
Андрей VG написал:
Хотя, если скопировали что-то в другом приложении, а затем сразу сделают вставку - то это не поможет.
Или лень было пост дочитать - главное критика?

Код Владимира ZVI всем хорош, как всегда, но вот для решения основной проблемы выполнения требований "проверки данных" при вставке не решает. К тому же, если пользователь ввёл формулу, то получит только значение (хотя это дело решаемое).
 
Андрей, не хотел обидеть. Просто было написано:
Цитата
Андрей VG написал:
а то вдруг из другого приложения чего-то непотребного вставить захотят
Что предполагало, что код защитит от вставки из другого приложения. И продолжение под кодом не сильно проясняет от чего именно защищает этот код:
Цитата
Андрей VG написал:
а затем сразу сделают вставку - то это не поможет.
Есть предположение, что не я один понял Ваш код, как нечто, защищающее от вставки из др.приложения.
И еще раз прошу извинить за критику - не совсем верно понял написанное.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
Есть предположение, что не я один понял Ваш код, как нечто, защищающее от вставки из др.приложения.
Приношу свои извинения за возможную резкость в высказываниях.

Вариант с перехватом события EVENT_SYSTEM_FOREGROUND. Делал под Excel 2010 32bit. К сожалению, в известном файле Win32API_PtrSafe.TXT не нашёл описания, как правильно расставлять LongPtr для функций SetWinEventHook, UnhookWinEvent. Расставлял по наитию, как будет работать в 64bit версии не знаю. Для версии 2007 и ниже надо переделывать.
Коллеги протестируйте, пожалуйста, попробуйте вставить (естественно, при включенных макросах) что-нибудь на Лист1.
 
2010 (32) - работает )
 
2010 64 - падает Excel. Пока не разбирался в причинах(не успел, Excel упал). Подосвобожусь гляну что там с API(лень пока макросы отключать и разбирать, т.к. проект один надо до определенной точки доработать). А без отключения макросов файл почти сразу вводит Excel в ступор.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток
Коллеги, большое спасибо за тестирование.
Цитата
The_Prist написал:
2010 64 - падает Excel
Буду завтра спрашивать народ на сишных форумах, какую размерность имеют типы функции. Где то тут ошибка зарыта. Наивное указание типов по аналогии не срабатывает.
Страницы: 1
Наверх