Страницы: 1
RSS
Блокировка строк с датой за предыдущие месяца
 
Доброго времени суток!
Помогите решить проблему. Необходимо блокировать строки(нельзя внести изменения), где "дата акта" за предыдущие месяцы. То есть текущий декабрь, все что до (например 30 ноября) заблокируется.
 
если без макроса, то только частично сделать это при помощи проверки данных
=OR($C2="";AND($C2>=EOMONTH(TODAY();-1)+1;$C2<=EOMONTH(TODAY();0)))
ну или если даты будующх месяцев есть и их править можно.
=OR($C2="";$C2>=EOMONTH(TODAY();-1)+1)
но это не блокирует от удалений значений.
Если добавить макрос, который будет просто блокировать удаление чего-либо в указанной области, то  получится что-то близкое, но это не защитит от операций копирования ....
А теперь внимание, что должно происходить, если случайно ввести не ту дату. сегодня поставит 06.11.2021?  Фактически заблокируется от исправлений эта строка. При этом даже если сделать код который анализирует область для запрета, то при некорректном воде даты вторичный анализ учетет эту некорректность и снова будет блокировка. То есть исправления будут доступны только  незамедлительно.
Изменено: БМВ - 06.12.2021 09:37:33
По вопросам из тем форума, личку не читаю.
 
У меня вопрос: не могу найти в файле, что вы приложили, куда вы вставили формулу?  
 
для указанной области , меню данные, проверка данных.
По вопросам из тем форума, личку не читаю.
 
может как-то так (макрос) - нажмите Alt+F8 в файле там поймёте
 
спасибо, все работает
 
Цитата
написал:
спасибо, все работает
ну ну
берем что либо , копируем и вставляем в несколько ячеек  и все сломано.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
и все сломано
Вот она, ложка дегтя в бочку мёда  :D
 
Код
Dim BlockedRange As Range

Private Sub Worksheet_Change(ByVal Target As Range)
    If WatchDog = False Or BlockedRange Is Nothing Then Exit Sub
    If Not Intersect(BlockedRange, Target) Is Nothing Then
        Application.EnableEvents = False
        Application.Undo
        Application.EnableEvents = True
        MsgBox "Íåëüçÿ ìåíÿòü ïðîøëûå ïåðèîäû!", vbExclamation, "Âíèìàíèå"
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cell As Range, Blockeddate As Date
Set BlockedRange = Nothing
Blockeddate = WorksheetFunction.EDate(Date, -1) + 1
If Not Intersect(Target, Range("a:f"), UsedRange) Is Nothing Then
    For Each cell In Intersect(UsedRange, Columns(3))
        If IsDate(cell) Then
            If cell < Blockeddate Then
                If BlockedRange Is Nothing Then
                    Set BlockedRange = cell.Offset(, -2).Resize(, 6)
                Else
                    Set BlockedRange = Union(BlockedRange, cell.Offset(, -2).Resize(, 6))
                End If
            End If
        End If
    Next
End If
End Sub
Изменено: БМВ - 06.12.2021 13:39:52
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
MsgBox "Íåëüçÿ ìåíÿòü ïðîøëûå ïåðèîäû!", vbExclamation, "Âíèìàíèå"
кодировка сбилась
P.S. А теперь как говориться - открываем файл с отключёнными макросами и... ))
Изменено: New - 06.12.2021 13:34:34
 
Цитата
New написал:
ткрываем файл с отключёнными макросами и...
ну это понятно,  но это  уже другая печальная история.  :(
Изменено: БМВ - 06.12.2021 13:40:34
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх