VBA - защищает лист excel от удаления [дубликат]

Если я разрешу raw_input, то это не Josh или что-нибудь еще. Это переменная, я думаю, но я не понимаю ее бросок: - (

Функция raw_input запрашивает ввод и возвращает это как строку. Это, безусловно, сработало для меня. не нужен простой. Просто откройте «подсказку DOS» и запустите программу.

Это то, на что мне было похоже:

C:\temp>type test.py
print "Halt!"
s = raw_input("Who Goes there? ")
print "You may pass,", s

C:\temp>python test.py
Halt!
Who Goes there? Magnus
You may pass, Magnus

Я набираю свое имя и нажал [Enter] после того, как программа напечатала «Кто идет туда?»

5
задан Community 9 July 2018 в 19:34
поделиться

5 ответов

Насколько я могу судить, невозможно изначально пометить один лист как не подлежащий удалению; и нет события, которое может быть использовано для обнаружения, когда лист собирается быть удален, чтобы книга могла быть защищена превентивно.

Однако, вот один из возможных способов:

  1. Защитить структуру рабочей книги: это, как вы укажете, предотвратит удаление всех листов.
  2. Создайте лист «Элементы управления». На этом листе поддерживайте список всех имен листов (кроме тех, которые вы не хотите удалять).
  3. Если пользователи хотят удалить лист, они должны будут выбрать его имя на листе «Элементы управления» (например, в раскрывающемся меню проверки данных) и нажмите кнопку «Удалить». Эта кнопка вызывает макрос, который временно защищает рабочую книгу, удаляет выбранный лист и затем воспроизводит книгу.

Конечно, пользователям придется привыкнуть к этому способу удаления листов (а не просто щелкнуть правой кнопкой мыши> Удалить на вкладке листа). Тем не менее, это не сумасшествие сложно.

Что касается того, как достичь # 2, т. е. поддерживать этот список имен листов, я полагаю, вы могли бы использовать UDF, подобный этому (его нужно вызывать как формулу массива):

Function DeletableSheetNames() As String()
    Application.Volatile
    Dim i As Long
    Dim sn() As String
    With ThisWorkbook
        ReDim sn(1 To .Sheets.Count)
        For i = 1 To .Sheets.Count
            With .Sheets(i)
                If .Name = "DataEntry1" Or .Name = "DataEntry2" Then
                    'Don't include it in the list.
                Else
                    sn(i) = .Name
                End If
            End With
        Next i
    End With
    DeletableSheetNames = sn
End Function
6
ответ дан Jean-François Corbett 17 August 2018 в 08:46
поделиться

Вы не можете запретить пользователям удалять определенный лист, но вы можете использовать событие Workbook_BeforeSave(), чтобы предотвратить сохранение книги, если отсутствует конкретный лист. Документация по этому событию точно показывает, как разрешить экономию рабочей книги только при выполнении определенных условий. См. http://msdn.microsoft.com/en-us/library/office/ff840057 (v = office.14) .aspx

2
ответ дан jemenfou 17 August 2018 в 08:46
поделиться
  • 1
    Это хороший вопрос. Как только вы начнете разработку VBA рано или поздно вы столкнетесь с проблемой удержания на нескольких листах, позволяя пользователю играть вместе с остальными, даже добавьте новые. К сожалению, ответ отрицательный, нет чистого решения. С этой точки зрения обе обходные пути здесь имеют недели. – jemenfou 14 May 2014 в 09:39

Я могу предотвратить удаление листа через событие Worksheet_BeforeDelete следующим образом:

Private Sub Worksheet_BeforeDelete()

    Call ThisWorkbook.Protect("password")

    Call MsgBox("This sheet cannot be deleted.", vbExclamation)

End Sub

Это защищает все листы от удаления, однако, если вы добавите код события в модуль ThisWorkbook, как показано ниже :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

    Call ThisWorkbook.Unprotect("password")

End Sub

Затем я смогу удалить любой другой лист, как только он будет выбран.

Помните, что вы потеряете функцию копирования и вставки между страницами из-за разблокировка страницы, когда она выбрана.

2
ответ дан Knickerless-Noggins 17 August 2018 в 08:46
поделиться

Я нашел это решение, похожее на Dan's, на ExtendOffice.com. Поместите этот код в модуль Worksheet:

Private Sub Worksheet_Activate()
ThisWorkbook.Protect "yourpassword"
End Sub

Private Sub Worksheet_Deactivate()
ThisWorkbook.Unprotect "yourpassword"
End Sub

Когда вы активируете лист, о котором идет речь, вся рабочая книга защищена, а опция «Удалить» недоступна. Когда вы переключаетесь на любой другой лист, рабочая книга снова бесплатна. Это тонко, потому что вы только замечаете изменение, когда идете на «безопасный» лист.

0
ответ дан Shawn V. Wilson 17 August 2018 в 08:46
поделиться
0
ответ дан Travis Banger 17 August 2018 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: