2016-06-21 3 views
-1

У меня есть документ, который функционирует (используя многие уже написанные и функционирующие макросы), чтобы по существу стоять в качестве визуального представления календаря, который затем можно экспортировать на графический объект PowerPoint. Из-за того, как этот процесс ведется, важно, чтобы между каждой строкой данных сохранялись пустые строки. Я написал свои собственные функции сортировки и фильтрации, чтобы сохранить это условие, предоставляя пользователю надлежащую функциональность, и теперь я работаю над защитой документов.Предотвратить использование пользователем функций встроенной сортировки Excel

Таким образом, основной вопрос, который у меня есть (хотя это может быть распространен в целом на все действия в листе), является то, можно ли ограничить пользователей от использования функций сортировки по умолчанию от excel (так как это немедленно уничтожило бы структура данных)?

Чтобы уточнить, лист уже имеет защиты и снятие защиты функциональности, но мне нужно AllowSorting свойства оставаться ложными даже когда лист не защищен. Это возможно?

Edit:
Я попытался решить эту проблему, не снятие защиты листов, но вместо того, чтобы защищать их все защиты «выключено» за исключением свойств AllowSorting и AllowFiltering, которые остаются ложны в обеих отпираются и запираются конфигурация , Тем не менее, это все еще позволяло сортировать данные, когда листы были «разблокированы»

Редактирование 2: Поскольку необходимо дальнейшее объяснение, у меня уже есть макросы, которые защищают и снимают защиту с листа соответственно. Мне нужно предоставить FULL функциональность любому пользователю, у которого есть правильный пароль, , за исключением сортировки, так как никто не должен использовать функции сортировки. Мой код для этих функций показан (сокращенно) ниже:

Sub LockSheets() 

For Each WS In ActiveWorkbook.Worksheets 
     WS.Protect Password:=MasterPass, _ 
       DrawingObjects:=True, _ 
       Contents:=True, _ 
       Scenarios:=True, _ 
       AllowFormattingCells:=False, _ 
       AllowFormattingColumns:=False, _ 
       AllowFormattingRows:=False, _ 
       AllowInsertingColumns:=False, _ 
       AllowInsertingRows:=False, _ 
       AllowInsertingHyperlinks:=False, _ 
       AllowDeletingColumns:=False, _ 
       AllowDeletingRows:=False, _ 
       AllowSorting:=False, _ 
       AllowFiltering:=False, _ 
       AllowUsingPivotTables:=False 
     Next WS 
End Sub 



Sub UnlockSheets() 

For Each WS In ActiveWorkbook.Worksheets 
      WS.Protect Password:=MasterPass, _ 
       DrawingObjects:=False, _ 
       Contents:=False, _ 
       Scenarios:=False, _ 
       AllowFormattingCells:=True, _ 
       AllowFormattingColumns:=True, _ 
       AllowFormattingRows:=True, _ 
       AllowInsertingColumns:=True, _ 
       AllowInsertingRows:=True, _ 
       AllowInsertingHyperlinks:=True, _ 
       AllowDeletingColumns:=True, _ 
       AllowDeletingRows:=True, _ 
       AllowSorting:=False, _ 
       AllowFiltering:=False, _ 
       AllowUsingPivotTables:=False 
     Next WS 

End Sub 
+0

Это просто функция сортировки, которую вы не хотите использовать пользователям или не позволяете им что-либо менять на этом листе? –

+0

@Tom В частности, функция сортировки, хотя я бы хотела, чтобы удовлетворить мою любознательность, узнать, как отключить любые встроенные функции. Я построил в мягких ценных бумагах, чтобы гарантировать, что только пользователи с паролем (с указанием того, что они были обучены использованию документа) могут выполнять любые процедуры редактирования, но я хочу избежать случайного использования функции сортировки, пока документ доступен для редактирования – RGA

+0

Вы можете посмотреть на это: http://stackoverflow.com/questions/28979396/excel-vba-filter-change-event-handler или это http://stackoverflow.com/questions/1362342/how-to -detect-if-filters-changed-on-a-sheet и для отключения всех изменений вы всегда можете «Защитить» свой рабочий лист, щелкнув правой кнопкой мыши на своем листе и отметьте «Защитить лист ...» :) –

ответ

0

Если вы просто хотите работать безопасности для случайного неправильного, что происходит в книге совместно с другими, это должно работать в случае Worksheet_Activate

Private Sub Worksheet_Activate() 
Dim WhoCanSort As String 
    WhoCanSort = ThisWorkbook.WriteReservedBy 
    If WhoCanSort = "skkakkar" Then 
    ActiveSheet.Unprotect 
    Else: 
    ActiveSheet.Protect AllowSorting:=False 
    End If 
