Страницы: 1
RSS
Автоматическая блокировка ячеек после сохранения, под разных пользователей.
 
   Всем привет. Столкнулся с проблемой, собственных навыков оОчень не хватает... Суть: есть 2 отдела, которые заносят данные в 1 таблицу (лист), но сейчас чуть что произойди, то могут зайти и изменить данные, что недавно и произошло, "кто виноват?". Таблица поделена на 2 части по сути дела. Надо: чтобы каждый отдел мог редактировать только свою часть (это не проблема стандартными средствами блокировки диапазона листа паролем). Но, чтобы определенные ячейки (столбцы) после того как в них появятся данные и файл будет сохранён (пока не сохранён - можно изменить, ато вдруг ошибся при вводе), чтобы потом их нельзя было отредактировать, даже тем отделом, кто внёс эти данные. И, чтобы в 2х столбцах, дата проставлялась дд-мм-ггг чч-мм.
  Ато просто получается в 1м отделе сделали заказ, в 16.50, и срок уже - следующий день, а потом требуют утром у 2го отдела уже продукцию (не реальные сроки) - поэтому надо чтобы время проставлял.  Так же 1й отдел может ошибиться со сроками - вместо 12 числа - поставить 22 число (срок готовности), а уже 12го требовать продукцию, предварительно 11го числа, часов в 16-17 исправив в файле дату на 12е число. (фотографировать изначальный файл 2му отделу уже %) - надоело и забывают).
  Шаблон файла прикреплю.
  В частности: Столбец В "дата заявки" (дата проставляется с учетом времени), и блокируется от изменения после записи файла. Столбец С "ожидаемая дата поставки" (дата проставляется дд-мм-гггг БЕЗ учета времени), и блокируется от изменения после записи файла. Столбец К "Дата выполнения (факт)" (дата проставляется дд-мм-гггг БЕЗ учета времени), и блокируется от изменения после записи файла.  / Столбцы А - I - чтобы мог менять только 1й отдел (пароль поставить), а столбцы J - O - чтобы мог менять только 2й отдел (пароль поставить). Ну и общий пароль для администратора, чтобы этот человек мог менять все эти данные (вносить корректировки) и быть "судьёй" - "кто виноват".
  Может кто помочь?
  Темы где "ZVI" делал похожее я смотрел, подогнать у меня не получилось под мой файл, ни макросом, ни изменением изначального файла от "ZVI".
Изменено: ScreamSc - 07.04.2022 09:12:13
 
