Страницы: 1
RSS
Как отследить перетаскиваемые ячейки?
 
Доброго времени суток.
Есть задача: в определенной области пользователю разрешено перетаскивание ячеек, но в перделах одной строки. То есть, если берешь ячейку С5, то перетащить ее можно в А5, D5, E5 и т.д., но не в F6 или A4.
Подскажите, пожалуйса, как поставить защиту от того, чтобы пользователь не менял строку во время перетаскивания? Какие методы и события можно для этого использовать?

Заранее спасибо.
 
За перетаскивание "отвечает" метод Cut(Вырезать), но, насколько я помню, такое событие листа(книги) не отслеживается
Согласие есть продукт при полном непротивлении сторон
 
Да в общем-то кодом можно. Вставить в модуль листа(правый клик мыши на ярлыке листа-Исходный текст):
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lPrevR As Long, lNowR As Long
    lNowR = Target.Row
    lPrevR = Selection.Row
    If lNowR <> lPrevR Then
        With Application
            .EnableEvents = 0
            .Undo
            .EnableEvents = 1
        End With
    End If
End Sub
Однако код сырой(набросал по быстрому) и требует серьезной на мой взгляд доработки - выложен как пример. А именно - он не даст не только перенести ячейки, но и банально изменить значение, т.к. курсор перескочит на другую строку, что повлечет прописанную в коде отмену.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Большое спасибо. Я тоже думал про Change, но не знал как выделить начальный и конечный адрес.Изменить значение конечно можно, если переместить курсор на ту же строчку, но конечно желательно придумать, чтобы пользователю было поудобней.
Еще раз большое спасибо за наводку.
 
Приложил вариант, в котором перетаскивание ячеек возможно только в пределах активной строки заданного диапазона.
Редактирование, вырезание и копирование не лимитированы. Работает отмена действия (undo).
Изменено: ZVI - 16.03.2015 07:55:46
 
Цитата
ZVI написал: перетаскивание ячеек возможно только в пределах активной строки заданного диапазона
попробовал... у меня получается перетаскивание в пределах заданного диапазона, НЕ только в пределах активной строки
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Цитата
Михаил Лебедев написал: у меня получается перетаскивание в пределах заданного диапазона, НЕ только в пределах активной строки
Макросы при этом включены? Опишите, пожалуйста, последовательность Ваших действий, чтобы я их смог повторить.
 
Мне тоже интересен порядок действий. Попробовал - из одной строки в другую никак не перетаскивается - появляется сообщение.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Упс... Да, не проверил до конца.
Попался на следующем:
При перетаскивании за пределы диапазона - сразу выскакивает сообщ. об отмене действий. ОК.
При перетаскивании в пределах диапазона - сначала выскакивает сообщ. "Заменить содержимое конечных ячеек?". На это и попался. Не подумал, что оказывается, при согласии с вопросом (при нажатии ОК) - всё равно будет сообщ. об отмене действий. Нелогично, согласитесь :) (подразнили, а потом всё равно не дали :) )

Кстати (1), если исходить из логики, что перетаскивание - не обязательно мышкой можно сделать, а еще и путем команд "Вырезать" и "Вставить" - тоже не поможет данный макрос. Мои действия:
1. Выделяю блок В6:В8. Жму Ctrl+C
2. Встаю на B8. Жму Ctrl+V.
В результате - данные оказываются в В8:В10.

Кстати (2), перетаскивание с пом. ЛКМ - дает тоже нежелательный результат.
1. Встал на D6.
2. Перетащил в D7 с пом ЛКМ, выбрал из контекстного меню "Копировать только значения". Всё :(
Изменено: Михаил Лебедев - 07.03.2015 15:41:48
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Конечно, код от ZVI - это то, что доктор прописал. Мои пользователи не будут специально обманывать программу, это не в их интересах. Они просили просто защитить от смены строк при перетаскивании...
В общем, ZVI - огромное спасибо за готовое решение. Я пока не могу понять принцип работы программы, поскольку такие вещи ни разу еще не использовал. Будем разбираться...
Еще раз всем большое спасибо.
 
Цитата
Михаил Лебедев написал: ... Кстати (1) ... Кстати (2)...
Михаил, обе эти ситуации - копирование значений ячеек, а не перетаскивание ячеек.
В сообщении #5 я указал, что "Редактирование, вырезание и копирование не лимитированы".
Посмотрите - в сообщении #1 Автора темы ведь требовалось только конкретная блокировка перетаскивания ячеек, а не копирования.
Если Вам нужно реализовать другие блокировки, то уточните, какие именно ( точно ли нужно? ;) )
 
Цитата
aws1967 написал: Я пока не могу понять принцип работы программы, поскольку такие вещи ни разу еще не использовал
Да и я тоже раньше это не использовал, просто показалось интересным попробовать.
Принцип работы основан на экспериментально выявленном факте, что при перетаскивании срабатывают последовательно следующие события:
1. Событие Change для ячейки/диапазона источника. При этом диапазон источника Target  запоминается в переменной x.
2. Событие Change для ячейки/диапазона результата переноса. Если при этом строка диапазона результата Target не совпадает со строкой запомненного диапазона источника x, то  выводится предупреждение и действие отменяется.
3. Событие SelectionChange. Переменная x очищается.

Все остальные навороты - для отработки прочих нюансов: автозапуск при загрузке книги, разблокировка при переходах на другие листы, блокировка перетаскивания нескольких ячеек строки частично за пределы заданного диапазона, блокировка возможности перетаскивания вне пределов заданного диапазона, разблокировка копирования и т.п.
Изменено: ZVI - 08.03.2015 07:10:36
 
ZVI, большое спасибо за описание. Все вопросы вроде бы снялись, все работает.:D
 
aws1967, приятно, что помогло, да и самому было интересно :)
 
Обновил вложение к сообщению #5, добавив автоматическое восстановление возможности перетаскивания ячеек перед закрытием книги. Иначе, в определенных ситуациях блокировка перетаскивания ячеек могла запомниться и для последующих запусков Excel. Спасибо Карену (k61), что посоветовал сделать это!
Изменено: ZVI - 16.03.2015 08:05:09
 
Спасибо Владимиру за технологичное и красивое решение, как всегда!

PS Вот еще хорошая статья Jan Karel Pieterse под названием Catching Paste Operations, там есть несколько приемчиков по отлову нежелательных Ctrl-V и пр.
F1 творит чудеса
Страницы: 1
Наверх