End Sub 

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

Lock or unlock specific areas of a protected worksheet Я думаю, что, следуя этот метод вы можете запретить пользователь использовать любые команды для сортировки данных (вкладку Data, Сортировка & Фильтра группы) .Users не может сортировать диапазоны, которые содержат заблокированные ячейки на защищенный листе , независимо от этой настройки.

+0

Все еще не решает мою проблему, но ближе к ней. По сути, мне нужно, чтобы 'AllowSorting' оставался ложным, даже когда лист Unprotected_. Это возможно? – RGA

+0

Может быть, я перевернул функциональность, а не «снял защиту» листа (т. Е. Сохранил лист, но удалил все защищенные аспекты, кроме функции сортировки?) – RGA

+0

Я не знаю, работает ли это, но, возможно, вы можете установить все эти свойства верны, установите AllowEditRanges в диапазон ваших данных и установите AllowSorting равным False. https://msdn.microsoft.com/en-en/library/office/ff839026.aspx –

0

Хорошо, вот оно. Я положил это на Workbook_open -event, как я думаю, это лучшее место.

Private Sub Workbook_open() 
ActiveSheet.Protect _ 
       AllowDeletingColumns:=True, _ 
       AllowDeletingRows:=True, _ 
       AllowFormattingCells:=True, _ 
       AllowFormattingRows:=True, _ 
       AllowFormattingColumns:=True, _ 
       AllowInsertingHyperlinks:=True, _ 
       AllowInsertingRows:=True, _ 
       AllowUsingPivotTables:=True, _ 
       AllowSorting:=False, _ 
       AllowFiltering:=False 

ActiveSheet.Protection.AllowEditRanges.Add _ 
       Title:="yourtitle", _ 
       Range:=Range("yourrange") 

End Sub 

Это позволяет все, кроме сортировки. Все остальные свойства перечислены here

+0

К сожалению (как поясняется в редакции к моему оригинальному сообщению), это не работает и по-прежнему позволяет сортировать. Я честно понятия не имею, почему это так. – RGA

+0

Определенно работает на моем конце. Я редактировал сообщение, может быть, вы что-то пропустили? –

+0

Я уверен, что ничего не пропустил. Я уже сам написал этот код и попытался это сделать. Когда это не сработало, я скопировал ваши файлы, и это все равно не мешает сортировке. – RGA

1

В вашем коде разблокировки есть две проблемы, как указано в вашем исходном сообщении.

Contents:=False 

переопределит защиту листа, и поэтому рабочий лист остается незащищенным после запуска макроса.

AllowDelectingRows:=True 

должен был дан Compile error: Named argument not found. в связи с опечаткой: AllowDele**c**ting Rows я не понимаю, почему это не в вашей системе.

Вот измененный код:

==================================== ====

Option Explicit 
Sub UnlockSheets() 
Dim WS As Worksheet 
For Each WS In ActiveWorkbook.Worksheets 
      WS.Protect Password:=MasterPass, _ 
       DrawingObjects:=False, _ 
       Contents:=True, _ 
       Scenarios:=False, _ 
       AllowFormattingCells:=True, _ 
       AllowFormattingColumns:=True, _ 
       AllowFormattingRows:=True, _ 
       AllowInsertingColumns:=True, _ 
       AllowInsertingRows:=True, _ 
       AllowInsertingHyperlinks:=True, _ 
       AllowDeletingColumns:=True, _ 
       AllowDeletingRows:=True, _ 
       AllowSorting:=False, _ 
       AllowFiltering:=False, _ 
       AllowUsingPivotTables:=False 
     Next WS 

End Sub 

======================================= =

+0

Да, жаль насчет опечатки. Я исправил его в своем коде и забыл исправить его в сообщении. Тем не менее, я уже пытался изменить «Содержание» на «Истина», но когда я это делаю, я теряю больше функциональности, чем просто сортировку (т. Е. Опции «Строки строк и столбцов» выделяются на ленте). Невероятно расстраивающ – RGA

+0

Я также теряю Слияние функциональности, которая необходима для документа. Я начинаю думать, что могу просто согласиться с тем, что я не могу отключить этот вид и не молюсь, чтобы никто его не использовал – RGA

+0

@RGA Если вы измените свой 'AllowEditRanges', чтобы включить весь рабочий лист' = $ 1: $ 1048576', вы будете способный вставлять строки или столбцы (но не ячейки) –

Смежные вопросы