Вариант с записью логов изменений: на листе "LOG" пишутся все внесения/изменения/удаления данных на листе совместной работы отделов. И предлагаю лист "LOG" не скрывать от сотрудников этих отделов - полная прозрачность действий ведет к нормальному рабочему климату в коллективе (8. Даже если кто-либо в целях махинации поменяет на своем компе системную дату/время при работе с файлом, то ввиду последовательности записей такой фокус не прокатит (8

Пароль листа "LOG" - 123
Снята возможность "протаскивать" ячейки, а также возможность редактировать диапазон ячеек - редактирование только по одной ячейке
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Добрый вечер.

См. вложенный файл.
Пароль к VBA-проекту: 123
Пароль листа: 000
Пароль A4:I1000: 125
Пароль K4:01000: 238

Весь код - в модуле ЭтаКнига, в начале есть константы паролей листа и диапазонов
Код
' ZVI:2022-04-07 https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&TID=148740

Option Explicit

' Passwords and departments names
Const PwdSh01 = "000" ' <-- Password of Sh01 for Admin
Const Dep1 = "Отдел1", PwdDep1 = "125"
Const Dep2 = "Отдел2", PwdDep2 = "238"

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  With Sh01
    .Unprotect PwdSh01
    On Error Resume Next
    .Protection.AllowEditRanges(Dep1).Delete
    .Protection.AllowEditRanges(Dep2).Delete
    On Error GoTo 0
    .Protect PwdSh01, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                      AllowFormattingCells:=True, AllowFiltering:=True, _
                      UserInterfaceOnly:=True
    Application.OnTime Now, "'" & Me.Name & "'!" & Me.CodeName & ".WbOpen"
  End With
End Sub

Private Sub Workbook_Open()
  Application.OnTime Now, "'" & Me.Name & "'!" & Me.CodeName & ".WbOpen"
End Sub

Private Sub WbOpen()
  
  Dim i As Long, j As Long
  
  With Sh01
    
    ' Unprotect Sh01
    .Unprotect PwdSh01
    
    ' Del AllowEditRanges of Dep1 & Dep2
    On Error Resume Next
    .Protection.AllowEditRanges(Dep1).Delete
    .Protection.AllowEditRanges(Dep2).Delete
    On Error GoTo 0
    
    ' Find last row
    j = .UsedRange.Rows.Count + 1000
    If j < 10000 Then j = 10000
    
    ' Protect actual range of Dep1
    i = .UsedRange.EntireRow.Columns("b").Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, SearchFormat:=False).Row
    .Protection.AllowEditRanges.Add Dep1, .Range("A" & i + 1 & ":I" & j), PwdDep1
    
    ' Protect actual range of Dep2
    i = .UsedRange.EntireRow.Columns("k").Cells.Find(What:="*", LookIn:=xlFormulas, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, SearchFormat:=False).Row
    .Protection.AllowEditRanges.Add Dep2, .Range("J" & i + 1 & ":O" & j), PwdDep2
    
    ' Protect Sh01
    .Protect PwdSh01, DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                      AllowFormattingCells:=True, AllowFiltering:=True, _
                      UserInterfaceOnly:=True
    
  End With
End Sub

P.S. Это - шаблон решения. Как по мне, то диапазон отдела 2 лучше оставить фиксированным, т.к. вряд ли даты в нем заполняются сверху вниз подряд (без пропусков).
Изменено: ZVI - 08.04.2022 08:14:38
 
Цитата
написал:
Вариант с записью логов изменений: на листе "LOG" пишутся все внесения/изменения/удаления данных на листе совместной работы отделов. И предлагаю лист "LOG" не скрывать от сотрудников этих отделов - полная прозрачность действий ведет к нормальному рабочему климату в коллективе (8. Даже если кто-либо в целях махинации поменяет на своем компе системную дату/время при работе с файлом, то ввиду последовательности записей такой фокус не прокатит (8Пароль листа "LOG" - 123Снята возможность "протаскивать" ячейки, а также возможность редактировать диапазон ячеек - редактирование только по одной ячейке
С логами конечно интересная идея. Но: 1 с логами работать дольше и искать. А тут они сами прибегут и скажут что накосячили. / Но за идею и реализацию - спасибо, пригодится :)
 
Цитата
написал:
Добрый вечер.См. вложенный файл.Пароль к VBA-проекту: 123Пароль листа: 000Пароль A4:I1000: 125Пароль K4:01000: 238Весь код - в модуле ЭтаКнига, в начале есть константы паролей листа и диапазонов.
P.S. Это - шаблон решения. Как по мне, то диапазон отдела 2 лучше оставить фиксированным, т.к. вряд ли даты в нем заполняются сверху вниз подряд (без пропусков).
Да, всё верно, даты там заполняются в хаотичном порядке. То есть сперва может заполниться дата ниже, а потом выше (это по мере готовности).  Вообще, у отдела 2 надо только чтобы блокировалась ячейка в столбце К (дата выполнения) после сохранения файла. Остальные ячейки могут быть не блокируемые, в частности ячейки в столбце J там просто вносится число (количество) по мере готовности, а потом туда же дописывается ещё и ещё, пока не наберется полный объем заказа от отдела 1. то есть этот столбец блокировать для изменения записей не надо вообще (отдел 2 должен его менять).
Тут мне донесли ещё информацию. у отдела 1, ячейки в столбцах Е и G так же надо блокировать. Сейчас блокируется вся строчка заказа у отдела 1. Лучше было бы, если блокировалась ячейка только когда она заполнена (не пустая). Ато может случиться так, что во время заполнения человека отвлекут, он сохранится, а строчку не заполнил полностью, а потом уже не сможет дозаполнить.
И ещё, в столбце В, дата ставится дд-мм-ггг чч-мм. Но часы и минуты ставятся 00-00, надо чтобы ставилось текущее время, то есть например, 07.04.2022 11:22.  
 
В моем варианте - шаблон решения по тому, что запрашивалось, без прочих неоговоренных нюансов.
Подразумевая, что  нюансы, конечно, будут появляться по мере работы, надеюсь, Вы отработаете их самостоятельно.

По поводу:
> И ещё, в столбце В, дата ставится дд-мм-ггг чч-мм. Но часы и минуты ставятся 00-00, надо чтобы ставилось текущее время, то есть например, 07.04.2022 11:22

Мне неведомо, кем и как ставится дата и время.
Ввел вручную: 08.04.2022  9:34 - все отобразилось.
Изменено: ZVI - 08.04.2022 09:40:19
 
Цитата
написал:
В моем варианте - шаблоне решения по тому, что запрашивалось, без прочих неоговоренных нюансов.
Ну, я изначально просил "Но, чтобы определенные ячейки (столбцы) после того как в них появятся данные и файл будет сохранён (пока не сохранён - можно изменить, ато вдруг ошибся при вводе), чтобы потом их нельзя было отредактировать" Не строчку блокировать, а ячейку/столбец когда она не пустая.
Ну да ладно, буду сам дальше ковырять.

-----И ещё, в столбце В, дата ставится дд-мм-ггг чч-мм. Но часы и минуты ставятся 00-00, надо чтобы ставилось текущее время, то есть например, 07.04.2022 11:22 ----
Ну да, ставится... я думал что понятно будет что само проставляться должно, но явно это не указал, мой косяк...  
Изменено: ScreamSc - 08.04.2022 09:47:39
 
Цитата
ScreamSc написал:
Ну да, ставится... я думал что понятно будет что само проставляться должно, но явно это не указал, мой косяк...  
В какой момент должна записываться дата?
 
Цитата
написал:
В какой момент должна записываться дата?
в момент сохранения... но можно и в момент записи в ячейке (т.к. в теории файл не должны долго держать открытым и вносить изменения оперативно (5 минут +/-)
 
Сделал по другому. Пароль отдела вводятся нажатием кнопки 'Редактирование'.
Пароли - те же. Ввод даты - по двойному клику на ячейке.
Изменено: ZVI - 08.04.2022 13:55:36
 
Цитата
написал:
Сделал по другому. Пароль отдела вводятся нажатием кнопки 'Редактирование'. Пароли - те же. Ввод даты - по двойному клику на ячейке.
Спасибо огромное, то, что надо :)
 
Цитата
ScreamSc написал: Спасибо огромное, то, что надо
Рад был помочь, удачи Вам!
Страницы: 1
Наверх