Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Защита ячейки при изменении текущего месяца (даты) - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Защита ячейки при изменении текущего месяца (даты)
Gold_Barsik Дата: Пятница, 29.09.2017, 15:55 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 6 ±
Замечаний: 0% ±

2003
Как защитить ячейку при наступлении очередного месяца (даты)?
Есть пустая незащищённая ячейка (P12).
Вносим данные (000020).
При наступлении очередного месяца (окт.2017) ячейка должна защититься.
К сообщению приложен файл: _Microsoft_Exce.xls (18.5 Kb)


Сообщение отредактировал Gold_Barsik - Пятница, 29.09.2017, 16:01
 
Ответить
СообщениеКак защитить ячейку при наступлении очередного месяца (даты)?
Есть пустая незащищённая ячейка (P12).
Вносим данные (000020).
При наступлении очередного месяца (окт.2017) ячейка должна защититься.

Автор - Gold_Barsik
Дата добавления - 29.09.2017 в 15:55
Perfect2You Дата: Пятница, 29.09.2017, 16:02 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Внесли данные. Через два дня изменили. От какой даты считать месяц? Это пища для размышлений.

Если сами пишете, то алгоритм примерно такой. По событию листа (изменение ячейки) на другой лист в такую же ячейку вносится дата, либо дата-время действия.
По какому-нибудь другому событию (например, открытие книги) запускается макрос, защищающий ячейки, у которых дата соответствует Вашему условию.
 
Ответить
СообщениеВнесли данные. Через два дня изменили. От какой даты считать месяц? Это пища для размышлений.

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

Автор - Perfect2You
Дата добавления - 29.09.2017 в 16:02
Gold_Barsik Дата: Пятница, 29.09.2017, 16:12 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 6 ±
Замечаний: 0% ±

2003
Внёс, изменил, изменил, но если наступил новый МЕСЯЦ в ячейке A1, ячейка защищается. Если МЕСЯЦ в ячейке A1 изменить на ранний, то ячейка становится незащищённая.
Сам писать пока не научился, потому и спрашиваю.
А далее "По событию" я ничего не понял. Можно ли поподробнее и в примере (в картинках)?


Сообщение отредактировал Gold_Barsik - Пятница, 29.09.2017, 16:20
 
Ответить
СообщениеВнёс, изменил, изменил, но если наступил новый МЕСЯЦ в ячейке A1, ячейка защищается. Если МЕСЯЦ в ячейке A1 изменить на ранний, то ячейка становится незащищённая.
Сам писать пока не научился, потому и спрашиваю.
А далее "По событию" я ничего не понял. Можно ли поподробнее и в примере (в картинках)?

Автор - Gold_Barsik
Дата добавления - 29.09.2017 в 16:12
_Boroda_ Дата: Пятница, 29.09.2017, 16:50 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 16881
Репутация: 6593 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
В модуле каждого листа вот такие макросы
[vba]
Код
Sub BlokYa()
    Dim d_ As Range
    c1_ = Cells(4, Columns.Count).End(1).Column
    c0_ = 4
    r0_ = 4
    r1_ = Cells(Rows.Count, c0_ - 1).End(3).Row
    For Each d_ In Cells(r0_, c0_).Resize(1, c1_ - c0_ + 1)
        If IsDate(d_) Then
            Cells(r0_ - 1, d_.Column).Resize(r1_ - r0_ + 2, 6).Locked = DateAdd("m", 1, d_) < Date
        End If
    Next d_
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    c1_ = Cells(4, Columns.Count).End(1).Column
    c0_ = 4
    r0_ = 4
    If Not Intersect(Target, Cells(r0_, c0_).Resize(1, c1_ - c0_ + 1)) Is Nothing Then
        BlokYa
    End If
End Sub
[/vba]
При открытии книги ячейки блокируются или разблокируются. И при изменении дат тоже. И все это для всех листов книги, где есть эти макросы

Но все это очень ненадежно

