Страницы: 1 2 След.
RSS
Запрет редактирования определенных ячеек задним числом
 
Здравствуйте.
Тема такая: есть диапазон ячеек, например A1:G5. Ячейки по нарастающей заполнены датами текущего месяца, с 01.05.2015 по 31.05.2015. Как установить запрет редактирования, значение ячеек которых больше позавчерашнего дня? Например, сегодня 07.05, для редактирования уже закрыты все ячейки с датами до 05.05 включительно, ну и завтра будет закрыт доступ для ячейки с датой 06.05.
Изменено: mvadims - 07.05.2015 11:52:15
 
Макросом. Проверкой_данных.
На Вашем примере.
 
А пример можно?
 
Можно. Показывайте.
 
Что показать? Пример заполнения таблицы? Не совсем понял, извините.
1234567
891011121314
15161718192021
22232425262728
293031
 
Чтобы понять, нужно Правила читать.
Создадут вместо Вас файл, вставят данные... А Вы потом скажете, что там не так и здесь не эдак.

Кнопка цитирования не для ответа.
 
Приложили бы файл Ексель, что есть, что нужно получить. Уже наверное бы получили ответ и пример.
Проверка данных наверное не подойдет. Там все ровно можно отредактировать. Скорее всего нужен макрос, который будет ставить защиту на ячейки или снимать эту защиту. Как то так наверное.
 
Цитата
vikttur написал: Создадут вместо Вас файл, вставят данные... А Вы потом скажете, что там не так и здесь не эдак.
Понимаю, возможны всякие случаи...
Лично я стараюсь выразить благодарность человеку уже за то, что попытался помочь. Еще раз прошу прощения.
Ссылка на файл: пример заполнения
 
Файл небольшой: всего 8К - зачем гонять людей по ссылкам?
 
Так как скачать Ваш файл нет возможности. Политика безопасности компании не позволяет. Сделал свой кривенький. Макрос в модуле ЭТА КНИГА. на открытие книги. С нужных ячеек снимаете защиту, защищаете лист. И далее редактируйте что нужно. После закрываете файл. и на открытие файла срабатывает макрос, на ячейки которые меньше указанного вами числа даты ставится защита. Я сделал защиту без пароля на лист, можете сделать с паролем.
Уж как смог сделал, раз больше никто не сделал, выкладываю то что навоял. Сделал для двух столбцов А и В. для остальных сделайте по аналогии.
Может еще кто нибудь выложит более интересное решение.
 
Большое спасибо
 
Добрый день, передо мной стоит очень похожая задача, и меня устроило решение, которое было предложено пользователем alexthegreat. Но я к сожалению не смог адаптировать это решение под свой файл.

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

Заранее благодарен за помощь!
 
KalimDooR,
так пойдет?
Общий доступ у файла выключил, чтобы код виден был. Если необходимо - можно включить его обратно.

Изменено: heso - 13.09.2016 13:21:13
 
heso, Почти. В вашем файле есть возможность изменить дату в старых строках, тем самым разблокировав эти строки. А можно узнать как это реализовано? Может я сам смогу отшлифовать неровности, а также сумею перенести алгоритм из примера в рабочий файл. Спасибо за отклик!
Изменено: KalimDooR - 14.09.2016 12:41:13
 
немного поправил код:
Код
Dim val, flag, f_val, f_row, f_column As Variant

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    Application.EnableEvents = False
    
    Set reg_date = CreateObject("VBScript.RegExp")
    reg_date.Pattern = "\d\d\.\d\d\.\d\d\d\d"
    flag = reg_date.Test(f_val)
    
    If (f_val < Str(Date)) And (Cells(f_row, f_column).FormulaLocal <> val) And (flag = True) Then
        Cells(f_row, f_column).Value = val
        MsgBox ("редактирование запрещено.")
    End If
    
    Application.EnableEvents = True
    
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    val = ActiveCell.Text
    f_row = ActiveCell.Row
    f_column = ActiveCell.Column
    f_val = Cells(f_row, 1).Text
    
End Sub
Чтобы работал, необходимо поместить в модуль ЭтаКнига.
Изменено: heso - 15.09.2016 09:43:16
 
heso, Большое спасибо!  Будем тестить.
 
Всем добрый день. Помогите мне пожалуйста тоже. Вопрос тот же самый.. Но есть маленькое но...
есть столбик дата, каждый день в столбы 1-12 в строку вписываются данные, но, скажем, например в столбах 6,10 стоят формулы с других листов, туда вбивают окончательное значение по концу дня.
А столбы 8,9 защищены от редактирования (защитой листа) и там тоже формулы с других листов.
В общем надо как-то сделать, чтобы невозможно было редактировать данные прошедших дней, но при этом функции 6,8,9,10 столбов не были затронуты...
 
Пр открытии книги снять защиту с листа, установить параметр "с защитой" для ячеек строк с прошедшей датой, установить защиту.
Макрос поместить в модуль книги.
Примеры процедуры на открытие книги Sub Workbook_Open есть, макрорекодером записать установку/снятие пароля, установку формата ячейки "с защитой".
Есть и примеры прохода циклом по строкам:
Код
For i =  To 100
    If Cells(i,1).Value<Date Then
            ' защита для ячеек строки
    End If
