Страницы: 1
RSS
Не работает фильтр на защищенном листе
 
Защиту включаю таким образом, книга с общим доступом.
Код
Sheets("ПАРАМЕТРЫ").Protect Password:=1234, UserInterfaceOnly:=True, _
        DrawingObjects:=True, Contents:=True, Scenarios:=True, _
        AllowFiltering:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, _
        AllowSorting:=True

После включения защиты кнопка автофильтра даже не нажимается
 
Dex, изучите все параметры защиты, в частности, AllowFiltering.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Здесь нюанс: AllowFiltering разрешает работу с уже установленными фильтрами. Но не разрешает устанавливать или удалять фильтр. Т.е. сначала надо установить фильтр, потом установить защиту. Пользователь сможет фильтровать данные, но не сможет удалить фильтр или изменить диапазон для фильтра.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
Т.е. сначала надо установить фильтр, потом установить защиту. Пользователь сможет фильтровать данные, но не сможет удалить фильтр или изменить диапазон для фильтра.
Что то я не совсем понял. Что мне сделать то нужно? Убрать этот параметр? Убрать защиту? Убрать автофильтр?

В этой же книге у меня работает макрос, может с ним связанно?

Взято из темы Суперфильтр на VBA
После установки защиты макрос тоже не работает

Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("Условие")) Is Nothing Then Exit Sub
    Dim FilterCol As Integer
    Dim FilterRange As Range
    Dim CondtitionString As Variant
    Dim Condition1 As String, Condition2 As String
  
    On Error Resume Next
    Application.ScreenUpdating = False
     
    'определяем диапазон данных списка
    Set FilterRange = Target.Parent.AutoFilter.Range
     
    'считываем условия из всех измененных ячеек диапазона условий
    For Each cell In Target.Cells
        FilterCol = cell.Column - FilterRange.Columns(1).Column + 1
         
        If IsEmpty(cell) Then
            Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol
        Else
            If InStr(1, UCase(cell.Value), " ИЛИ ") > 0 Then
                LogicOperator = xlOr
                ConditionArray = Split(UCase(cell.Value), " ИЛИ ")
            Else
                If InStr(1, UCase(cell.Value), " И ") > 0 Then
                    LogicOperator = xlAnd
                    ConditionArray = Split(UCase(cell.Value), " И ")
                Else
                    ConditionArray = Array(cell.Text)
                End If
            End If
            'формируем первое условие
            If Left(ConditionArray(0), 1) = "<" Or Left(ConditionArray(0), 1) = ">" Then
                Condition1 = ConditionArray(0)
            Else
                Condition1 = "=" & ConditionArray(0)
            End If
            'формируем второе условие - если оно есть
            If UBound(ConditionArray) = 1 Then
                If Left(ConditionArray(1), 1) = "<" Or Left(ConditionArray(1), 1) = ">" Then
                    Condition2 = ConditionArray(1)
                Else
                    Condition2 = "=" & ConditionArray(1)
                End If
            End If
            'включаем фильтрацию
            If UBound(ConditionArray) = 0 Then
                Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1
            Else
                Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1, _
                    Operator:=LogicOperator, Criteria2:=Condition2
            End If
        End If
    Next cell
     
    Set FilterRange = Nothing
    Application.ScreenUpdating = True
End Sub
Кстати этот код работает только без общего доступа, в чем тоже не могу разобраться... Точнее он работает как то периодами... Не могу понять в чем проблема...
Изменено: Dex - 27.11.2015 18:09:26
 
Он не работает, когда я ставлю защиту листа!
 
Проще в самом начале кода снимать защиту, а в конец ставить.
Код выше использует AutoFilter, который не может быть использован при защите листа.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал: Проще в самом начале кода снимать защиту, а в конец ставить.
А в моем коде где его поставить? Между этих строк?
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("Условие")) Is Nothing Then Exit Sub
Страницы: 1
Читают тему
Наверх