Страницы: 1
RSS
Контроль копирования в буфер
 
Здравствуйте, форумчане.
Ситуация следующая: есть xls, в котором с помощью условного форматирования выделяется диапазон ячеек в текущей строке с правилом
=ИЛИ(И(ЯЧЕЙКА("строка")=СТРОКА(F4);ЯЧЕЙКА("столбец")<>СТОЛБЕЦ(F4)))
Чтобы условное форматирование "обновлялось" при перемещении активной ячейки, прописал следующий код
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Calculate
End Sub
При этом в Excel 2003 обнаружилась неприятная особенность работы этого кода - при копировании ячейки/диапазона ячеек в буфер (Ctrl+C) Excel отображает бегущий пунктир вокруг скопированных ячеек, но, при попытке переместить курсор в другое место для вставки скопированного, ActiveSheet.Calculate обновляет лист и бегущий пунктир исчезает, после чего вставка (Ctrl+V) скопированных ячеек не производится.
Есть ли какой-то способ отловить флаг копирования в буфер (момент отображения бегущего пунктира вокруг скопированных ячеек), чтобы по его состоянию управлять запуском ActiveSheet.Calculate?
 
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode Then Exit Sub
    ActiveSheet.Calculate
End Sub
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, Спасибо! Не совсем идеально в моём представлении, но этого в моём случае достаточно - копирование ячеек производится всего раз в месяц. После однократной вставки скопированного не производится выход из режима копирования и соответственно ActiveSheet.Calculate не начинает работать. Для исправления этого видимо нужно ещё обработчик вставки прописывать. Но для меня главное, что теперь можно копировать. Спасибо!
 
Цитата
S_Vitaliy: Для исправления этого видимо нужно ещё обработчик вставки прописывать
или просто Esc нажать после вставки  :D
Изменено: Jack Famous - 22.01.2020 17:26:14
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
или просто Esc нажать после вставки  
Это действительно помогает, но всё же за 20 лет работы с экселем я ни разу после копипаста Esc не использовал, думаю как и все остальные. Приучить 30 сотрудников делать это именно в одном файле (табеле) после копирования списка текущих объектов с предыдущего листа (месяца) на новый будет не просто, к тому же уже после ввода значения в первую же ячейку нового месяца выделение текущих строк снова начинает работать. Но всё равно Спасибо за подсказку - хоть сам буду этим пользоваться ;)
 
Цитата
S_Vitaliy: я ни разу после копипаста Esc не использовал
а я привык постоянно "отсекаться", как и сохраняться через "Ctrl+S", впрочем вы правы насчёт человеческого фактора
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Можно так попробовать, раз вставка раз в месяц
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode Then
    Target.PasteSpecial xlPasteAll
    Application.CutCopyMode = False
    End If
    ActiveSheet.Calculate
end sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Нет Дмитрий так негоже. Это можно так навставлять, и не отменишь.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Ну это не мне решать :) Я просто привел пример возможного решения этого:
Цитата
S_Vitaliy написал:
видимо нужно ещё обработчик вставки прописывать
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А вы откуда куда копируете? С одного листа на другой лист или из книги в книгу? Или всё копирование на одном листе?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Дмитрий(The_Prist) Щербаков, это очень странный пример. Здесь получается принудительная вставка скопированного независимо от желания пользователя.
Изменено: S_Vitaliy - 22.01.2020 19:44:21
 
Цитата
Alemox написал:
А вы откуда куда копируете? С одного листа на другой лист или из книги в книгу? Или всё копирование на одном листе?
11 раз в году из одного листа в другой и один раз в году из одного файла в другой. Файл с табелем на год, в нём соответственно 12 листов (помимо технических, куда загружается информация из внешних файлов). Обычно все копируют два столбика с объектами из предыдущего месяца, потом удаляют лишние и добавляют новые. Пробовал ввести автоматическое "подхватывание" объектов из предыдущего листа - не прижилось, пришлось к старому варианту вернуться. Поэтому очень печальным оказалось, что после удобного нововведения с подсвечиванием строк, оказалось невозможно копирование с одного листа на другой.
Изменено: S_Vitaliy - 22.01.2020 19:45:21
 
Попробуйте так
Код
Option Explicit
Dim CopyPast&
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim r&, c%, d&
With ActiveSheet
    With .UsedRange
        r = .Row + .Rows.Count - 1
        c = .Column + .Columns.Count - 1
    End With
    d = Application.WorksheetFunction.CountIf(.Range(.Cells(1, 1), .Cells(r, c)), "<>" & "")
End With
With Application
    If .CutCopyMode Then
        If CopyPast <> d Then .CutCopyMode = False
        Exit Sub
    Else
        CopyPast = d
        ActiveSheet.Calculate
    End If
End With
End Sub
Изменено: Alemox - 22.01.2020 20:25:17
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Alemox, в Вашем примере добавил на второй лист код, чтобы были равные условия. Работает только если на первом листе скопировать, открыть второй лист и вставить в текущую позицию (аналогично у меня работал копипаст при изначальном отсутствии проверки флага копирования перед пересчётом листа), а если на втором листе ткнуть в другую ячейку - уже не работает вставка.

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


Предлагаю на этом остановиться - первый самый простой вариант уже внедрил в файлы коллег. Огромное спасибо за помощь!
Изменено: S_Vitaliy - 22.01.2020 21:00:50
Страницы: 1
Наверх