Next i

Сделаете все, что сможете - заходите, допилим.
 
Спасибо конечно...Но я ничего не понял)

Допустим прописали макрос, который нужен. Если взять и изменить дату на компьютере, скажем на вчерашний день, тогда можно будет и поменять данные за вчерашний день? Так же можно например временно удалить этот макрос, сделать то что надо и обратно вставить...Все верно?

Решил пойти другим путем...http://www.planetaexcel.ru/techniques/3/44/
Спрячу в сторонке вывод дат в ячейках и всё)
 
Здравствуйте! Помогите пожалуйста)

Запустил макрос в своей таблице работает замечательно но есть одно большое НО)
когда я включаю защиту листа он перестает работать и выдает ошибку
Цитата
Run time eror '1004' Application-denited or object-denited eror
При нажатии Debug выделяет вот эту строку кода  
Код
 If (f_val < Str(Date - 1)) And (Cells(f_row, f_column).FormulaLocal <> val) And (flag = True) Then

Ячейка в которой идет попытка изменения является не защищенной, а вся таблица и формулы под паролем
Спасите сижу второй день не могу понять в чем дело...
 
отключайте защиту в начале работы макроса и включайте в конце (если дело в защите)
Изменено: Ігор Гончаренко - 19.11.2017 12:11:13
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Здраствуйте! Спасибо за ответ.
Если в начале кода макроса будет снятие защиты тогда можно будет редактировать каждую ячейку таблицы(((
В принципе буквально только что нашел на что ругается код. Ему почему то не нравиться что стоит галочка  скрывать формулы
Может есть предположения ?))
 
Цитата
ant написал:
Если в начале кода макроса будет снятие защиты тогда можно будет редактировать каждую ячейку таблицы
Цитата
Ігор Гончаренко написал:
отключайте защиту в начале работы макроса и включайте в конце
 
ОК
в вертикальной строке за сегодняшнее число есть данные которые изменять нельзя
насколько я понял алгоритм
при выделении ячейки пойдет запуск макроса сниматься защита- проверка даты -поменяется значение в ячейке -и поставиться защита ?
 
Странно Вы вопрос формулируете... Если Вы в макросе напишете обратную установку защиты - она установится. Иначе нет.
 
Ок. Понял Спасибо большое Вам за ответ!
У вас очень хороший и качественный ресурс очень помогает !
 
Добрый день, форумчане!
не могли бы вы дать консультацию или есть возможность прописать код по одному вопросу:

Пытаюсь создать ежедневную сводку по персоналу от подразделении. Так называемую оперативную ежедневную сводку по различным цехам, участкам и баз. подготовил макет ежедневной сводки. попал в тупик в связи с незнаем языков программирования.  Суть проблемы:суть заключается в том что ответственный за этот отчет каждый день, например 20.01.2018 года вносит данные по присутствующим и отсутствующим на работе. а на следующий день не смог изменить внесенные вчера данные. Файл ексель будет для них доступен через общий доступ (локальная сеть), а администратор мог наглядно видеть и знать сколько человек есть на работе.

Надеюсь на вашу помощь...
 
В модуль ЭтаКнига. При открытии книги будет защищен диапазон от 1-го числа до ВЧЕРАШНЕГО. Пароль - '1234'
Код
Private Sub Workbook_Open()
Dim cl As Range
Dim iClmn&
On Error Resume Next
Application.ScreenUpdating = False
With Worksheets("ЦИТС")
    For Each cl In .Range("F22:AJ22")
        If cl.Value = Date Then
            iClmn = cl.Column - 1
            Exit For
        End If
    Next
    If iClmn < 22 Or iClmn = Empty Then Exit Sub
    .Unprotect Password:="1234"  'пароль
    .Range("F23:AJ29").Interior.Color = xlNone
    .Cells.Locked = False
    With .Range(.Cells(23, 6), .Cells(29, iClmn))
        .Locked = True
        .FormulaHidden = False
        .Interior.Color = 14540253
    End With
    .Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
        False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
        AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
        :=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
        AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
        AllowUsingPivotTables:=True, Password:="1234" 'пароль
    .EnableSelection = xlUnlockedCells
End With
Application.ScreenUpdating = True
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Sanja Спасибо большое! очень помогли! отличный сайт с профессионалами!
 
Еще вариант. В модуль листа. Из модуля ЭтаКнига удалить предыдущий макрос
Код
Dim oldValue

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    oldValue = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
For Each cl In Range("F22:AJ22")
    If cl.Value = Date Then
        iClmn = cl.Column - 1
        Exit For
    End If
Next
If iClmn < 22 Or iClmn = Empty Then Exit Sub
If Not Intersect(Target, Range(Cells(23, 6), Cells(29, iClmn))) Is Nothing Then
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    MsgBox "Редактирование 'задним числом' ЗАПРЕЩЕНО!", vbCritical
    Target.Value = oldValue
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Согласие есть продукт при полном непротивлении сторон
Страницы: 1 2 След.
Читают тему
Наверх