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