Да, защиту листа в макросе не прописявал
К сообщению приложен файл: 8932019.xls (59.5 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВ модуле каждого листа вот такие макросы
[vba]
Код
Sub BlokYa()
    Dim d_ As Range
    c1_ = Cells(4, Columns.Count).End(1).Column
    c0_ = 4
    r0_ = 4
    r1_ = Cells(Rows.Count, c0_ - 1).End(3).Row
    For Each d_ In Cells(r0_, c0_).Resize(1, c1_ - c0_ + 1)
        If IsDate(d_) Then
            Cells(r0_ - 1, d_.Column).Resize(r1_ - r0_ + 2, 6).Locked = DateAdd("m", 1, d_) < Date
        End If
    Next d_
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    c1_ = Cells(4, Columns.Count).End(1).Column
    c0_ = 4
    r0_ = 4
    If Not Intersect(Target, Cells(r0_, c0_).Resize(1, c1_ - c0_ + 1)) Is Nothing Then
        BlokYa
    End If
End Sub
[/vba]
При открытии книги ячейки блокируются или разблокируются. И при изменении дат тоже. И все это для всех листов книги, где есть эти макросы

Но все это очень ненадежно

Да, защиту листа в макросе не прописявал

Автор - _Boroda_
Дата добавления - 29.09.2017 в 16:50
Perfect2You Дата: Пятница, 29.09.2017, 19:18 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Боже, как же ненавижу я объединения ячеек. Сколько ножей в спину от них...

Но победа все же за нами.

Краткая предистория. По умолчанию - все ячейки имеют формат защищенных. Но мы этого не замечаем, пока не включена защита листа. Поэтому, если мы хотим иметь защищенными только некоторые, а остальные нет, то сначала надо снять защиту со всех, а потом пометить нужные как защищаемые.

Немножко пепла на голову. Ну извините, с картинками непривычен. Картинки сможете найти в тематических статьях.

Теперь действия. Для каждого листа создайте чистого "двойника". Его можно спрятать - он только для макросов нужен. В код самого листа (не двойника) нужно прописать махонькую программку:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Sheets(ActiveSheet.Name & "_dates").Cells(Target.Row, Target.Column).Value = Now
End Sub
[/vba]

Эта штука нужна для хранения даты изменения. Ее имя показывает EXCELю, что это обработчик события, которое возникает, когда какая-то ячейка изменяется. Имея ее в коде листа, после изменения ячейки EXCEL будет делать не только то, что в настройках имеется (сдвигать вниз на ячейку, например), но и то, что прописано в этой программке.
Каждому листу, с которым Вы хотите таким образом работать, нужно создать двойничка и добавить код листа эту программку. Я намеренно двойничка прятать не стал и вручную изменил месяц, занесенный программой, чтобы сработала защита. В получившейся версии к имени двойничков должно быть добавлено _dates

Теперь в модуль книги нужно поместить обработчик события. Я подвязал его к открытию книги. Сами смотрите - можно будет выбрать любое из имеющегося в арсенале EXCEL. Вот этот код:
[vba]
Код
Private Sub Workbook_Open()
Dim sH As Object, sP As Object, cC As Range, rN As Range
Dim acS As Object, acC As Range
Dim mOg As Double
    
Application.ScreenUpdating = False

    Set acS = ActiveSheet
    Set acC = ActiveCell
    mOg = Year(Now) + Month(Now)
    For Each sH In Worksheets
        If Right(sH.Name, 6) = "_dates" Then
            Set rN = Nothing
            Set sP = Sheets(Left(sH.Name, Len(sH.Name) - 6))
            For Each cC In sH.UsedRange
                If (cC.Value <> Empty) And (mOg > (Year(cC.Value) + Month(cC.Value))) Then
                    If sP.Cells(cC.Row, cC.Column).Locked = False Then
                        If rN Is Nothing Then
                            Set rN = sP.Cells(cC.Row, cC.Column).MergeArea
                        Else
                            Set rN = Union(rN, sP.Cells(cC.Row, cC.Column).MergeArea)
                        End If
                    End If
                End If
            Next cC
            If Not rN Is Nothing Then
                
                sP.Unprotect Password:="321"
                sP.Cells.Locked = False
                rN.Locked = True
                sP.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                    AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                    AllowFormattingRows:=True, AllowFiltering:=True, Password:="321"
            End If
        End If
    Next sH
    acS.Select
    acC.Select
Application.ScreenUpdating = True
End Sub
[/vba]

Голову сломал, почему не давалась защита. А, оказывается, нельзя защищать отдельную ячейку, являющуюся частью объединенной - только все вместе.

Программа написана для обработки всех двойников. В ней нет "Защиты от дурака". Если двойнику не найдется соответствующий лист, скорее всего выполнение прервется по ошибке. Пароль на открытие листа везде - 321

Знал бы, сколько времени уйдет - не стал бы, наверно...
Но... Что сделано, то сделано.
К сообщению приложен файл: -Microsoft_Exce.xlsm (31.1 Kb)


Сообщение отредактировал Perfect2You - Пятница, 29.09.2017, 19:28
 
Ответить
СообщениеБоже, как же ненавижу я объединения ячеек. Сколько ножей в спину от них...

Но победа все же за нами.

Краткая предистория. По умолчанию - все ячейки имеют формат защищенных. Но мы этого не замечаем, пока не включена защита листа. Поэтому, если мы хотим иметь защищенными только некоторые, а остальные нет, то сначала надо снять защиту со всех, а потом пометить нужные как защищаемые.

Немножко пепла на голову. Ну извините, с картинками непривычен. Картинки сможете найти в тематических статьях.

Теперь действия. Для каждого листа создайте чистого "двойника". Его можно спрятать - он только для макросов нужен. В код самого листа (не двойника) нужно прописать махонькую программку:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Sheets(ActiveSheet.Name & "_dates").Cells(Target.Row, Target.Column).Value = Now
End Sub
[/vba]

Эта штука нужна для хранения даты изменения. Ее имя показывает EXCELю, что это обработчик события, которое возникает, когда какая-то ячейка изменяется. Имея ее в коде листа, после изменения ячейки EXCEL будет делать не только то, что в настройках имеется (сдвигать вниз на ячейку, например), но и то, что прописано в этой программке.
Каждому листу, с которым Вы хотите таким образом работать, нужно создать двойничка и добавить код листа эту программку. Я намеренно двойничка прятать не стал и вручную изменил месяц, занесенный программой, чтобы сработала защита. В получившейся версии к имени двойничков должно быть добавлено _dates

Теперь в модуль книги нужно поместить обработчик события. Я подвязал его к открытию книги. Сами смотрите - можно будет выбрать любое из имеющегося в арсенале EXCEL. Вот этот код:
[vba]
Код
Private Sub Workbook_Open()
Dim sH As Object, sP As Object, cC As Range, rN As Range
Dim acS As Object, acC As Range
Dim mOg As Double
    
Application.ScreenUpdating = False

    Set acS = ActiveSheet
    Set acC = ActiveCell
    mOg = Year(Now) + Month(Now)
    For Each sH In Worksheets
        If Right(sH.Name, 6) = "_dates" Then
            Set rN = Nothing
            Set sP = Sheets(Left(sH.Name, Len(sH.Name) - 6))
            For Each cC In sH.UsedRange
                If (cC.Value <> Empty) And (mOg > (Year(cC.Value) + Month(cC.Value))) Then
                    If sP.Cells(cC.Row, cC.Column).Locked = False Then
                        If rN Is Nothing Then
                            Set rN = sP.Cells(cC.Row, cC.Column).MergeArea
                        Else
                            Set rN = Union(rN, sP.Cells(cC.Row, cC.Column).MergeArea)
                        End If
                    End If
                End If
            Next cC
            If Not rN Is Nothing Then
                
                sP.Unprotect Password:="321"
                sP.Cells.Locked = False
                rN.Locked = True
                sP.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
                    AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                    AllowFormattingRows:=True, AllowFiltering:=True, Password:="321"
            End If
        End If
    Next sH
    acS.Select
    acC.Select
Application.ScreenUpdating = True
End Sub
[/vba]

Голову сломал, почему не давалась защита. А, оказывается, нельзя защищать отдельную ячейку, являющуюся частью объединенной - только все вместе.

Программа написана для обработки всех двойников. В ней нет "Защиты от дурака". Если двойнику не найдется соответствующий лист, скорее всего выполнение прервется по ошибке. Пароль на открытие листа везде - 321

Знал бы, сколько времени уйдет - не стал бы, наверно...
Но... Что сделано, то сделано.

Автор - Perfect2You
Дата добавления - 29.09.2017 в 19:18
Gold_Barsik Дата: Пятница, 29.09.2017, 19:55 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 459
Репутация: 6 ±
Замечаний: 0% ±

2003
Perfect2You, ОГРОМНОЕ СПАСИБО, теперь надо как-то всё вышеописанное переварить.
 
Ответить
СообщениеPerfect2You, ОГРОМНОЕ СПАСИБО, теперь надо как-то всё вышеописанное переварить.

Автор - Gold_Barsik
Дата добавления - 29.09.2017 в 19:55
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!